delphi - 重新创建窗口时 anchor 被破坏的解决方法?

标签 delphi

这种情况发生在所有 Delphi XE3 之前的版本中:

  1. 创建一个表单并在其上放置一个面板。将面板锚定到[akLeft, akTop, akRight, akBottom],但在面板和边框之间留出空间。
  2. 添加一个调用RecreateWnd()的按钮
  3. 运行应用程序。调整表单大小,使面板隐藏,因为由于锚定,面板大小小于 0 像素。 按 RecreateWnd 按钮。
  4. 重新调整表单大小,并注意面板的锚定已损坏。

自从我记得自己使用 Delphi 以来, anchor 总是因为这个而无法使用。调整表单大小,然后将其停靠:窗口将重新创建,您的布局将被破坏。

我想知道是否有某种解决方法?

更新

评论中提供了两种解决方法,一种经过验证且稳定,但形式闪烁,另一种是实验性的,但可能更彻底和干净。

我暂时不会投票给任何一个,因为其中一个是我的,我什至不确定它是否稳定。相反,我会等待一些公众意见。

最佳答案

我使用过的两个选项对于底部和右侧 anchor 的问题都不是真正理想的:

  1. 在调用或导致调用 RecreateWnd(); 之前再次将窗口变大,然后再次将其变小。然而,在你再次缩小它之前必须是可见的。
  2. 设置表单的约束,使其大小不会调整得太小而导致内容最终被隐藏。

一个闪烁较大表单的示例,使用足够大的高度和宽度值,以便面板不会隐藏:

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/

相关文章:

delphi - 使用数组的包装类型时出现错误 "Record, object or class type required"

Delphi - ADODataSet 子集

delphi - 如何检查Application.MainForm是否有效?

sql-server - 在delphi TadoConnection中隐藏内存中的连接用户密码

ios - 尝试在 iOS8 上创建 TFileStream 对象时不允许操作

delphi - 当我给它一个负数时,为什么 Format with '%u' 打印出错误的值?

delphi - 如何解释 FastMM 或 GetProcessMemoryInfo 报告的内存使用情况的差异?

delphi - 在运行时更改 Delphi 样式不允许将文件拖放到表单中

sql-server - 根据ADO提供程序格式化日期

forms - 带有系统阴影的圆形形式