2

在 ListView 中,如何随时将对象附加到已经存在的 ListItem?(我知道我可以使用 将对象附加到 ListItem AddItem,但是我需要在创建 ListItem 后附加对象)。

4

2 回答 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 回答