私はTVirtualStringTreeの使い方を学びました。私は別のスレッドによって満たされているPackedListと呼ばれる1つのカスタム非ビジュアルリストを持っています。また、リアルタイムでTVirtualStringTreeのすべてのリストコンテンツを表示したい。だから、HexLog(TVirtualStringTree)RootNodeCountを500msごとに更新するためにメインフォームに1つのタイマーを置く。TVirtualStringTreeと垂直スクロールが正常に動作しない
すべてのデータは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;
TLamaによって回答が説明のための画像を参照してください、正常に動作しない推奨:http://i43.tinypic.com/1445thi.png
こんにちはRob、私はMultiLineの子の高さを計算するためにMeasureItemのハンドラを持っています。 MiscOptionsでtoVariableNodeHeightが設定されていませんでした。私はそれをtrueにして、ScrollIntoView()が最後まで適切にジャンプします。しかし、それはわずかに下にスクロールし、許容範囲外の終わりに達するまで約2秒かかります:/ –
すべての新しいノードの高さを計算することに加えて、最後のノードのオフセットを計算するのに時間がかかる大きな事は、ノード位置キャッシュが有効でない場合'GetDisplayRect'にブレークポイントを設定し、' ScrollIntoView'を呼び出すときに 'tsUseCache'状態に入っているかどうかを確認してください。キャッシュが有効な場合、ツリーはノードの位置をはるかに速く見つけることができますが、ノードの数を変更するとキャッシュが無効になります。ワーカースレッドは、それを再検証する時間が必要です。 –
(FStatesのtsUseCache)GetDisplayRect()関数の条件は、ScrollIntoView()を呼び出すとfalseを返します。私は今どうすればいい?このプロジェクトでは、私が直面したスピードの問題から、RichEditコントロールを使用していました。すべてのデザインをVirtualStringTreeを使用するように変更しました。もう一度私は同じポイントにいます:/実際に私は、リストの最後にジャンプするために全メッセージの高さを計算する必要がある理由を理解することが困難に直面しています。データトランザクションがアクティブな間に500msごとに最後のメッセージをユーザーに表示するだけです。 –