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错误,因此修复它会更好,所以没有其他人需要考虑它.
我喜欢这条线:
并且,您能否附上示例项目?
这几乎就像没有人打算甚至试图重现它.
问题是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除非存在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;
Run Code Online (Sandbox Code Playgroud)
通过找到此修复程序,除了使用TOleControl(例如TWebBrowser)而不是TPanel之外,我们已经解决了类似问题.
注意:任何代码都会发布到公共领域.无需归属.