更新TListView的最快方法

时间:2012-12-12 15:14:45

标签: c++builder tlistview

我有一个 TListView ,它会填充通过网络收集的数据。要收集所有数据需要大约50ms,将其添加到列表大约需要5秒。我最初的猜测是,它是在每次添加之后重绘或类似的东西。我该怎么做才能让 TListView 尽快更新?

列和项目都是通过代码添加的。

我尝试在列表项目中使用 BeginUpdate EndUpdate ,但这并没有太大区别。大约有2000个条目被添加到列表中。

2 个答案:

答案 0 :(得分:1)

如果没有看到您的实际代码,就无法确定为什么您的更新速度很慢。但是,如果速度对您来说是一个问题,特别是对于大量列表项,则应将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;
    ...
}

答案 1 :(得分:0)

我不确定这是否有帮助,因为BeginUpdate没有,但值得尝试:

1)尝试在Enabled = false时填充它,然后启用它

2)尝试构建TListItems并将其直接分配给TListView的Items属性