8

这似乎是一个非常简单的问题,但我无法让滚动框显示滚动条,这让我发疯。

这是情况。我需要在表单的一部分中显示可变数量的帧。可以通过 TSplitter 或通过调整窗体大小来调整显示这些帧的区域的大小。

创建表单时,我正在根据数据库中的记录动态生成框架。此框架是 FlowPanel 的父级,FlowPanel 负责放置框架。FlowPanel 位于 ScrollBox 中。

由于 FlowPanel,当用户使用 TSplitter 或调整表单大小时,框架可能会重新对齐。如果任何框架重新定位到表单视图之外,我希望 ScrollBox 显示滚动条,以便用户可以向下滚动到那些无法访问的框架。这不会发生。无法访问位于滚动框尺寸之外的流程面板区域中的那些框架。

我用滚动框中的简单对象构建了一些测试,如果滚动框包含的任何对象出现在滚动框的尺寸之外,滚动框就会正确放置滚动条。

流面板是否与 clClient(滚动框)对齐或锚定到滚动框的侧面,或者这些都没有,都没有关系。

我意识到我可以改用 TPanel,并在面板的 OnResize 事件处理程序的代码中执行框架的放置和重新定位,但这就是 FlowPanel 的用途。

这里发生了什么?我摆弄了许多不同的滚动框属性,但仍然无法让它工作。有什么问题,有解决办法吗?


好的。我选择 Ewe 的答案是正确的,但完成这项工作的诀窍在于他的评论之一,我仍然对结果不完全满意。

这是独家新闻。我确实按照 Ewe 建议的方式配置了 ScrollBox 和 FlowPanel,但由于该配置不起作用,我尝试了许多其他设置。我很确定这是由于表单的用户界面的复杂性,它在面板中有许多面板,许多拆分器,并且表单本身是 PageControl 的 TabSheet 的父级(我省略了这个事实,因为测试表单作为一个支架单独的形式产生相同的结果)。

是什么使它工作,尽管以一种笨重的方式,是 Ewe 建议关闭并再次打开 FlowPanel 的 AutoWrap。我在 ScrollBox 的 OnResize 事件处理程序中添加了以下代码:

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

调整大小时会出现明显的闪烁,但我可以忍受,因为它会产生所需的结果。一旦用户调整表单大小,它总是会使用这些尺寸重新创建,因此调整大小是用户很少会做的事情。

4

4 回答 4

8

ScrollBox 只会在包含控件超出可见矩形时显示滚动条。由于滚动框内的唯一控件是流程面板,因此客户端对齐滚动框内的流程面板无济于事。这将始终使流程面板等于滚动框的大小,因此不需要滚动。

如果您想要 fi 垂直滚动,请使流程面板顶部对齐并自动调整大小。当更多的帧被放置在里面时,这应该会使流程面板的高度更大。

以防万一:检查垂直滚动条的 Visible 属性是否设置为 true。

于 2012-01-27T17:01:17.650 回答
4

我没有自动调整大小。
我在滚动框上有流面板。流动平面对齐设置为 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 的代码解决了它。考虑到您有 aFlowPanel1和 a ,ScrollBox1Form1可以尝试:

  • ScrollBox1'Align属性设置为alClient;
  • 把; FlowPanel1_ScrollBox1
  • FlowPanel1'FlowStyle属性设置为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 效果相当好。滚动随之而来。

您可能希望扩大 pagescroller 的 ButtonSize 以使其突出。18似乎是对的。

于 2016-10-26T08:04:04.243 回答