微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

delphi – TFlowPanel中的AutoSize和AutoWrap冲突

我试图以下列方式使用TFlowPanel组件:

>放置在主窗体Form1组件FlowPanel1:TFlowPanel上.
> Set Form1.Width = 400,FlowPanel1.Align = alTop,FlowPanel1.AutoSize = True,FlowPanel1.AutoWrap = True.
>放置在FlowPanel1 5 SpeedButtons上并将其宽度设置为64.
>编译并运行.
>减少表单的宽度(有关Form1.Width = 200的内容).

出于某种原因,当用户调整表单大小时,速度按钮不会自动排成两行.虽然,当AutoSize = False时,它们会排成两行,AutoWrap = True.
这种行为的原因是什么以及如何解决

编辑:我发现了“快速而肮脏”的解决方案.以下代码是TFlowPanel.OnResize事件的事件处理程序:

procedure TForm1.FlowPanel1Resize(Sender: TObject);
begin
  with FlowPanel1 do
  begin
    AutoSize := False;
    Realign;            // line up controls
    AutoSize := True;   // adjust TFlowPanel.Height
  end;
end;

但是,我仍然想知道是否有一种解决问题的标准方法.

解决方法

我无法在代码中找到这种行为的确切原因,但基本上你已经挑战了两个大小的属性来战斗,AutoSizeAlign.问题是,我认为,当你调整表单大小时,控件与 AutoSize配置为True,Align设置为 alTop将首先尝试自动调整控件,然后对齐到其父级的顶部.我可以肯定的是,这两个属性不应该至少从它们的逻辑含义中加以组合.

我建议您的解决方法关闭自动调整大小,并在OnResize事件中将其临时打开并返回关闭自动调整高度.所以在代码中它会简单地改为:

procedure TForm1.FlowPanel1Resize(Sender: TObject);
begin
  // there's no Realign here,since the AlignControls request is called
  // at control resize,so here you have children already aligned,what
  // you then need is to request the control to autosize the height and
  // turn off the autosizing to the default,disabled state
  FlowPanel1.AutoSize := True;
  FlowPanel1.AutoSize := False;
end;

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐