我想编制以下情况:
我在表单中有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;
任何想法我怎么能意识到这一点?
答案 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;