どのように仮想ツリービューコントロールは、常に線でスクロールさせることができますか?

StackOverflow https://stackoverflow.com/questions/929600

  •  06-09-2019
  •  | 
  •  

質問

垂直仮想ツリービューをスクロールするピクセルによって、方法とは異なり、標準のDelphiグリッド、TListViewTTreeViewラインによってスクロールとの上部に見えるフルラインを保つ(または私が知っその他、このようなコントロールのほとんど)すべての回で制御。私が移動するカーソルキーを使用する場合、最初または最後の行が完全に表示されているいずれかの方向に応じ。マウスでスクロールすると一切のアライメントがありません。

この動作は、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;
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top