【发布时间】:2018-07-11 16:17:41
【问题描述】:
我想在后台刷新列表视图列表,为此我创建了一个临时 TListItems,但我无法将它分配给我的列表视图。如果我创建 TListItems 和 TListItem 会发生访问冲突错误;
var
lis:TListItems;
li:TListItem;
begin
lis := TListItems.Create(nil);
try
li := TListItem.Create(nil);
li.Caption := 'test'; // at this line av occurs
lis.AddItem(li);
ListView1.Items.BeginUpdate;
try
ListView1.Items.Assign(lis);
finally
ListView1.Items.EndUpdate;
end;
finally
lis.Destroy();
end;
如果我在创建 TListItems 时使用 ListView1 作为所有者,则不会出现新行;
var
lis:TListItems;
li:TListItem;
begin
lis := TListItems.Create(ListView1);
try
li := TListItem.Create(lis);
li.Caption := 'test';
lis.AddItem(li);
ListView1.Items.BeginUpdate;
try
ListView1.Items.Assign(lis);
finally
ListView1.Items.EndUpdate;
end;
finally
lis.Destroy();
end;
所以我想在后台准备一个新列表并将其分配给listview,我该怎么做?
注意:准备清单需要很长时间,这就是我在后台准备清单的原因。 (我通过线程填充列表并使用 TRTLCriticalSection 保护它)
【问题讨论】:
-
TListView包装了 Windows 的列表视图。这些项目通过 Windows API 进行管理。您不能以您想要的方式创建TListItems的实例。您必须将自己的对象列表保存在某个地方。 -
您可以简单地创建一个临时 TListView 而无需将其放置在表单上,向其中添加项目,然后将其项目重新分配给您的原始 TListView。或者,您也可以尝试不使用原生 Windows 小部件的出色 TVirtualTree。
-
使用虚拟列表视图。您可以使用本机 VCL 控件执行此操作。当您说背景时,您的意思是线程。你知道vcl线程规则吗?
-
谢谢大家。我将使用@DavidHeffernan 推荐的虚拟列表视图。还有大卫,我在 vcl 线程之前体验过,再次感谢你。
标签: delphi delphi-xe2