将对象附加到已存在的ListItem?

use*_*348 2 delphi listview object listitem delphi-xe2

在ListView中,如何将对象随时附加到已存在的ListItem?(我知道我可以将一个对象附加到ListItem AddItem,但是我需要在创建ListItem之后附加该对象).

TLa*_*ama 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;
Run Code Online (Sandbox Code Playgroud)


Dav*_*nan 5

你可以使用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)