实现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(); // 刷新控件
}