use*_*348 2 delphi listview object listitem delphi-xe2
在ListView中,如何将对象随时附加到已存在的ListItem?(我知道我可以将一个对象附加到ListItem AddItem,但是我需要在创建ListItem之后附加该对象).
您可以通过TListItem.Data酒店进入.例如:
var
ListItem: TListItem;
begin
ListView1.AddItem('Item 1', nil);
...
ListItem := ListView1.Items[0];
ListItem.Data := Edit1;
TEdit(ListItem.Data).Text := 'Updated text...';
end;
Run Code Online (Sandbox Code Playgroud)
你可以使用Data属性来解决这个问题TListItem.这通常是一种快速简便的方法.唯一的轻微问题是,如果您需要列表项来管理其关联数据的生命周期.在这种情况下,您必须实现一个OnDeletion事件处理程序,以在销毁节点时完成关联数据.
另一种方法是使用的子类TListItem.首先定义你的子类:
type
TMyListItem = class(TListItem)
private
FDateTime: TDateTime;
public
property DateTime: TDateTime read FDateTime write FDateTime;
end;
Run Code Online (Sandbox Code Playgroud)
然后为列表视图的OnCreateNodeClass事件实现一个处理程序.这确定了列表视图实例化的列表项的实际类.
procedure TForm1.ListView1CreateItemClass(Sender: TCustomListView;
var ItemClass: TListItemClass);
begin
ItemClass := TMyListItem;
end;
Run Code Online (Sandbox Code Playgroud)
现在列表视图将创建类的项目TMyListItem.
因此,您可以像访问DateTime任何其他属性一样访问列表项的属性.当然,这种方法可以扩展到存储更多信息.
唯一要做的是,列表视图控件仍然会为您提供编译时输入的项目TListItem.所以你需要进行上传.
例如,假设您想在编辑项目时执行某些操作.事件处理程序如下所示:
procedure ListView1Edited(Sender: TObject; Item: TListItem; var S: string);
Run Code Online (Sandbox Code Playgroud)
请注意,该项目是作为类型传递的TListItem.所以你需要像这样写:
procedure TForm1.ListView1Edited(Sender: TObject; Item: TListItem;
var S: string);
var
MyItem: TMyListItem;
begin
MyItem := Item as TMyListItem;
if MyItem.DateTime ....
end;
Run Code Online (Sandbox Code Playgroud)