はじめに
DelphiのVCLコンポーネントListViewには編集機能がありません。
そこで編集機能を実装したTListViewEditを制作しました。
TListViewEdit
は TListViewEx
をベースに、セル単位の編集機能を追加した Delphi 向け拡張コンポーネントです。
実行結果
✨ 特徴
-
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をさらに使いこなす方法を説明します。
実行結果
通常モード
編集モード
このように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 ライセンス