实现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(); // 刷新控件
}
...全文
392 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
小哈机器人 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毫秒
}
内容概要:本文系统研究了在电力系统负荷发生突变的动态环境下,采用无迹卡尔曼滤波(UKF)与自适应无迹卡尔曼滤波(AUKF)进行三相状态估计的方法。通过Matlab平台实现了两种滤波算法的仿真模型,构建了包含三相电力系统建模、非线性状态方程推导、量测系统设计在内的完整状态估计框架。重点对比分析了UKF与AUKF在突变负荷扰动下的估计精度、收敛速度与鲁棒性,深入探讨AUKF通过实时调整噪声协方差实现自适应的能力,从而有效应对系统模型不确定性和外部动态变化,提升状态估计的可靠性。研究为智能电网在复杂动态工况下的实时监控、安全评估与优化控制提供了坚实的算法基础与仿真验证手段。; 适合人群:具备电力系统分析、现代控制理论基础及一定Matlab编程能力的研究生、科研人员和工程技术人员。; 使用场景及目标:① 掌握UKF在非线性电力系统状态估计中的具体应用流程与实现细节;② 深入理解AUKF的自适应机制及其在负荷突变、模型失配等动态工况下提升估计性能的原理与优势;③ 为智能电网的状态监测、故障诊断、实时调度与主动防御等高级应用提供可靠的算法支持与可复现的仿真平台。; 阅读建议:建议读者结合电力系统状态估计的经典理论,仔细研读并运行所提供的Matlab代码,重点关注系统模型的建立、UKF/AUKF算法的参数初始化、负荷突变事件的建模方式,以及两种算法在电压、电流等状态变量估计误差上的对比分析,通过仿真结果的可视化深入理解算法差异与工程应用价值。

551

社区成员

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

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