实现TListView控件的超高速内容更新-C++Builder 移动开发研究 (92227302) QQ群原创首发

宝龙哥 2014-08-15 10:38:21

实现TListView控件的超高速内容更新-C++Builder 移动开发研究 (92227302) QQ群原创首发

前言:TListView控件很强大,但是,如果你有很多项目要显示那么TListView控件可能表现的相当缓慢,如何解决?本文将告诉你答案!

原理:如何更快速的显示?答案是利用TListView控件的OwnerData属性和OnData及OnDataFind事件,将数据和列表视图分开,即列表视图控件不存储任何数据,只利用高性能的屏幕刷新技术实现快速显示内存数据的“虚拟列表视图”。

说明:本文使用了结构,其实也可以使用其它内存数据类型,请根据需要自行选择和修改。

代码:// 本教程由 C++Builder 移动开发研究 (92227302) QQ群原创并群内首发,转载请注明出处,谢谢合作!

typedef struct{
String J_TVYA;
int IconIndex;
bool J_KFTA;
TPoint ptPre;
}G_UTHK;
G_UTHK G_OESR[20000];
int C_CEVU=0; // 结构中总共存储了多少行数据

void __fastcall TForm1::FormCreate(TObject *Sender)
{
ListView1->OwnerData = true;
//ListView1->DragCursor = crDefault;
//ListView1->IconOptions->AutoArrange = false;

//ListView1->DragMode=true;

//ListView1->HideSelection = false; // 失去焦点后仍保持选中状态
//ListView1->ReadOnly=true; // 禁止用户直接修改节点的标题

ListView1->LargeImages=ImageList1; // 设置存放大图标的图标列表,当列表处于大图标显示方式时,列表使用这个图标列表中的图标显示
//ListView1->SmallImages=ImageList1; // 设置存放小图标的图标列表,当列表处于小图标显示方式时,列表使用这个图标列表中的图标显示
//ListView1->StateImages=ImageList1; // 状态图标,用不同的的图像来表示节点的不同状态
// 本教程由 C++Builder 移动开发研究 (92227302) QQ群原创并群内首发,转载请注明出处,谢谢合作!
// 如果要在不是当前被选中的节点的左边显示图像,那么应该在编辑框Image Index
// 中输入图像的索引号。要禁止显示图像可以把这个节点Image Index设置为缺省值-1。
// 如果要在被选中的节点的左边显示图像,应该在编辑框Selected Index中指定图像的索引号,索引号是从0开始的。要禁止显示图像可以把它设置为缺省值-1。
// 如果要在节点的左边多显示一个图像,可以在编辑框State Index中输入图像的索引号。这个索引号代表Tree View组件中的StateImages属性所表示的图像列表的索引。要禁止显示图像可以把这个项目设置为缺省值-1。
// 注意:Image Index与 Selected Index 使用的是Images指定的ImageList;而State Index使用的是StateImages 指定的ImageList。

ListView1->ViewStyle=vsIcon; // 大图标
//ListView1->ViewStyle=vsSmallIcon; // 小图标
//ListView1->ViewStyle=vsList; // 列表
//ListView1->ViewStyle=vsReport; // 详细资料
}
//---------------------------------------------------------------------------

void __fastcall TForm1::ListView1Data(TObject *Sender, TListItem *Item)
{
Item->Caption = G_OESR[Item->Index].J_TVYA;
Item->ImageIndex = G_OESR[Item->Index].IconIndex;
}
//---------------------------------------------------------------------------

void __fastcall TForm1::ToolButton1Click(TObject *Sender)
{ // 给结构里填充点内容好实测代码效果
C_CEVU=ImageList1->Count; // 结构中总共存储了多少行数据
for(int i=0;i<C_CEVU;i++){
G_OESR[i].J_TVYA=i;
//G_OESR[i].ptPre.X=10;
//G_OESR[i].ptPre.Y=10;
G_OESR[i].IconIndex=i;
}
ListView1->Items->Count = C_CEVU;
}
//---------------------------------------------------------------------------

void __fastcall TForm1::ListView1Resize(TObject *Sender)
{ // 在窗体大小改变时重整图标
ListView1->Refresh(); // 刷新控件
}
...全文
330 3 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
JayTan_1992 2014-08-19
  • 打赏
  • 举报
回复
正在学习,突然发现Cbuilder的资料好少。请问楼主在哪找的学习资料。
sczyq 2014-08-16
  • 打赏
  • 举报
回复
看起来好象不错
宝龙哥 2014-08-15
  • 打赏
  • 举报
回复
将代码稍微修改一下看看性能到底如何:
void __fastcall TForm1::Button1Click(TObject *Sender)
{ // 给结构里填充点内容好实测代码效果
  DWORD start_time=GetTickCount(); // 计时开始
  /*
  C_CEVU=ImageList1->Count; // 结构中总共存储了多少行数据
	for(int i=0;i<C_CEVU;i++){
	  G_OESR[i].J_TVYA=i;
	  //G_OESR[i].ptPre.X=10;
	  //G_OESR[i].ptPre.Y=10;
	  G_OESR[i].IconIndex=i;
	} //*/
	for(C_CEVU=0;C_CEVU<20000;C_CEVU++){
	  G_OESR[C_CEVU].J_TVYA=C_CEVU;
	  //G_OESR[C_CEVU].ptPre.X=10;
	  //G_OESR[C_CEVU].ptPre.Y=10;
	  G_OESR[C_CEVU].IconIndex=C_CEVU;
	}
  ListView1->Items->Count = C_CEVU;
  DWORD end_time=GetTickCount(); // 计时结束
  ShowMessage(end_time-start_time); // 显示计时结果
  // 实测20000条数据仅用时31毫秒
}

551

社区成员

发帖
与我相关
我的任务
社区描述
C++ Builder 茶馆
社区管理员
  • 茶馆
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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