2012-04-06 22 views
6

私は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; 

Appearance of HexLog

TLamaによって回答が説明のための画像を参照してください、正常に動作しない推奨:http://i43.tinypic.com/1445thi.png

答えて

6

はにジャンプする: TLama solution is not working

は詳細画像説明のためにそのリンクを参照してください。木の終わりに、ScrollIntoView(GetLast)と呼んでください。

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

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

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

toVariableNodeHeightを設定してOnMeasureItemを設定する代わりに、NodeHeightを手動で割り当てると、ここで報告する動作が得られます。

+0

こんにちはRob、私はMultiLineの子の高さを計算するためにMeasureItemのハンドラを持っています。 MiscOptionsでtoVariableNodeHeightが設定されていませんでした。私はそれをtrueにして、ScrollIntoView()が最後まで適切にジャンプします。しかし、それはわずかに下にスクロールし、許容範囲外の終わりに達するまで約2秒かかります:/ –

+0

すべての新しいノードの高さを計算することに加えて、最後のノードのオフセットを計算するのに時間がかかる大きな事は、ノード位置キャッシュが有効でない場合'GetDisplayRect'にブレークポイントを設定し、' ScrollIntoView'を呼び出すときに 'tsUseCache'状態に入っているかどうかを確認してください。キャッシュが有効な場合、ツリーはノードの位置をはるかに速く見つけることができますが、ノードの数を変更するとキャッシュが無効になります。ワーカースレッドは、それを再検証する時間が必要です。 –

+0

(FStatesのtsUseCache)GetDisplayRect()関数の条件は、ScrollIntoView()を呼び出すとfalseを返します。私は今どうすればいい?このプロジェクトでは、私が直面したスピードの問題から、RichEditコントロールを使用していました。すべてのデザインをVirtualStringTreeを使用するように変更しました。もう一度私は同じポイントにいます:/実際に私は、リストの最後にジャンプするために全メッセージの高さを計算する必要がある理由を理解することが困難に直面しています。データトランザクションがアクティブな間に500msごとに最後のメッセージをユーザーに表示するだけです。 –

関連する問題