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

delphi – TPanel在包含TPanel时不会自动调整大小

发布时间:2020-12-15 04:23:43 所属栏目:大数据 来源:网络整理
导读:我在另一个内部有一个面板: 内部面板对齐alTop: 并且外部面板设置为AutoSize = true: 一切都很大.如果我在设计时更改了内部面板的高度,外部面板会自动调整大小以适应它: 现在运行时 现在我需要change the height of the inner panel at runtime: proced
我在另一个内部有一个面板:

内部面板对齐alTop:

并且外部面板设置为AutoSize = true:

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

现在运行时

现在我需要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;

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

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

有什么问题?

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

奖金Chatter

我喜欢这条线:

and,could you please attach sample project?

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

解决方法

问题是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;

这里的错误是它不会调用DoAdjustSize,除非存在sfWidth或sfHeight缩放标志.

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

Note: Any code released into public domain. No attribution required.

(编辑:李大同)

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

    推荐文章
      热点阅读