效率和速度如何兼顾?ListView和StringGrids

CCLIS 2002-01-24 09:42:58
加精
我要列出一张表,表中有一万条记录,每条记录中有十列(这样共有十万个数据)我试用了两种方式来显示这些数据,ListView和StringGrids,再测定一下装载数据的时间,真是不敢相信会差这么多:ListView装载全部数据要45~50秒,而StringGrids只要1~2秒!!
但我想对这些显示出来的数据进行排序,如果用ListView,只要再加一两个函数,就能对所有的排序全部搞定,而如果使用StringGrids,则要使用大量的排序语句,这样又要浪费大量的时间。
你们说,到底使用哪一个控件,效率和速度应如何兼顾?
...全文
97 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
verybigbug 2002-01-25
  • 打赏
  • 举报
回复
用ListView, 选择OwnerData=true;重载OnData等关联Event就可以了。
在OnData中实现显示,这就是Virtual ListView的用法。十万记录只要15秒就
可以了。---〉StringGrids用的就是相同的方法。区别在ListView中你必须管理
这些数据,在StringGrids中它帮助你管理这些数据。
Sample:

// H File
typedef struct AAA{
AnsiString szBuf[10];
}AAA;

AAA* Fa;

// CPP File
__fastcall TForm1::TForm1(TComponent* Owner)
: TForm(Owner)
{
Fa = new AAA[100000];
for(int i = 0 ; i<100000; i++)
{
for(int j = 0; j < 10; j++)
Fa[i].szBuf[j] = "Test_" + AnsiString(i) + "_" + AnsiString(j);
}
}
//---------------------------------------------------------------------------

void __fastcall TForm1::ListView1Data(TObject *Sender, TListItem *Item)
{
Item->Caption = Fa[Item->Index].szBuf[0];
for(int i = 0; i<9; i++)
Item->SubItems->Add(Fa[Item->Index].szBuf[i+1]);

}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{
DWORD t1 = GetTickCount();
for(int i=0; i<100000; i++)
TListItem* pItem = ListView1->Items->Add();

DWORD t2 = GetTickCount();

MessageBox(Handle, AnsiString(t2- t1).c_str(), "Debug", MB_OK);
}
//---------------------------------------------------------------------------
void __fastcall TForm1::FormClose(TObject *Sender, TCloseAction &Action)
{
delete Fa;
}

如果你用SDK写就更快了。记住:排序必须对Fa进行排序, ListView中的数据已经没有意义
了,你的数据是在Fa中的。
uguessme 2002-01-25
  • 打赏
  • 举报
回复
同意楼上!
wangledong 2002-01-24
  • 打赏
  • 举报
回复
如果你在向LISTVIEW中添加纪录的时候,先不刷新,速度会快很多,当全部添加完毕后在显示速度就会很快的!

13,826

社区成员

发帖
与我相关
我的任务
社区描述
C++ Builder相关内容讨论区
社区管理员
  • 基础类社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧