这种情况发生在所有 Delphi XE3 之前的版本中:
- 创建一个表单并在其上放置一个面板。将面板锚定到
[akLeft, akTop, akRight, akBottom]
,但在面板和边框之间留出空间。 - 添加一个调用
RecreateWnd()
的按钮 - 运行应用程序。调整表单大小,使面板隐藏,因为由于锚定,面板大小小于 0 像素。 按 RecreateWnd 按钮。
- 重新调整表单大小,并注意面板的锚定已损坏。
自从我记得自己使用 Delphi 以来, anchor 总是因为这个而无法使用。调整表单大小,然后将其停靠:窗口将重新创建,您的布局将被破坏。
我想知道是否有某种解决方法?
更新
评论中提供了两种解决方法,一种经过验证且稳定,但形式闪烁,另一种是实验性的,但可能更彻底和干净。
我暂时不会投票给任何一个,因为其中一个是我的,我什至不确定它是否稳定。相反,我会等待一些公众意见。
最佳答案
我使用过的两个选项对于底部和右侧 anchor 的问题都不是真正理想的:
- 在调用或导致调用
RecreateWnd();
之前再次将窗口变大,然后再次将其变小。然而,在你再次缩小它之前必须是可见的。 - 设置表单的约束,使其大小不会调整得太小而导致内容最终被隐藏。
一个闪烁较大表单的示例,使用足够大的高度和宽度值,以便面板不会隐藏:
procedure TForm1.Button1Click(Sender: TObject);
Var
OldWidth, OldHeight : integer;
begin
OldWidth := Form1.Width;
OldHeight := Form1.Height;
Form1.Visible := false;
Form1.Width := 1000;
Form1.Height := 800;
RecreateWnd();
Form1.Visible := true;
Form1.Width := OldWidth;
Form1.Height := OldHeight;
end;
关于delphi - 重新创建窗口时 anchor 被破坏的解决方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15062571/