100分够不够? ( 积分: 100 )

  • 主题发起人 主题发起人 a1b1c1
  • 开始时间 开始时间
A

a1b1c1

Unregistered / Unconfirmed
GUEST, unregistred user!
诸位:
有谁用过,或见过 不使用TCustomlistbox 和 TListbox 而实现了可变行高的列表应用?
若有,可否告诉一声,或给个链接。

我写了一个控件,但由于需要计算行高(WM_SIZE比较频繁)且滚动条不好控制,因此速度和效率不高,我想看看别人是如何做的.
多谢,若分不够,再加。
 
直接查看 TCustomlistbox 和 TListbox 代码不就行了。
 
一般情况下tlistbox速度还好啊,是不是你数据量太大?
那么考虑一下根据滚动条的位置动态加载数据。
 
kaida,ufo!,多谢。
Kaida:在TCustomlistbox是通过消息回传行高的MeasureItem,而滚动条的设置是看不到的,它内部是如何处理,如何储存行高的,看不到。
ufo!:在数量大时刷新时效果不好,在我的应用中,不能通过BeginUpdate和EndUpdate来控制,所以就会明示看到闪烁。
 
试试双缓冲,把form的DoubleBuffered:= true;
 
UFO!:Thanks.
双缓冲只能减少显示时的闪烁,但不满足我的要求。

你见过独立于TCUSTOMLISTBOX的列表应用控件没有。对于行高固定的,很好实现,但是这种行高可变的,我也能实现,但效果不好,你有没有好的回路,另外 ,TLISTBOX类已不在考虑之中,他的机制 不满足要求,例如,你在线程中快速添加、删除、修改Items,看看会出现什么效果。
 
高性能的没用过,我的都是小数据量的场合,tlistbox已经满足需求了。
listbox应该是微软的标准控件,delphi只是封装了它而已。
 
是标准控件。
我主要是在线程要用,唉,麻烦,我在等等,不行就结了。
现在这的人是越来越少啊。
是用DELPHI人少了,还是大家都在忙?
不停在网上看到说DELPHI/BCB不利的消息,事实上,真正用好的人的多少?唉。
 
vcl不是线程安全的,因此在线程内还是要调用主线程同步过程来向listbox写数据的。
你的问题估计还是在不停的刷新listbox所消耗的资源太大。
是否可以在线程内把数据写入一个tstringlist内,然后在需要显示的时候再写到tlistbox内?这样就不用频繁刷新界面了
 
你应把主要源码贴出.
想得到别人帮助,大家都可以分享也对.
我建议你结贴,别人即使有别的方法,也不会贴出来.你自己想想吧..
 
UFo!,谢!是我没有说清楚,我已构造了线程安全的TThreadStringList,所以不需要同步也可完成,至于显示,使用Assign,情况更糟糕,它会调用 Invalidate来刷新,若会用begin/Endupdate,又会看不到变化过程,只能看到结果,在吞吐量大时不便查看。
事实上,tlistbox的这些问题而不是关键,你可以试下可变行高,在数据量大时的样子,由于设计计算显示时的高度,整个性能下降非常厉害。我在1600x1200下,一屏可显示40个的样子 ,行高不同,在快速刷新时就不行了。
 
Jey,若有源码,我就不会这么问了,我是在寻找源码。你的建议很对。
 
"我建议你结贴,别人即使有别的方法,也不会贴出来.你自己想想吧..",真是的不明白,解释一下?
 
技术也是为了应用服务,给个折衷的办法。
1。用beginupdate/Endupdate在后台更新。
2。前台用directdraw做高速滚屏。
 
UFO!哈哈,厉害,那我需要把DirectX也引进来了。你用过DX没有,它的窗口模式和Win32 form不同。
 
dx没做过,但我用opengl可以在普通form模式下显示。
 
是可以,通过映射CANVAS,不管如何,多谢你了。结了,
 
多人接受答案了。
 
后退
顶部