これは非常に単純な問題のように思えますが、スクロールボックスにスクロールバーを表示させることができず、頭がおかしくなります。
これが状況です。フォームの一部に可変数のフレームを表示する必要があります。これらのフレームが表示されている領域は、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;
サイズを変更するとちらつきが目立ちますが、希望どおりの結果が得られるので、それでも問題ありません。ユーザーがフォームのサイズを変更すると、常にそれらのディメンションを使用して再作成されるため、サイズ変更はユーザーが頻繁に行うことではありません。