仮想ツリービューで使用でき、メモリをあまり消費せず、使いやすく、VT と同じくらい高速なツリー実装が必要です (つまり、データを VT 自体に保存する場合)。
私は Linas の svTree を試してみました。これは使いやすいですが、期待したほど高速ではなく、メモリ フレンドリーでもありませんでした。
また、私のアプリが何千ものノードを管理することを指摘したいだけです。:)
おすすめの無料ライブラリを教えてください。また、仮想ツリービューで使用する方法の最小限のデモを作成できますか?
仮想ツリービューで使用でき、メモリをあまり消費せず、使いやすく、VT と同じくらい高速なツリー実装が必要です (つまり、データを VT 自体に保存する場合)。
私は Linas の svTree を試してみました。これは使いやすいですが、期待したほど高速ではなく、メモリ フレンドリーでもありませんでした。
また、私のアプリが何千ものノードを管理することを指摘したいだけです。:)
おすすめの無料ライブラリを教えてください。また、仮想ツリービューで使用する方法の最小限のデモを作成できますか?
データを記憶するためのコントロールやライブラリは必要ありません。ニーズに合ったデータ構造を考え出す必要があります。最後のステップでは、VTV またはその他のコントロールを使用してデータ構造を表示します。GUI について考えるのを少しやめて、データ構造をどのように構築するかを考えてみてください。デザインパターンと昔ながらのプログラミング、リンクリスト、配列、キュー、ハッシュリスト/辞書、赤/黒ツリーなどについて考えてみてください。検索、トラバース、追加の速度とメモリ使用量に関して、それぞれに長所と短所があります。ライブラリがあります ( http://www.boyet.com/FixedArticles/EZDSL.htmlなど))には基本的な構成要素がありますが、必要なものを理解する必要があります。そこで行き詰まった場合は、新しい質問をして、データ構造の要件を指定することをお勧めします。https://sites.google.com/site/igetfreebook/The-Tomes-of-Delphi-Algorithms-and-Data-Structuresをお読みください。
あなたの質問が、データも格納する GUI コントロールに関するものである場合、なぜ VTV を使用したくないのだろうかと思います。他のコントロールの方が簡単かもしれませんが、設計の観点からは優れているとは言えません。GUI コントロールにデータを保存しています。
rmControlsライブラリのrmTreeNonView
コンポーネントを見てください。
私たちは何年もの間、そのツリーの修正版をデータ コンテナーとして使用してきました。無料で、高速で、非ビジュアルで、ソース コードが付属しており、TTreeView のメソッドとプロパティをほぼ 100% 複製し、独自のメソッドをいくつか追加しているため、簡単に使い始めることができます。特に、ツリーの高速なハッシュ ベースの検索です。ノードパス。
この会社がもう営業しているとは思えませんが (http://www.mills-enterprise.ca)、ソースを含む rmControls パッケージは多くの Delphi ダウンロード サイトで入手できます。
編集:
VTV のノードから別のツリー構造のノードを指す方法を示すコードを次に示します。何が起こっているかを確認できるように、十分なコードが含まれていることを願っています。TmwDataTreeNode は、TTreeNonView の子孫のノードです。PopulateVT メソッドが完了すると、各 TNodeData の ContextNode フィールドがソース データ コンテナ ツリー内のノードを指すことに注意してください。このアプローチは、VTV の仮想的な性質を利用していないことに注意してください。
type
//Virtual tree record stuff
PNodeData = ^TNodeData;
TNodeData = record
public
NodeSelf: PVirtualNode; //Ptr to our own VT node...needed?
ContextNode: TmwDataTreeNode; //ptr to our corresp node of data tree
GridRecordIndex: integer; //Grid.RecordIndex of our corresp Alloc formula.
end;
procedure T_fmExplAllocOut.PopulateVT;
{ Load data to the DragDrop treeview. }
var
n: TmwDataTreeNode; //Pointer to a node of my customized TTreeNonView
begin
VT.NodeDataSize := SizeOf(TNodeData);
VT.BeginUpdate;
vtsChangeFontSize(VT, Self.Font.Size); //Set Tree Font.Size & DefaultNodeHeight
//Add DragDrop Tree nodes
n := AllocController.SnapContext.Tree.Items.GetFirstNode;
while n <> nil do begin
AddVTNode(nil, n); //nil=parent node of top-level VT nodes
n := n.GetNextSibling;
end;
VT.FullExpand;
VT.EndUpdate;
end;
procedure T_fmExplAllocOut.AddVTNode(VTParentNode: PVirtualNode; n: TmwDataTreeNode);
{ Recursively add n & its children to VT. }
var
NodeData: PNodeData;
VTNode: PVirtualNode;
begin
if (n = nil) or not NodeInIncludeFilter(n) then
exit;
//Add this node
VTNode := VT.AddChild(VTParentNode);
NodeData := VT.GetNodeData(VTNode);
VT.ValidateNode(VTNode, False); //else OnFreeNode won't get called
with NodeData^ do begin
NodeSelf := VTNode;
ContextNode := n;
GridRecordIndex := -1;
end;
//Add child nodes
n := n.GetFirstChild;
while n <> nil do begin
AddVTNode(VTNode, n); //Pass our added node as Parent
n := n.GetNextSibling;
end;
end;
かなり具体的なニーズがあるようですので、正確な要件を満たす完全なソリューションはないと思います。
私の最初の提案は、データベースを使用することです。必要な (と思う) すべての機能に加えて、堅牢で非常に高速であるという追加のボーナスがあります。明らかに、データの追加/削除/挿入/編集などを処理するために、いくつかのルーチンを作成する必要があります。リレーショナル データベースは、カテゴリ間のすべての関係を保存し、レコード間の関係を簡単に変更できるようにします。 (ノード)。時間をかけて、階層データを格納する方法と、ノード間の関係を学習してください。適切に設計されたデータベースは、プロジェクトのすべての詳細を提供します。MySQL は無料で、非常に簡単に使用できます。フットプリントは小さいですが、非常に高速です。この記事を見て、ツリー データ構造をリレーショナルな方法で格納する方法について考えてみましょう:リレーショナル ツリー データ構造.
そうは言っても、それがあなたが探しているものかどうかはわかりません。
データベースがツリーを格納する方法の例:
データベースが実現不可能な場合は、独自のクラスを作成することをお勧めします。データがどのように管理され、どのように組み合わされるかを知っているのはあなただけです。したがって、ツリーを操作して組み合わせる必要がある正確な機能を記述することができます。TObjectList を調べることから始めます。各ノードのデータを格納するクラス オブジェクトを作成します。次に、これらのオブジェクトのリストを作成して、すべてのノードを保持できます。追加、更新、移動など、ツリーで実行されるユーザー アクションを模倣するメソッドを作成します。これには時間がかかる場合がありますが、学習に役立ち、アプリケーション デザイナーとしてのメリットがあります。行き詰まったときは、途中で質問してください。
Delphi の非ビジュアル TTree 実装への回答に、いくつかの興味深い非ビジュアル ツリーがリストされています。
それらの1つがあなたのニーズに合うかもしれません。