我在另一个内部有一个小组:
内部面板已对齐 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。
解决方法是什么?
当然,解决方法是绕过对齐 / 自动调整大小,并在各种 OnResize 事件中执行所有操作。但那显然不是RAD。我确定它是VCL中的一个小错误。而且由于我们已经修补了大约二十个XE6 VCL错误,因此修复它会更好,所以没有其他人需要考虑它。
我喜欢这条线:
并且,您能否附上示例项目?
这几乎就好像没有人打扰甚至试图重现它。
答案 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)