6

TVirtualStringTree の使い方を学びましたが、すばらしいと思いました。別のスレッドによって埋められる PackedList と呼ばれるカスタムの非ビジュアル リストが 1 つあります。そして、TVirtualStringTree のすべてのリスト コンテンツをリアルタイムで表示したいと考えています。そこで、メインフォームに 1 つのタイマーを配置して、HexLog (TVirtualStringTree) の RootNodeCount を 500 ミリ秒ごとに更新します。

私のデータはすべて VirtualStringTree に表示され、速度の問題はありません。しかし、垂直スクロール バーには 1 つの問題があります。リストの最後にジャンプするためにコントロールで Ctrl+End を押すと、途中のどこかに移動します。同様に、スクロールバーを最後までドラッグしても、最後まで移動しません。しかし、HexLog は DataCount を知っています。最後までジャンプしないのはなぜですか?Ctrl+END を数回押すと、最後まで到達します。

タイマールーチンの中で、コードでリストの最後にジャンプする HexLog と言いたいです。これを行うにはどうすればよいですか?また、垂直スクロールバーを適切に処理するにはどうすればよいですか?

procedure TMainForm.StatusUpdateTimerTimer(Sender: TObject);
begin
   if (FirpList.ComOperationCount > 0) and (PacketList.Items.Count <> FirpList.ComOperationCount) then
    begin
      HexLog.RootNodeCount := PacketList.Items.Count;
    end;
end;

procedure TMainForm.HexLogMeasureItem(Sender: TBaseVirtualTree;
  TargetCanvas: TCanvas; Node: PVirtualNode; var NodeHeight: Integer);
begin
  if Sender.MultiLine[Node] then
  begin
    TargetCanvas.Font := Sender.Font;
    NodeHeight := HexLog.ComputeNodeHeight(TargetCanvas, Node, 1, FirpList.ComOperations[Node^.Parent^.Index].DataAsHexString(FAppSettings.HexLogColumnCharWidth) + #13#10);
  end;
end;

HexLogの外観

TLama による提案された返信が正しく機能していません。説明については画像を参照してください。 TLama ソリューションが機能しない

詳細な画像の説明については、そのリンクを参照してください: http://i43.tinypic.com/1445thi.png

4

1 に答える 1

6

ツリーの最後にジャンプするには、を呼び出しますScrollIntoView(GetLast)

特定のノードにスクロールするには、コントロールが前のすべてのノードの高さを合計して、適切なオフセットを決定できるようにする必要があります。

ノードの高さはさまざまです。ノードの実際の高さをどこかで初期化していない場合、コントロールはDefaultNodeHeight初期化されていないノードのプロパティを使用します。その高さはツリー内の実際のノードの高さよりも短いように見えるため、コントロールは最終的に予想よりも小さいオフセットを計算し、意図した場所ではなくそこでスクロールします。

OnMeasureItemイベントを処理していること、およびでtoVariableNodeHeightオプションが設定されていることを確認してくださいOptions.MiscOptions。そうしないと、コントロールは各ノードに現在割り当てられている高さを使用し、初期化されていないノードにはデフォルトの高さを使用します。

を設定して処理NodeHeightする代わりに手動で割り当てると、ここで報告する動作を取得できます。toVariableNodeHeightOnMeasureItem

于 2012-04-06T14:26:51.323 に答える