这似乎是一个非常简单的问题,但是我无法使用滚动条来显示滚动条,这让我发疯了。
情况如下。我需要在表单的一部分中显示可变数量的帧。可以通过TSplitter或通过调整表单大小来调整显示这些帧的区域。
我在创建表单时根据数据库中的记录动态生成帧。这些框架是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;
调整大小时会有明显的闪烁,但我可以忍受,因为它会产生所需的结果。一旦用户调整表单大小,它将始终使用这些维度重新创建,因此调整大小是用户不经常进行的操作。
答案 0 :(得分:7)
当包含控件超出可见矩形时,ScrollBox将仅显示滚动条。由于滚动条中唯一的控件是流动面板,因此客户端无法将滚动框内的流动面板对齐。这将始终使flowpanel等于滚动框的大小,因此不需要滚动。
如果你想要f.i.垂直滚动,使流动面板顶部对齐并自动调整大小。当更多的框架放在里面时,这应该使流动板的高度更大。
以防万一:检查垂直滚动条的Visible属性是否设置为true。
答案 1 :(得分:2)
我没有Autosize真实 我在Scrollbox上有流程面板。 flow planel align设置为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;
效果很好。
答案 2 :(得分:1)
我有类似的问题,我通过改编@ Mark的代码解决了这个问题。考虑到FlowPanel1
上有ScrollBox1
和Form1
,您可以尝试:
ScrollBox1
的{{1}}属性设置为Align
; alClient
放在FlowPanel1
; ScrollBox1
的{{1}}属性设置为FlowPanel1
。现在,在FlowStyle
的{{1}}事件中,只需执行:
fsLeftRightTopBottom
见下图中的结果:
HTH。
答案 3 :(得分:0)
所有使TScrollBox工作的努力都未能满足,但我很高兴地发现将AutoSize和AutoWrap设置为true并将其对齐设置为alTop的对齐设置为具有Orientation = soVertical的TPageScroller工作得相当好。滚动随之而来。
您可能希望设置pagescroller的ButtonSize以使其脱颖而出。 18似乎是正确的。