我有一个TListView,其中填充了通过网络收集的数据。收集所有数据大约需要 50 毫秒,将其添加到列表大约需要 5 秒。我最初的猜测是每次添加或类似的东西后都会重新绘制。我应该怎么做才能让TListView尽快更新?
列和项目都是通过代码添加的。
我尝试在列表的项目上使用BeginUpdate和EndUpdate,但这并没有太大的区别。大约有 2000 个条目被添加到列表中。
我有一个TListView,其中填充了通过网络收集的数据。收集所有数据大约需要 50 毫秒,将其添加到列表大约需要 5 秒。我最初的猜测是每次添加或类似的东西后都会重新绘制。我应该怎么做才能让TListView尽快更新?
列和项目都是通过代码添加的。
我尝试在列表的项目上使用BeginUpdate和EndUpdate,但这并没有太大的区别。大约有 2000 个条目被添加到列表中。
如果没有看到您的实际代码,就无法确定为什么您的更新如此缓慢。但是,如果速度对您来说是个问题,特别是对于很多列表项,您应该将其TListView
置于虚拟模式(将其OwnerData
属性设置为 true)并将您的状态信息存储在其他地方,而不是TListView
本身(2000 个项目很多非虚拟 ListView 处理的开销)。然后,只需在需要触发重绘时调用 ListView 的Invalidate()
或方法,并在它要求您提供状态数据时使用该事件提供状态数据。例如:UpdateItems()
OnData
TListView
struct MyStatusInfo
{
String Status;
...
};
MyStatusInfo StatusItems[2000];
__fastcall TForm1::TForm1(TComponent *Owner)
: TForm(Owner)
{
...
ListView1->Items->Count = 2000; // you don't use Add() with a virtual ListView
...
}
void __fastcalll TForm1::UpdateStatus(int Index, const String &Status, ...)
{
MyStatusInfo &Info = StatusItems[Item->Index];
Info.Status = Status;
...
ListView1->UpdateItems(Index, Index);
}
void __fastcall TForm1::ListView1Data(TObject *Sender, TListItem *Item)
{
MyStatusInfo &Info = StatusItems[Item->Index];
Item->Caption = Info.Status;
...
}
我不确定这是否有帮助,因为 BeginUpdate 没有,但值得尝试:
1)尝试在Enabled = false时填充它,然后启用它
2) 尝试构建一个 TListItems 并将其直接分配给 TListView 的 Items 属性