私のC++CADアプリケーションは、ユーザーのモデリング操作のログを保持しているため、適用を解除して再適用することができます。特定のプロジェクトには、ほんの数回の操作が含まれる場合もあれば、数十万回の操作が含まれる場合もあります。このデータをメモリ効率の高い方法で管理するための独自のデータ構造がすでに用意されており、これはうまく機能しています。しかし今、私はユーザーがグリッドで自分の操作ログを検査できるようにする機能を追加しています。(私はEmbarcadero RAD Studio 2010を使用しています。すべてのGUIは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を機能させるための最良の方法は何ですか?基本的に、グリッドをスプレッドシートのように動作させたいと思います。操作の数に関係なく、ユーザーが操作リストを上下にスクロールできるようにする(または特定の行にジャンプできるようにする)必要があります。また、GUIコンポーネントがメモリ内に多くのものを保持することは望ましくありません。ユーザーは差し迫った必要はありません。
TDBGrid(または他のVCLコンポーネント)は、一度に少数のレコードのみをフェッチすることで任意の大きなデータセットを表示できるように設計されていると思いますが、それはどのように行われるのでしょうか?
GUIを再考する必要がある場合は、それで問題ありません。しかし、同じGUIを使用して10操作のプロジェクトまたは100,000操作のプロジェクトを表示できれば本当に素晴らしいと思います。
ありがとう。