TListItem对象

时间:2012-04-20 22:05:26

标签: delphi vcl listitem

我想编制以下情况:

我在表单中有2个不同的ListView。我想将ListView2中的特定项目附加到ListView1项目中。 “父”项被删除后,它还应删除ListView2中的所有附加项。 到目前为止我试过这个:

type
 TITEMS = record
 A_Items : array of TListItem;
end;

将项添加到ListView1(ParentItems)

的按钮
var
 item : TListItem;
begin
 item := ListView1.Items.Add;
 item.Caption := 'ParentTestItem';
 item.SubItems.Add('TestSubItem');

将项目添加到ListView2(ChildItems)

的按钮
 var
  item : TlistItem;
  items : TITEMS;
 begin
  if ListView1.Selected = NIL then exit; // Make sure an item is selected.
  item := ListView2.Items.Add;
  item.Caption := 'ChildTestItem';
  item.SubItems.Add('TestSubItem');
  SetLength (items.item, Length(items.item) + 1); // wrong? 
  items.item[Length(items.item)-1] := item;
  ListView1.Selected.SubItems.Objects[0] := @items;

删除ParentItem的按钮(它也应该删除ChildItems ......)

  var
   items : TItems;
   i : Integer;
   item : TlistItem;
  begin
   if ListView1.Selected = NIL then exit; // Make sure an item is selected.
   items := TItems(ListView1.Selected.SubItems.Objects[0]); // Cast
   for i := 0 to Length (items.item) - 1 do begin
    item := items.item[i];
    item.Delete;
   end;
   ListView1.Selected.Free;

任何想法我怎么能意识到这一点?

1 个答案:

答案 0 :(得分:3)

您需要在堆上动态分配项目列表,而不是在堆栈本地分配项目列表,因此它在您使用它时在内存中保持有效。

我建议使用TList而不是数组,动态分配更容易。我还建议使用TListItem.Data属性而不是TListItem.SubItems.Objects[]属性(除非您已经将Data属性用于其他内容)。

procedure TForm1.AddParentBtnClick(Sender: TObject);
var 
  item : TListItem; 
begin 
  item := ListView1.Items.Add; 
  item.Caption := 'ParentTestItem'; 
  item.SubItems.Add('TestSubItem'); 
end;

procedure TForm1.AddChildBtnClick(Sender: TObject);
var 
  Selected, item : TListItem; 
  items : TList; 
begin 
  Selected := ListView1.Selected;
  if Selected = nil then Exit; // Make sure an item is selected. 

  items := TList(Selected.Data);
  if items = nil then begin
    items := TList.Create;
    Selected.Data := items;
  end;

  item := ListView2.Items.Add; 
  try
    item.Caption := 'ChildTestItem'; 
    item.SubItems.Add('TestSubItem'); 
    items.Add(item); 
  except
    item.Delete;
    raise;
  end;
end;

procedure TForm1.DeleteParentBtnClick(Sender: TObject);
var
  Selected : TListItem; 
begin
  Selected := ListView1.Selected;
  if Selected <> nil then Selected.Delete;
end;

procedure TForm1.ListView1Deletion(Sender: TObject; Item: TListItem);
var 
  items : TList; 
  i : Integer; 
begin 
  items := TList(Item.Data); // Cast 
  if items <> nil then begin
    for i := 0 to items.Count - 1 do begin 
     TListItem(items[i]).Delete; 
    end; 
    items.Free;
    Item.Data := nil;
  end;
end;