常にツリーの一番下にある必要がある特定のノードがいくつかあるため、ノードのインデックスを変更しようとしています。Node.Indexを変更しようとしましたが、何も変更されませんでした。だから私の質問は:PVirtualNodeのインデックスを変更するにはどうすればよいですか?
ありがとう!-ジェフ
常にツリーの一番下にある必要がある特定のノードがいくつかあるため、ノードのインデックスを変更しようとしています。Node.Indexを変更しようとしましたが、何も変更されませんでした。だから私の質問は:PVirtualNodeのインデックスを変更するにはどうすればよいですか?
ありがとう!-ジェフ
ノードAのインデックスを変更するには、 Aに必要なインデックスを持つノードBを見つけて、を呼び出します。Bとそれ以降のすべてがAのためのスペースを作るために1つ下にシフトし、それらのフィールドが再計算されます。これは、Aがツリーにまだ存在していない場合でも機能します(呼び出した直後など)。Tree.MoveTo(A, B, amInsertBefore, False)IndexMakeNewNode
各ノードをリストまたは配列内の対応するデータ値に関連付けるために使用Indexしている場合、これは表示された値の並べ替えにはほとんど効果がないことがわかります。
ノードのインデックスを変更することはできません。通常、使用するときVirtualStringTreeは、ツリーとは別の独自のデータ構造にデータを保持し、イベントからのデータにアクセスします。(レコードを使用して)ノードに直接データを保存することもできますが、ロジックがツリービューから除外されるため、他のアプローチをお勧めします。
たとえば、データをリストに保存し、GetTextハンドラーでこのリストにアクセスできます(を使用できますNode.Index)。次に、アイテムを並べ替える場合は、リストを並べ替えるだけで、他のすべてが自動的に行われます(Invalidateツリーで呼び出す必要がある場合があります)。
擬似コード:
初期化中:
Tree.RootNodeCount := MyList.Count;
イベントのGetText場合:
NodeText := MyList [Node.Index];
並べ替え:
Reorder (MyList);
Tree.Invalidate;
TVirtualNodeは二重にリンクされたリストであり、インデックスベースの構造ではありません。ノードを削除して必要な場所に追加することにより、ノードのインデックスを変更します。
DeleteNode調べてくださいAddChild。
ツリービューコントロールをコンテナとしてまだ使用していることを考えると、Smasherが提供する理想的なソリューションは利用できません。
ツリービューに階層がない(つまりリストである)場合、かなり明白な解決策の1つはSort、独自の比較関数(OnCompareNodes)でメソッドを使用することです。
他のやみくもに明白な戦略は、最後に必要なノードを追加することです。後で他のノードを追加する必要がある場合は、それらを特別な最後のノードの上に。で挿入しますInsertNode。あなたがそれを説明したように、この単純なアプローチはおそらく問題に十分でしょう。