2

垂直スクロールがTScrollBoxあり、水平スクロールバーが無効になっています。このスクロール ボックス内には、上部に配置された 1 つの大きなパネルがあり、その高さはその内容に基づいて動的に計算されます。その内容は 2 つのパネルで、1 つは左側に配置され、もう 1 つはクライアントが配置され、その間にスプリッターがあります。これら 2 つのパネルのそれぞれの内部には、ユーザーが選択した一連のパネルが上部に配置されており、動的にサイズ変更することもできるため、スクロール ボックス内のメイン パネルの高さを拡大/縮小できます。

procedure TfrmDashboard.ResizePanels;
var
  X: Integer;
  H1, H2: Integer;
  H: Integer;
begin
  H1:= 0;
  H2:= 0;
  //Calculate height of left panel
  for X := 0 to p1.ControlCount-1 do
    H1:= H1 + p1.Controls[X].Height;
  //Calculate height of right panel
  for X := 0 to p2.ControlCount-1 do
    H2:= H2 + p2.Controls[X].Height;
  //Check which panel is larger
  H:= H1;
  if H2 > H then
    H:= H2;
  //Adjust scrolling height
  pMain.Height:= H + 10;
  SB.VertScrollBar.Range:= pMain.Height;
  SB.VertScrollBar.Size:= pMain.Height;
end;

同時に、コンテンツのこれらの小さなサブパネルのほとんどには、フォーカスを受け取るコントロールもあり、フォーカスを取得できるようにする必要があります。現在、すべてがスクロールで正常に動作します。

この問題は、ユーザーがスクロール ボックス内のそのようなフォーカス可能なコントロールの 1 つをクリックしたときに発生します。そのコントロールが部分的に非表示になっている場合 (コントロールの上部がスクロール位置の上部より上に伸びている)、スクロール ボックス全体がジャンプして、このコントロールがスクロール ボックスの上部に配置されます。

これは「機能」のようですが、無効にしたい機能です。この状況ではかなり厄介です。子の 1 つがフォーカスを受け取ったときにスクロール ボックスの位置がジャンプしないようにするにはどうすればよいですか?

4

1 に答える 1

4

これは TScrollBox の既定の動作であり、この機能をオフにするプロパティはありません。
ただし、TScrollBox をサブクラス化することでこの動作を変更し、代わりにこの新しいクラスを使用できます。

TModifiedScrollBox=class(TScrollBox)
protected
    procedure AutoScrollInView(AControl:TControl); override;
end;

procedure TModifiedScrollBox.AutoScrollInView(AControl:TControl);
begin
  // empty body
end;

このコードの欠点は、独自のコードで使用すると AutoScrollInView が機能しなくなることです。ただし、このメソッドがまだ必要な場合は、「保存」するための追加のメソッドを作成できます。

TModifiedScrollBox=class(TScrollBox)
protected
    procedure AutoScrollInView(AControl:TControl); override;
    procedure AutoScrollInViewSave(AControl:TControl);
end;

procedure TModifiedScrollBox.AutoScrollInViewSave(AControl:TControl);
begin
  // forward to base implementation
  inherited AutoScrollInView(AControl);
end;

次に、コード内で、すべての AutoScrollInView 呼び出しをこの新しいクラスの AutoScrollInViewSave に置き換える必要があります。

PS 内部的には、新しいコントロールがフォーカスされるたびに、TCustomForm はフォーカスされたすべてのコントロールの親に対して AutoScrollInView を呼び出します。

于 2015-11-25T04:57:56.007 に答える