VirtualStringTree
各ノードの高さが異なる高さに変更された場合のスクロールバーを更新する方法。coz、スクロールはまだ同じ状態であるため、スクロールしたときに他のノードを表示できません。
toVariableNodeHeight
オプションは機能しませんか?他のアイデアはありますか?
VirtualStringTree
各ノードの高さが異なる高さに変更された場合のスクロールバーを更新する方法。coz、スクロールはまだ同じ状態であるため、スクロールしたときに他のノードを表示できません。
toVariableNodeHeight
オプションは機能しませんか?他のアイデアはありますか?
「各NodeHeightが変更された」と言うときは、実際にはNodeHeight
、各ノードレコードのフィールドに新しい値を直接割り当てたことを意味します。まず第一に、それをしないでください。ノードに高さを割り当てる必要がある場合は、ツリーのNodeHeight
プロパティを使用してノードを割り当てます。つまり、これの代わりに:
{*} Node.NodeHeight := x;
これを行う:
Tree.NodeHeight[Node] := x;
これにより、すべてのノードの祖先のキャッシュされた高さが自動的に調整されます。これにより、スクロールバーの範囲が決まります。
さらに良いことに、ノードに高さを割り当てないでください。代わりに、ツリーのOnMeasureItem
イベントを処理します。ツリーは、各ノードの高さを尋ねます。このイベントは、toVariableNodeHeight
オプションが設定されている場合に発生します。
ツリーのノードの高さの管理をスキップすることを本当に主張する場合は、必要なすべてのタスクを自分で処理することを確認する必要があります。NodeHeight
これには、フィールドだけでなくTotalHeight
、ノードのフィールド、その親、祖父母なども、非表示のルートノードの合計の高さを設定するまで更新することが含まれます。詳細TBaseVirtualTree.AdjustTotalHeight
はをご覧ください。プライベートな可視性があるので、自分で呼び出すことはできません。
OnMeasureItem
ノードに対して1回だけ呼び出されます。ノードの内容が変更されたために再度呼び出す必要があり、ツリーで高さを再測定する必要がある場合は、を呼び出しますReinitNode
。を使用している場合はTCustomVirtualStringTree
、を呼び出すこともできますInvalidateNode
。