どのように仮想ツリービューコントロールは、常に線でスクロールさせることができますか?
-
06-09-2019 - |
質問
垂直仮想ツリービューをスクロールするピクセルによって、方法とは異なり、標準のDelphiグリッド、TListView
とTTreeView
ラインによってスクロールとの上部に見えるフルラインを保つ(または私が知っその他、このようなコントロールのほとんど)すべての回で制御。私が移動するカーソルキーを使用する場合、最初または最後の行が完全に表示されているいずれかの方向に応じ。マウスでスクロールすると一切のアライメントがありません。
この動作は、Delphi 2007と2009年に構造ウィンドウで、たとえば観察することができます。
Windows標準コントロールの動作を持っている多くのプロパティを設定する方法はありますか?それともこれを実現するために、どこかのパッチのセットがありますか?
解決
あなたはTBaseVirtualTree.OnScrollイベントをインターセプトし、インクリメント(スクロールダウン)(スクロールアップ)またはデクリメントするためにTBaseVirtualTree.offsetyを変更する量としてtextHeightとの仮想ツリービューのキャンバスの戻り値(「M」)を使用することができます。また、プリスクロール位置モジュラスtextHeightと(「M」)は(誤った位置から右量だけスクロールを避けるために)ゼロであることを保証するためにテストすることができます。
また、仮想ツリービューにこのポストするフォーラムは別のアプローチを提案する:VCLのスクロールバーを使用して仮想ツリービューのネイティブスクロールバーを非表示にしてから(VCLスクロールイベントをトラップし、プログラムの仮想ツリービューをスクロール)自分をスクロールします。
他のヒント
これは、私がArgalatyrの助けを借りて思い付いたものです、それは私がそれを望むものないように見えます:
procedure TForm1.FormCreate(Sender: TObject);
begin
VirtualStringTree1.ScrollBarOptions.VerticalIncrement :=
VirtualStringTree1.DefaultNodeHeight;
end;
procedure TForm1.VirtualStringTree1Resize(Sender: TObject);
var
DY: integer;
begin
with VirtualStringTree1 do begin
DY := VirtualStringTree1.DefaultNodeHeight;
BottomSpace := ClientHeight mod DY;
VirtualStringTree1.OffsetY := Round(VirtualStringTree1.OffsetY / DY) * DY;
end;
end;
procedure TForm1.VirtualStringTree1Scroll(Sender: TBaseVirtualTree; DeltaX,
DeltaY: Integer);
var
DY: integer;
begin
if DeltaY <> 0 then begin
DY := VirtualStringTree1.DefaultNodeHeight;
VirtualStringTree1.OffsetY := Round(VirtualStringTree1.OffsetY / DY) * DY;
end;
end;