1

我想对以下情况进行编程:

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

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

将项目添加到 ListView1 (ParentItems) 的 Button

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;

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

4

1 回答 1

3

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

我建议使用 aTList而不是数组,它更容易动态分配。我还建议使用该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;
于 2012-04-20T22:58:52.240 回答