2012-02-23 46 views
0

我的C++ CAD應用程序維護用戶建模操作的日誌,以便它們可以不被應用和重新應用。任何特定的項目可能只包含幾個操作,或者可能包含數十萬個操作。我已經有了自己的數據結構來以一種高效的內存管理方式來管理這些數據,並且這一直運行良好。但是現在我添加了一項功能,允許用戶在網格中檢查他的操作日誌。 (我正在使用Embarcadero RAD Studio 2010;所有圖形用戶界面都使用VCL。)使用VCL組件在網格中顯示非常大的數據集

當前,我正在使用TDBGrid組件向用戶顯示行中的操作數據。這裏是我有我的組件連接起來:

TDBGrid.DataSource =一個TDataSource

TDataSource.DataSet =一個TClientDataSet

TClientDataSet.ProviderName =一個TDataSetProvider

TDataSetProvider.DataSet = ProjectDataSet

ProjectDataSet是從TDataSet派生的類。

因爲我拉着從我自己的數據結構,而不是從數據庫的運行數據,我在ProjectDataSet類覆蓋的GetFieldData和GetRecord功能(和其他幾個人),以便它直接返回數據我自己的數據結構(不做任何數據庫查詢)。這工作。

爲了最大限度地減少顯示大量操作時的內存使用情況,我在TClientDataSet中設置了'FetchOnDemand'屬性,並將'PacketRecords'設置爲100.因此,最初只有前100個操作出現在網格中。一旦用戶滾動到網格的底部,接下來的100個操作將被TClientDataSet自動提取並顯示在網格中。

所有這一切都很好。我的問題是,當用戶滾動瀏覽網格時,TClientDataSet不停地提取更多記錄而不釋放任何內容。所以,如果用戶在一個非常大的項目中滾動得足夠遠,我最終會耗盡內存。

所以,我的問題是:什麼是使這個圖形用戶界面工作的最佳方式是什麼?基本上,我希望網格表現得像電子表格一樣。我希望用戶能夠在操作列表中上下滾動(或跳轉到特定的行),而不管有多少操作,而且我不希望GUI組件在內存中保留大量內容用戶並不急需。

我假設TDBGrid(或其他VCL組件)被設計爲能夠通過一次只讀取幾條記錄來顯示任意大的數據集,那麼它是如何實現的呢?

如果我需要重新考慮GUI,那很好。但如果我可以使用相同的GUI來顯示10個操作項目或10萬個操作項目,那將是非常好的。

謝謝。

+1

如果在將下一個數據包添加到它之前手動清除cds,該怎麼辦? – vavan 2012-02-24 05:55:25

+0

是的,這可能會起作用。我會給它一個鏡頭。儘管如此,我覺得它正在盜用它。我真正想要的是*正確*的方式來做到這一點。我認爲VCL的設計是爲了能夠在網格中顯示任意大的數據集,並且我想知道這個工作的意義。謝謝你的幫助。 – 2012-02-24 15:43:23

+0

請回報你的結果。事實上,恐怕沒有「正確」的方法來做到這一點,CDS和整個TDataSet都是非常不足的設計。 – vavan 2012-02-27 08:43:55

回答

1

嘗試VirtualTreeView其Delphi組件,但它在C++ Builder中起作用。您將不得不將數據填充功能移植到新網格。

VT非常快速且非常易於使用。

+0

這看起來很有前景。感謝您的建議。我即將離開這個國家幾個月,所以我暫時不能試用這個,但我會盡快告訴你它是如何發生的。 – 2012-05-15 20:16:39

相關問題