8

これは非常に単純な問題のように思えますが、スクロールボックスにスクロールバーを表示させることができず、頭がおかしくなります。

これが状況です。フォームの一部に可変数のフレームを表示する必要があります。これらのフレームが表示されている領域は、TSplitterを使用するか、フォームのサイズを変更することにより、サイズを変更できます。

フォームの作成時に、データベース内のレコードに基づいてフレームを動的に生成しています。このフレームは、フレームの配置を担当するFlowPanelの親になります。FlowPanelはScrollBoxにあります。

FlowPanelが原因で、ユーザーがTSplitterを使用したり、フォームのサイズを変更したりすると、フレームが再配置される場合があります。フレームのいずれかがフォームのビューの外に再配置された場合、ユーザーがアクセスできないフレームまでスクロールダウンできるように、ScrollBoxにスクロールバーが表示されることを期待しています。これは起こりません。スクロールボックスの寸法の外側のフローパネルの領域にあるフレームにはアクセスできません。

スクロールボックス内の単純なオブジェクトを使用していくつかのテストを作成しました。スクロールボックスに含まれるオブジェクトのいずれかがスクロールボックスの寸法の外側に表示される場合、スクロールボックスはスクロールバーを正しく配置します。

フローパネルがclClient(スクロールボックス)に位置合わせされているか、スクロールボックスの側面に固定されているか、またはこれらのいずれでもないかは関係ありません。

代わりにTPanelを使用して、パネルのOnResizeイベントハンドラーからコード内のフレームの配置と再配置を実行できることに気付きましたが、これがFlowPanelの目的です。

何が起きてる?私は多くの異なるスクロールボックスのプロパティをいじくり回しましたが、それでも機能させることができません。問題は何ですか、そして解決策はありますか?


Ok。私はEweの答えを正しいものとして選択していますが、この作品を作る秘訣は彼のコメントの1つにあり、私はまだ結果に完全に満足していません。

これがスクープです。ScrollBoxとFlowPanelをEweが提案した方法で構成しましたが、その構成が機能しなかったため、他の多くの設定を試してみました。これは、パネル内に多くのパネルがあり、多くのスプリッターがあり、フォーム自体がPageControlのTabSheetにペアレント化されているフォームのユーザーインターフェイスの複雑さによるものだと確信しています(フォームをスタンドとしてテストしたため、この事実を省略しました単独のフォームでも同じ結果が得られました)。

不格好な方法ではありますが、それを機能させたのは、FlowPanelのAutoWrapをオフとオンに切り替えるというEweの提案です。ScrollBoxのOnResizeイベントハンドラーに次のコードを追加しました。

procedure TCurrentJobsForm.ScrollBox1Resize(Sender: TObject);
begin
  Flowpanel1.Autowrap := False;
  FlowPanel1.AutoWrap := True;
end;

サイズを変更するとちらつきが目立ちますが、希望どおりの結果が得られるので、それでも問題ありません。ユーザーがフォームのサイズを変更すると、常にそれらのディメンションを使用して再作成されるため、サイズ変更はユーザーが頻繁に行うことではありません。

4

4 に答える 4

8

ScrollBoxは、containgコントロールが表示されている長方形を超えた場合にのみスクロールバーを表示します。スクロールボックス内の唯一のコントロールはフローパネルであるため、クライアントがスクロールボックス内のフローパネルを位置合わせするのに役立ちません。これにより、フローパネルは常にスクロールボックスのサイズと等しくなるため、スクロールする必要はありません。

垂直スクロールが必要な場合は、フローパネルの上部を揃えて自動サイズ変更します。これにより、より多くのフレームが内部に配置されると、フローパネルの高さが高くなります。

念のため:垂直スクロールバーのVisibleプロパティがtrueに設定されていることを確認してください。

于 2012-01-27T17:01:17.650 に答える
4

Autosizeがtrueではありません。
スクロールボックスにフローパネルがあります。フロープレーンアラインはleftRightTopBottomに設定されます。

formresizeイベントで私はこれを行います:

procedure TForm2.FormResize(Sender: TObject);
var
 i,h:integer;
begin
 h:=0;
 for i:=0 to FlowPanel1.ControlCount - 1 do
  h:=Max(FlowPanel1.Controls[i].BoundsRect.Bottom,h);
 ScrollBox1.VertScrollBar.Range:=h;
end;

よく働く。

于 2013-11-10T17:16:12.647 に答える
3

私も同様の問題を抱えていましたが、@Markのコードを適応させて解決しました。FlowPanel1あなたがあなたにとを持っていることを考慮ScrollBox1してForm1、あなたは試すことができます:

  • ScrollBox1'sAlignプロパティをalClient;に設定します。
  • FlowPanel1に置くScrollBox1;
  • FlowPanel1'sFlowStyleプロパティをに設定しfsLeftRightTopBottomます。

さて、のOnResizeイベントではForm1、次のことを行ってください。

procedure TForm1.FormShow(Sender: TObject);
var
  I: Integer;
  VButton: TButton;
begin
  for I := 1 to 10 do
  begin
    VButton := TButton.Create(FlowPanel1);
    VButton.Parent := FlowPanel1;
    VButton.Name := 'Button' + I.ToString;
    VButton.Height := 200;
    VButton.Width := 200;
  end;
end;

下の図の結果を参照してください。

スクロールバー付きのFlowPanel

HTH。

于 2016-08-22T17:50:34.247 に答える
0

TScrollBoxを機能させるためのすべての努力はうまくいきませんでしたが、AutoSizeとAutoWrapがtrueに設定され、その配置がalTopに設定されたTFlowPanelをOrientation=soVerticalのTPageScrollerにドロップするとかなりうまく機能することがわかりました。スクロールが続いた。

ページスクローラーのButtonSizeを強調して、目立たせることができます。18はほぼ正しいようです。

于 2016-10-26T08:04:04.243 に答える