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;

相关文章

 从网上看到《Delphi API HOOK完全说明》这篇文章,基本上都...
  从网上看到《Delphi API HOOK完全说明》这篇文章,基本上...
ffmpeg 是一套强大的开源的多媒体库 一般都是用 c/c+&#x...
32位CPU所含有的寄存器有:4个数据寄存器(EAX、EBX、ECX和ED...
1 mov dst, src dst是目的操作数,src是源操作数,指令实现的...