Car*_*sen 7 delphi tframe tscrollbox
这似乎是一个非常简单的问题,但我无法使用滚动条来显示滚动条,这让我发疯.
情况就是这样.我需要在表单的一部分中显示可变数量的帧.可以通过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;
Run Code Online (Sandbox Code Playgroud)
调整大小时会有明显的闪烁,但我可以忍受,因为它会产生所需的结果.一旦用户调整表单大小,它将始终使用这些维度重新创建,因此调整大小是用户不经常进行的操作.
当包含的控件超出可见矩形时,ScrollBox将仅显示滚动条.由于滚动条中唯一的控件是流动面板,因此客户端无法将滚动框内的流动面板对齐.这将始终使flowpanel等于滚动框的大小,因此不需要滚动.
如果您想要垂直滚动,请使流动面板顶部对齐并自动调整大小.当更多的框架放在里面时,这应该使流动板的高度更大.
以防万一:检查垂直滚动条的Visible属性是否设置为true.
小智 6
我没有 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;
Run Code Online (Sandbox Code Playgroud)
效果很好。
| 归档时间: |
|
| 查看次数: |
14949 次 |
| 最近记录: |