加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

delphi – TFlowPanel中的AutoSize和AutoWrap冲突

发布时间:2020-12-15 09:33:37 所属栏目:大数据 来源:网络整理
导读:我试图以下列方式使用TFlowPanel组件: 放置在主窗体Form1组件FlowPanel1:TFlowPanel上. Set Form1.Width = 400,FlowPanel1.Align = alTop,FlowPanel1.AutoSize = True,FlowPanel1.AutoWrap = True. 放置在FlowPanel1 5 SpeedButtons上并将其宽度设置为64.
我试图以下列方式使用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;

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读