ListView在操作大量數(shù)據(jù)時慢的問題! (CSDN-CSDN社區(qū)-C++ Builder-基礎(chǔ)類) :
--> 26樓 max_wzg (暴走-銀狼) :
采用常規(guī)方法處理ListView,在數(shù)據(jù)量大時無論是還是用了BeginUpdata和EndUpdata()還是處理WM_EraseBkgnd信息都不會得到理想的效果,那答案是什么呢?
嗯,采用所謂Virtual ListView。
說起來很神秘,其實點通了很簡單。
在于把ListView-> OwnerData設(shè)為true,然后直接設(shè)置
ListView-> Items-> Count為數(shù)據(jù)總數(shù),實際的數(shù)據(jù)可以保在任意其它速度較快且可直接索引的容器里(如STL中的vector),然后關(guān)鍵是在OnData事件中寫入代碼通過Item-> Index從容器中(如vector)取出數(shù)據(jù),然后用
Item-> Caption = ???;
Item-> SubItems-> Add(???);
Item-> SubItems-> Add(???);
來動態(tài)的寫入數(shù)據(jù)到ListView用于UI顯示,如此Virtual ListView即完成.
一個完整的簡單例子如下:
--> 28樓 cdws222 (二當家) :
不過如果你看到這個回復(fù)候能不能解釋一下
vector <ListViewData*> m_lvDataVector;是什么意思
我是個菜鳥,還不會這個
--> 29樓 max_wzg (暴走-銀狼) :
vector是標準C++庫的一部分,STL中的容器類之一,
你可以簡單地把它理解為C++內(nèi)置數(shù)組的增強版,詳細的你可以看看有關(guān)標準C++的書或文章,可以把這當成開始學(xué)習(xí)泛形編程的一個好的開端,推薦《C++Primer》。
學(xué)好標準C++庫非常重要,既然用BCB,就要充分發(fā)揮C++的強大功能,不然真的還不如去用Delphi.
二、http://topic.csdn.net/t/20020728/13/905888.html
討論ListView里顯示十萬級以上記錄時,象SQL Server里的返回所有行的方式顯示記錄,怎么實現(xiàn)? (CSDN-CSDN社區(qū)-C++ Builder-基礎(chǔ)類) :
--> 25樓 bigwhiteshark (變性鯊魚) :
哈哈正中本人下懷
如何用TListView來處理大量數(shù)據(jù)
采用常規(guī)方法處理ListView,在數(shù)據(jù)量大時無論是還是用了BeginUpdata和EndUpdata()
還是處理WM_EraseBkgnd信息都不會得到理想的效果,那答案是什么呢?嗯,
采用所謂Virtual ListView技術(shù)。說起來很神秘,其實點通了很簡單。
通常ListView中的所有數(shù)據(jù)都是由ListView自己來管理的,它負責(zé)這些數(shù)據(jù)空間的分配和釋放,
當你把ListView-> OwnerData設(shè)為true時,ListView就把數(shù)據(jù)的管理權(quán)交給了你,而它只負責(zé)顯示。
這時你需要自己來為數(shù)據(jù)分配和釋放空間,至于你怎樣來管理這些數(shù)據(jù)完全有你自己來定,
ListView完全不關(guān)心,當ListView需要顯示某條數(shù)據(jù)時,它就調(diào)用OnData事件,
你只要在這個事件的處理函數(shù)里指定ListView即將顯示的Item的內(nèi)容就可以了。
這就是所謂的Virtual ListView技術(shù)。
由于ListView對數(shù)據(jù)管理的功能強大,隨之而來的卻是效率低下,
如果你采用更高效的數(shù)據(jù)管理方式就會極大的改變效率。
而且Virtual ListView只在數(shù)據(jù)需要顯示時才調(diào)用OnData事件載入數(shù)據(jù),所以速度很快。
下面的例子中,假設(shè)ListView中需要顯示4列數(shù)據(jù),所有的數(shù)據(jù)被保存在vector里。
速度很快,5000條數(shù)據(jù)只要1秒左右.
在使用Virtual ListView方式時,如果要對數(shù)據(jù)排序,只需對你保存的內(nèi)部數(shù)據(jù)(這里時vector對象)排序,然后ListView-> Refresh()即可。這時你在ListView中看到的數(shù)據(jù)就是排好序的數(shù)據(jù)了。
2002-12-12 大白鯊
三、http://topic.csdn.net/t/20040719/17/3189489.html
300分求解決listview大量數(shù)據(jù)添加慢的方法 (CSDN-CSDN社區(qū)-Delphi-VCL組件開發(fā)及應(yīng)用 ):
--> 3樓 fei19790920 (飯桶超人II) :
標題: 讓ListView更快的顯示數(shù)據(jù)
關(guān)鍵字: Listview,Virtual,海量數(shù)據(jù)
分類: 成功心得
密級: 公開
(評分: , 回復(fù): 6, 閱讀: 312) ??
最近剛剛完成一個項目,用Listview取代難看的DBGrid顯示數(shù)據(jù)。在我的機器上運行正常。一切看起來還不錯,但是,且慢。在用戶那里用實際數(shù)據(jù)一顯示,我當場暈倒。天哪,區(qū)區(qū)4000條記錄,居然顯示了2分鐘32秒……
經(jīng)過試驗,發(fā)現(xiàn)Listview在插入1000條記錄時速度尚可忍受,然后插入速度逐漸變慢。隨著記錄數(shù)的增加,速度越來越慢。
怎么辦?使用第三方控件?
正在彷徨無計之際,CSDN和大富翁上的相關(guān)帖子讓我受到啟發(fā)。對,就用Virtual模式。
首先研究大家提到的一個Delphi自帶的例子,就是{$DELPHI}/Demos/Virtual Listview文件夾下的那個工程。
讓Listview進入Virtual模式其實很簡單。設(shè)置Listview的OwnerData屬性為True,然后設(shè)置Listview.Items.Count的值,最后在Listview的OnData事件處理方法中給指定Index的Item提供Caption、SubItems等信息即可。
當然,你需要自己管理你要顯示的數(shù)據(jù)。我使用了一個TList類,當然也可以使用數(shù)組。
以上是我在自己重新編寫的Demo中觀察到的。但是,當我依照此思路將其運用到我的項目中時,發(fā)現(xiàn)當鼠標在屏幕上移動的時候,Listview本身不停的閃爍,根本無法工作。這是怎么回事?
我在網(wǎng)上尋尋覓覓,但遲遲找不到答案。也動過在大富翁和CSDN上詢問的念頭,但是又不甘心。
察看TListView的源碼,除了看到OnData實際上由系統(tǒng)LVN_GETITEMINFO消息觸發(fā)外,沒有任何可用信息。
仔細對比我寫的Demo、Delphi自帶的例程和我的項目代碼,發(fā)現(xiàn)一點重大的不同。那就是,前兩者在Ondata事件處理方法中Item.SubItems是用Add方法添加的,而我的項目中是直接給Item.SubItems.CommaText賦值。難道是因為這一點?我作了一些修改,呵呵,大功告成!
經(jīng)過實測,現(xiàn)在顯示4000條復(fù)雜紀錄只需區(qū)區(qū)30秒,而這時間主要是花費在數(shù)據(jù)庫(我們的表結(jié)構(gòu)確實存在問題)查詢上,相信如果數(shù)據(jù)庫結(jié)構(gòu)得以優(yōu)化,顯示4000條記錄需時絕不會超過10秒。
至此,問題得到解決。相信許多正在苦苦尋覓第三方控件的朋友能夠由此得到一些啟發(fā)
--> 4樓 fei19790920 (飯桶超人II) :