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

时间:2015-04-01 15:33:55

标签: delphi vcl delphi-xe6

我在另一个内部有一个小组:

enter image description here

内部面板已对齐 alTop

enter image description here

外部面板设置为 AutoSize=true

enter image description here

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

enter image description here

现在运行时

现在我需要change the height of the inner panel at runtime

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

除非我在运行时更改内部面板的高度,否则自动调整大小面板不会自动调整大小

enter image description here

这当然适用于Delphi 5,7和probably XE2 - XE5

解决方法是什么?

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

Bonus Chatter

我喜欢这条线:

  

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

这几乎就好像没有人打扰甚至试图重现它。

2 个答案:

答案 0 :(得分: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;

此处的错误是除非存在 sfWidth sfHeight 缩放标记,否则不会调用DoAdjustSize

解决方法是不要试图超越自己,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;

找到此修复程序后,我们已经解决了the similar issue except with a TOleControl (e.g. TWebBrowser) rather than a TPanel

  

注意:任何已发布到公共领域的代码。无需归属。

答案 1 :(得分:5)

据Embarcaderos Quality Central报道:

  • QC125995:[XE6 Update1中的回归] TPanel.AutoSize无法正常工作
  • QC129330 :并不总是应用AutoSize属性

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