在 ListView 中,如何随时将对象附加到已经存在的 ListItem?(我知道我可以使用 将对象附加到 ListItem AddItem
,但是我需要在创建 ListItem 后附加对象)。
问问题
3321 次
2 回答
6
您可以通过该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;
于 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;
现在列表视图将创建 class 的项目TMyListItem
。
因此,您可以像访问任何其他属性一样简单地访问列表项的DateTime
属性。当然,这种方法可以扩展到存储更多信息。
唯一需要说明的一点是,列表视图控件仍会为您提供编译时类型为 is 的项目TListItem
。所以你需要向上转换。
例如,假设您想在编辑项目时做某事。事件处理程序如下所示:
procedure ListView1Edited(Sender: TObject; Item: TListItem; var S: string);
请注意,该项目作为 type 传递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 回答