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