包含TPanel时,TPanel不会自动调整大小

Ian*_*oyd 5 delphi vcl delphi-xe6

我在另一个内部有一个面板:

在此输入图像描述

内部面板对齐alTop:

在此输入图像描述

外面板设置为AutoSize=true:

在此输入图像描述

一切都很大.如果我在设计时更改了内部面板的高度,外部面板会自动调整大小以适应它:

在此输入图像描述

现在运行时

现在我需要在运行时更改内部面板的高度:

procedure TForm2.Button1Click(Sender: TObject);
begin
    pnlInner.Height := pnlInner.Height + 50;
    lblPointer.Top := pnlOuter.Top + pnlInner.Height;
end;
Run Code Online (Sandbox Code Playgroud)

除了当我改变在所述内面板的高度运行时,所述自动调整大小面板不AUTOSIZE:

在此输入图像描述

这当然适用于Delphi 5,7,可能还有XE2 - XE5.

有什么问题?

当然,解决方法是绕过Alignment/Autosize并在各种OnResize事件期间执行所有操作.但那显然不是RAD.我确定这是VCL中的一个小错误.而且由于我们已经修补了大约二十二个XE6 VCL错误,因此修复它会更好,所以没有其他人需要考虑它.

奖金Chatter

我喜欢这条线:

并且,您能否附上示例项目?

这几乎就像没有人打算甚至试图重现它.

Ian*_*oyd 6

问题是TWinControl.AlignControls中的回归:

procedure TWinControl.AlignControls(AControl: TControl; var Rect: TRect);
begin
   //...snip

   // Apply any constraints
   if Showing and ((sfWidth in FScalingFlags) or (sfHeight in FScalingFlags)) then
      DoAdjustSize;

   //...snip
end;
Run Code Online (Sandbox Code Playgroud)

这里的错误是DoAdjustSize除非存在sfWidthsfHeight缩放标志,否则它不会调用.

解决方法是不要试图超越自己,DoAdjustSize无论如何:

procedure TWinControl.AlignControls(AControl: TControl; var Rect: TRect);
begin
   //...snip

   // Apply any constraints
   //QC125995: Don't look to scaling flags to decide if we should adjust size
   if Showing {and ((sfWidth in FScalingFlags) or (sfHeight in FScalingFlags))} then
      DoAdjustSize;

   //...snip
end;
Run Code Online (Sandbox Code Playgroud)

通过找到此修复程序,除了使用TOleControl(例如TWebBrowser)而不是TPanel之外,我们已经解决了类似问题.

注意:任何代码都会发布到公共领域.无需归属.


Tom*_*erg 5

据Embarcaderos Quality Central报道:

我可以用XE6重现这个,但不能用XE7重现.