2012-01-27 102 views
3

这似乎是一个非常简单的问题,但我无法使用滚动条来显示滚动条,这让我发疯。为什么我的TScrollBox不显示滚动条?

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

我动态生成基于数据库中的记录的帧创建的形式时。这些框架是由一个FlowPanel负责框架放置的。 FlowPanel位于ScrollBox中。

由于FlowPanel,当用户使用TSplitter或调整大小的形式中,该帧可以重新对准自己。如果任何框架重新定位在窗体视图之外,我期望滚动框显示滚动条,以便用户可以向下滚动到那些不可访问的框架。这不会发生。位于滚动框尺寸之外的流程面板区域中的这些框架不可访问。

我已经建立了一些测试,在一个滚动框简单的对象,以及滚动框正确地放置滚动条,如果任何包含的对象出现在滚动框的尺寸之外。

如果flowpanel对准clClient(在滚动框),或固定在滚动框,或没有这些两侧没关系。

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

这是怎么回事?我已经摆弄了许多不同的滚动框属性,但仍然无法使其工作。有什么问题,并有解决方案吗?


好的。我选择埃维的答案是正确的,但做这项工作的诀窍是在他的一个评论中,我对结果还没有完全满意。

这是瓢。我的ScrollBox和FlowPanel按照Ewe的建议进行了配置,但是由于该配置无法正常工作,因此需要使用其他一些设置。我很肯定这是由于表单用户界面的复杂性,它在面板中有很多面板,很多分离器,而且表单本身是Patrol到PageControl的TabSheet中的(我将这个表格作为一个表单测试,所以省略了这个事实独自形式产生了相同的结果)。

什么做了工作,尽管在一个笨重的时尚,是埃维的建议来切换FlowPanel的AutoWrap关机并重新开机。我下面的代码添加到滚动框的onResize受到事件处理程序:

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

调整时有一个明显的闪烁,但我可以忍受的,因为它产生预期的效果。用户调整表单大小后,将始终使用这些维度重新创建,因此调整大小是用户不常使用的操作。

回答

7

的滚动框将只显示滚动条时,方含控制超出可见矩形。由于您的滚动框内唯一的控件是流程面板,因此它不会帮助客户端将滚动框内的流程面板对齐。这将始终使流水盘等于滚动框的大小,因此不需要滚动。

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

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

+0

TFlowPanel现在对齐了clTop,而VertScrollBar.Visible属性设置为True。那没有做到。实际上,FlowPanel停止重新定位其中的控件,并且不出现水平或垂直滚动​​条。假设我一路搞乱了一些属性,我删除了流程面板和滚动框,并放置了新的实例。 ScrollBox与alClient对齐,AutoScroll设置为True,VertScrollBar.Visible为True。 FlowPanel Align设置为alTop,AutoSize为True。仍然没有快乐。没有滚动条出现,并且流程面板不流动。嗯。 – 2012-01-27 17:31:57

+0

在这里完美的作品。您应该知道AutoSize选项会阻碍流控面板在调整滚动条大小时对其控件重新排序(但与滚动条无关)。您可以在滚动框大小调整后将AutoWrap切换为false并返回true。 – 2012-01-27 18:11:27

+0

我相信你的答案是正确的,如果别人没有拿出解决方案,我会在第二天接受它。我仍然有这个问题,但我的表单很复杂。它有8个面板,4个分离器,4个DBGrids,以及多达20个框架(在流程面板中)。 FlowPanel位于ScrollBox上,与另一个面板中的客户端对齐。与ScrollBox相同的面板是另一个顶部对齐的面板。我简单的测试工作,但这些测试都没有重复这种特殊形式的复杂性。 – 2012-01-27 19:41:48

1

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

的伟大工程。

0

我有类似的问题,我用@ Mark的代码修改了它。考虑到你有FlowPanel1并在您Form1一个ScrollBox1,你可以尝试:

  • 设置ScrollBox1Align财产alClient;
  • FlowPanel1放在ScrollBox1;
  • FlowPanel1FlowStyle属性设置为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 with scroll bars

HTH。

0

所有努力获得TScrollBox工作失败,但我很高兴地发现,将AutoSize和AutoWrap设置为true并将其对齐方式设置为alTop并将Orientation = soVertical设置为TPageScroller的TFlowPanel工作得相当好。随后滚动。

您可能希望embiggen pagescroller的ButtonSize以使其突出。 18似乎是正确的。