1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

ListViewに編集機能を実装したクラス"TListViewEdit"を紹介

Posted at

はじめに

DelphiのVCLコンポーネントListViewには編集機能がありません。
そこで編集機能を実装したTListViewEditを制作しました。

TListViewEditTListViewEx をベースに、セル単位の編集機能を追加した Delphi 向け拡張コンポーネントです。

実行結果

image.png


✨ 特徴

  • Caption および SubItemsセル編集可能(スプレッドシート風)
  • 編集は内部の TEdit コンポーネントで自動処理
  • 編集開始/確定/キャンセルなどのフック可能(上級編で紹介予定)
  • 最小構成でも動作確認可能なサンプル付き

使用方法

GitHubよりListViewExおよびListViewEdirxxx.pas を取得します。
usesに追加するユニットは1ファイルだけですがほとんどのユニットを必要とします。

uses ListViewEdit // 追加

🧪 最小サンプル(初心者向け)

uses に追加

unit MainListViewEdit;

interface

uses
  Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
  Vcl.Controls, Vcl.Forms, Vcl.Dialogs,Vcl.StdCtrls, Vcl.ExtCtrls,ListViewEdit;

type
  TFormMain = class(TForm)
    procedure FormCreate(Sender: TObject);
    procedure FormDestroy(Sender: TObject);
    procedure FormShow(Sender: TObject);
  private
    { Private 宣言 }
    FListView : TListViewEdit;
  public
    { Public 宣言 }
  end;

var
  FormMain: TFormMain;

implementation

uses Vcl.ComCtrls,CommCtrl ;

{$R *.dfm}

procedure TFormMain.FormCreate(Sender: TObject);
begin
  FListView := TListViewEdit.Create(Self);
  FListView.Parent := Self;
  FListView.Align := alClient;
  FListView.ViewStyle := vsReport;
  FListView.RowSelect := true;
end;

procedure TFormMain.FormDestroy(Sender: TObject);
begin
  FListView.Free;
end;

procedure TFormMain.FormShow(Sender: TObject);
var
  Column : TListColumn;
  Item : TListItem;
  i : Integer;
begin
  FListView.Columns.Clear;
  Column :=  FListView.Columns.Add;
  Column.Caption := '列1';
  Column.Width := 80;
  Column :=  FListView.Columns.Add;
  Column.Caption := '列2';
  Column.Width := 80;
  FListView.ColumnAlign(1);
  for i := 0 to 15 do begin
    Item := FListView.Items.Add;
    Item.Caption := '行'+IntToStr(i+1);
    Item.SubItems.Add('データ'+IntToStr(i+1));
  end;

end;

end.

  • 実行後、リスト項目をダブルクリックすれば、すぐに編集が始まります。
  • 編集後に Enter で確定、Esc でキャンセル、フォーカスを外しても自動確定します。

TListViewEditをさらに使いこなす

次にTListViewEditをさらに使いこなす方法を説明します。

実行結果

通常モード

image.png

編集モード

image.png

このようにListViewEditは単なるTEditによる編集以外の方法も扱えます

設定方法

 property Settings[Index : Integer] : TListViewRTTIItem read GetSettings;
 property FixedStyle: TListViewEditFixedStyle read FFixedStyle write SetFixedStyle;

FixedStyleに初期値fsEditOnly以外の値にします
Settings[Index]プロパティを通じて設定を行います

FixedStyleは
fsEditOnly, // ① 編集のみ(リスト扱いなし)
fsVertical, // ② 縦リスト(ListView標準)
fsHorizontal, // ③ 横リスト(表計算的な横移動)
fsVerticalFixedColumn // ④ 縦リスト+固定列(1列目を固定)
となっています

例ではfsVerticalFixedColumnを選んだので1列目が固定行風となっています

Settingsには

プロパティ 意味
EditType 編集方法
Strings ComboBoxなどで使用する編集候補リスト

などの設定要素があり
EditTypeに数値を入れることで編集方法を変更出来ます
ただしこの値は定数では無い可変の値です。

変数名 編集方法
ListViewEditPluginHideId 非表示用の設定※この下位クラスにて使用
ListViewEditPluginReadOnlyId 表示のみで編集は無効
ListViewEditPluginEditId TEditによる編集※デフォルト
ListViewEditPluginBoolId 0と1の値を真偽値としてComboBoxで編集
ListViewEditPluginComboBoxId インデックス値としてComboBoxで編集
ListViewEditPluginComboBoxObjectId オブジェクト値としてComboBoxで編集

これはプラグインを利用しているためです。
ここで紹介した拡張編集機能を使用する場合、usesに追加して、そのユニット内のプラグインIDの変数を代入することでそのプラグインが利用可能になります。

unit MainListViewEditPro;

interface

uses
  Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
  Vcl.Controls, Vcl.Forms, Vcl.Dialogs,Vcl.StdCtrls, Vcl.ExtCtrls,ListViewEdit;

type
  TFormMain = class(TForm)
    Panel1: TPanel;
    ListBox1: TListBox;
    procedure FormCreate(Sender: TObject);
    procedure FormDestroy(Sender: TObject);
    procedure FormShow(Sender: TObject);
    procedure ListBox1Click(Sender: TObject);
  private
    { Private 宣言 }
    FListView : TListViewEdit;
    procedure ShowListBox();
    procedure ShowData(const Mode : Integer);
  public
    { Public 宣言 }
  end;

var
  FormMain: TFormMain;

implementation

uses Vcl.ComCtrls,CommCtrl,ListViewEditPluginLib;

{$R *.dfm}

procedure TFormMain.FormCreate(Sender: TObject);
begin
  FListView := TListViewEdit.Create(Self);
  FListView.Parent := Self;
  FListView.Align := alClient;
  FListView.ViewStyle := vsReport;
  FListView.RowSelect := true;

  FListView.FixedStyle := fsVerticalFixedColumn;
end;

procedure TFormMain.FormDestroy(Sender: TObject);
begin
  FListView.Free;
end;

procedure TFormMain.FormShow(Sender: TObject);
begin
  ShowData(1);
  ShowListBox();
end;

procedure TFormMain.ListBox1Click(Sender: TObject);
var
  i : Integer;
begin
  i := ListBox1.ItemIndex;
  if i = -1 then exit;

  FListView.FixedStyle := TListViewEditFixedStyle(i);
  ShowData(i);
end;

procedure TFormMain.ShowData(const Mode: Integer);
var
  Column : TListColumn;
  Item : TListItem;
  i : Integer;
begin
  FListView.Columns.Clear;
  FListView.Items.Clear;
  if Mode <> 2 then begin
    Column :=  FListView.Columns.Add;
    Column.Caption := '名称';
    Column.Width := 80;
    Column :=  FListView.Columns.Add;
    Column.Caption := '値';
    Column.Width := 80;
    FListView.ColumnAlign(1);

    Item := FListView.Items.Add;
    Item.Caption := 'Default';
    Item.SubItems.Add('初期値のデータ');

    Item := FListView.Items.Add;
    Item.Caption := 'ReadOnly';
    Item.SubItems.Add('表示専用のデータ');

    Item := FListView.Items.Add;
    Item.Caption := 'Bool';
    Item.SubItems.Add('1');

    Item := FListView.Items.Add;
    Item.Caption := 'Bool2';
    Item.SubItems.Add('1');

    Item := FListView.Items.Add;
    Item.Caption := 'Combo';
    Item.SubItems.Add('1');

    Item := FListView.Items.Add;
    Item.Caption := 'ComboObj';
    Item.SubItems.Add('4');

  end
  else begin
    Column :=  FListView.Columns.Add;
    Column.Caption := 'Default';
    Column.Width := 80;
    Column :=  FListView.Columns.Add;
    Column.Caption := 'ReadOnly';
    Column.Width := 80;
    Column :=  FListView.Columns.Add;
    Column.Caption := 'Bool';
    Column.Width := 80;
    Column :=  FListView.Columns.Add;
    Column.Caption := 'Bool2';
    Column.Width := 80;
    Column :=  FListView.Columns.Add;
    Column.Caption := 'Combo';
    Column.Width := 80;
    Column :=  FListView.Columns.Add;
    Column.Caption := 'ComboObj';
    Column.Width := 80;

    Item := FListView.Items.Add;
    Item.Caption := '初期値のデータ';
    Item.SubItems.Add('表示専用のデータ');
    Item.SubItems.Add('1');
    Item.SubItems.Add('1');
    Item.SubItems.Add('1');
    Item.SubItems.Add('4');
  end;

  // 編集タイプとして表示専用を指定
  FListView.Settings[1].EditType := ListViewEditPluginReadOnlyId;

  // 編集タイプとして真偽型を指定
  FListView.Settings[2].EditType := ListViewEditPluginBoolId;

  // 編集タイプとして真偽型を指定
  FListView.Settings[3].EditType := ListViewEditPluginBoolId;
  // ComboBoxの選択肢を指定
  FListView.Settings[3].Strings.Clear;
  FListView.Settings[3].Strings.Add('いいえ');
  FListView.Settings[3].Strings.Add('はい');

  // 編集タイプとしてComboBoxを指定
  FListView.Settings[4].EditType := ListViewEditPluginComboBoxId;
  // ComboBoxの選択肢を指定
  FListView.Settings[4].Strings.Clear;
  FListView.Settings[4].Strings.Add('ない');
  FListView.Settings[4].Strings.Add('普通');
  FListView.Settings[4].Strings.Add('多い');

  // 編集タイプとしてComboBoxを指定  使用する値は AddObjectの値
  FListView.Settings[5].EditType := ListViewEditPluginComboBoxObjectId;
  // ComboBoxの選択肢を指定
  FListView.Settings[5].Strings.Clear;
  FListView.Settings[5].Strings.AddObject('1x1',Pointer(1));
  FListView.Settings[5].Strings.AddObject('2x2',Pointer(4));
  FListView.Settings[5].Strings.AddObject('3x3',Pointer(9));
end;

procedure TFormMain.ShowListBox;
begin
  ListBox1.Clear;
  ListBox1.Items.Add('fsEditOnly');
  ListBox1.Items.Add('fsVertical');
  ListBox1.Items.Add('fsHorizontal');
  ListBox1.Items.Add('fsVerticalFixedColumn');
  ListBox1.ItemIndex := 3;
end;

end.

📝 ライセンス

MIT ライセンス

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?