为啥我的 TScrollBox 不显示滚动条?

Posted

技术标签:

【中文标题】为啥我的 TScrollBox 不显示滚动条?【英文标题】:Why is my TScrollBox not showing scrollbars?为什么我的 TScrollBox 不显示滚动条? 【发布时间】:2012-02-20 15:25:47 【问题描述】:

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

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

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

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

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

流面板是否与 clClient(滚动框)对齐或锚定到滚动框的侧面,或者这些都不重要。

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

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


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

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

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

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

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

【问题讨论】:

【参考方案1】:

使 TScrollBox 工作的所有努力都未能取悦,但我很高兴地发现,将 AutoSize 和 AutoWrap 设置为 true 且对齐设置为 alTop 的 TFlowPanel 放入 Orientation = soVertical 的 TPageScroller 效果相当好。随之而来的是滚动。

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

【讨论】:

【参考方案2】:

我遇到了类似的问题,我通过改编@Mark 的代码解决了这个问题。考虑到您的Form1 上有FlowPanel1ScrollBox1,您可以尝试:

ScrollBox1Align属性设置为alClient; 把FlowPanel1放在ScrollBox1上; 将FlowPanel1FlowStyle 属性设置为fsLeftRightTopBottom

现在,在Form1OnResize 事件上,只需执行以下操作:

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;

看下图的结果:

HTH。

【讨论】:

【参考方案3】:

我没有设置 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;

效果很好。

【讨论】:

【参考方案4】:

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

如果你想要 f.i.垂直滚动,使流程面板顶部对齐并自动调整大小。当内部放置更多帧时,这应该会使流程面板的高度更大。

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

【讨论】:

TFlowPanel 现在对齐 clTop,VertScrollBar.Visible 属性设置为 True。那没有做到。事实上,FlowPanel 停止重新定位其中的控件,并且水平或垂直滚动​​条都没有出现。假设我在此过程中弄乱了一些属性,我删除了流程面板和滚动框,并放置了新实例。 ScrollBox 对齐 alClient,AutoScroll 设置为 True,VertScrollBar.Visible 为 True。 FlowPanel Align 设置为 alTop,AutoSize 为 True。仍然没有喜悦。没有滚动条出现,flowpanel 不流动。嗯。 在这里完美运行。您应该知道 AutoSize 选项会在调整滚动框大小时阻碍流程面板重新排序其控件(但这与滚动条无关)。调整滚动框大小后,您可以将 AutoWrap 切换为 false 并返回 true。 我相信你的答案是正确的,如果其他人没有提出解决方案,我会在第二天接受它。我仍然有问题,但我的表格很复杂。它有 8 个面板、4 个拆分器、4 个 DBGrid 和多达 20 个帧(在流程面板中)。 FlowPanel 位于一个 ScrollBox 上,该 ScrollBox 与另一个面板中的 Client 对齐。在与 ScrollBox 相同的面板中是另一个顶部对齐的面板。我的简单测试有效,但这些测试都没有复制这种特殊形式的复杂性。 答案在您对我的评论的回复中。我在我的帖子中添加了有关解决方案的详细信息。谢谢!

以上是关于为啥我的 TScrollBox 不显示滚动条?的主要内容,如果未能解决你的问题,请参考以下文章

delphi中加个下拉滚动条,如果。现在是第九第十下面的显示不出来。请问如何加滚动条?

DragMode为dmAutomatic时如何使TScrollBox自动滚动?

【CSS】为啥设置不显示滚动条不好用呢?

为啥css的overflow不显示滚动条

【CSS】为啥设置不显示滚动条不好用呢?

打开一个网页,拉那个滚动条,页面就闪烁 为啥啊