2

VirtualStringTree各ノードの高さが異なる高さに変更された場合のスクロールバーを更新する方法。coz、スクロールはまだ同じ状態であるため、スクロールしたときに他のノードを表示できません。

toVariableNodeHeightオプションは機能しませんか?他のアイデアはありますか?

4

1 に答える 1

3

「各NodeHeightが変更された」と言うときは、実際にはNodeHeight、各ノードレコードのフィールドに新しい値を直接割り当てたことを意味します。まず第一に、それをしないでください。ノードに高さを割り当てる必要がある場合は、ツリーのNodeHeightプロパティを使用してノードを割り当てます。つまり、これの代わりに:

{*} Node.NodeHeight := x;

これを行う:

Tree.NodeHeight[Node] := x;

これにより、すべてのノードの祖先のキャッシュされた高さが自動的に調整されます。これにより、スクロールバーの範囲が決まります。

さらに良いことに、ノードに高さを割り当てないでください。代わりに、ツリーのOnMeasureItemイベントを処理します。ツリーは、各ノードの高さを尋ねます。このイベントは、toVariableNodeHeightオプションが設定されている場合に発生します。

ツリーのノードの高さの管理をスキップすることを本当に主張する場合は、必要なすべてのタスクを自分で処理することを確認する必要があります。NodeHeightこれには、フィールドだけでなくTotalHeight、ノードのフィールド、その親、祖父母なども、非表示のルートノードの合計の高さを設定するまで更新することが含まれます。詳細TBaseVirtualTree.AdjustTotalHeightはをご覧ください。プライベートな可視性があるので、自分で呼び出すことはできません。

OnMeasureItemノードに対して1回だけ呼び出されます。ノードの内容が変更されたために再度呼び出す必要があり、ツリーで高さを再測定する必要がある場合は、を呼び出しますReinitNode。を使用している場合はTCustomVirtualStringTree、を呼び出すこともできますInvalidateNode

于 2011-07-12T03:46:31.293 に答える