2

ListViewで、既存のListItemにいつでもオブジェクトをアタッチするにはどうすればよいですか?(オブジェクトをListItemにアタッチできることはわかっていAddItemますが、ListItemの作成後にオブジェクトをアタッチする必要があります)。

4

2 に答える 2

6

You can access it through the TListItem.Data property. For example:

var
  ListItem: TListItem;
begin
  ListView1.AddItem('Item 1', nil);
  ...
  ListItem := ListView1.Items[0];
  ListItem.Data := Edit1;
  TEdit(ListItem.Data).Text := 'Updated text...';
end;
于 2013-02-17T16:36:31.360 に答える
5

Dataのプロパティを使用してこれを解決できますTListItem。多くの場合、これは迅速で簡単なアプローチです。わずかな問題は、関連データの有効期間を管理するためにリストアイテムが必要な場合です。OnDeletionその場合、ノードが破棄されたときに関連データをファイナライズするためにイベントハンドラーを実装する必要があります。

別のアプローチは、のサブクラスを使用することですTListItem。まず、サブクラスを定義します。

type
  TMyListItem = class(TListItem)
  private
    FDateTime: TDateTime;
  public
    property DateTime: TDateTime read FDateTime write FDateTime;
  end;

次に、リストビューのOnCreateNodeClassイベントのハンドラーを実装します。これにより、リストビューがインスタンス化するリストアイテムの実際のクラスが決まります。

procedure TForm1.ListView1CreateItemClass(Sender: TCustomListView; 
  var ItemClass: TListItemClass);
begin
  ItemClass := TMyListItem;
end;

これで、リストビューにクラスのアイテムが作成されますTMyListItem

したがって、他のプロパティと同じように、リストアイテムのDateTimeプロパティに簡単にアクセスできます。もちろん、このアプローチを拡張して、より多くの情報を保存することもできます。

その他の唯一のポイントは、リストビューコントロールは、コンパイル時に.として入力されたアイテムを引き続き提供することですTListItem。したがって、アップキャストする必要があります。

たとえば、アイテムが編集されたときに何かをしたいとします。イベントハンドラは次のようになります。

procedure ListView1Edited(Sender: TObject; Item: TListItem; var S: string);

アイテムはタイプとして渡されることに注意してくださいTListItem。したがって、次のように記述する必要があります。

procedure TForm1.ListView1Edited(Sender: TObject; Item: TListItem; 
  var S: string);
var
  MyItem: TMyListItem;
begin
  MyItem := Item as TMyListItem;
  if MyItem.DateTime ....
end;
于 2013-02-17T17:41:55.430 に答える