设置 WindowState 显示表单

Setting the WindowState is showing the form

我的许多应用程序表单继承自一个基本表单,该表单加载在 FormClose 期间记录的已保存 window 大小、位置和状态,并在 期间应用它]FormShow.

FormShow 的后代版本中的 inherited; 行通常位于方法开头的位置,通常后面跟着大量代码这需要创建表单上的可视组件,以便可以对其进行操作和设置。

我遇到的问题是表单通常隐藏到后代 FormShow 事件结束,这是预期的行为,除非 WindowState 在祖先 class FormShow 事件中被设置为 wsMaximized。在这种情况下,一旦执行了 inherited; 行,表单就会变得可见,并且您可以看到剩余的视觉元素得到组织。

当设置一个VCL.Forms.TFormWindowState属性时,执行如下代码:

procedure TCustomForm.SetWindowState(Value: TWindowState);
const
  ShowCommands: array[TWindowState] of Integer =
    (SW_SHOWNORMAL, SW_MINIMIZE, SW_SHOWMAXIMIZED);
begin
  if FWindowState <> Value then
  begin
    FWindowState := Value;
    if not (csDesigning in ComponentState) then
    begin
      if Showing then
        ShowWindow(Handle, ShowCommands[Value])
      else if HandleAllocated and (FWindowState = wsMaximized) then
        RecreateWnd;
    end;
  end;
end;

问题的明显原因在该方法中; ShowWindowRecreateWnd,这似乎会触发立即绘制表单。

除了将我的 LoadFormState(Self); 方法从 TBaseForm.FormShow 移动到 TBaseForm.FormActivate 之外,还有吗还有其他方法可以将表单设置为最大化而不实际显示表单吗?

您不应该从 TBaseForm.FormShowTBaseForm.FormActivate 调用您的 LoadFromState 过程。

每次表单的可见性从 False 变为 True 时调用

TBaseForm.FormShow
因此,例如,如果您在显示另一个表单时隐藏您的 from,然后在另一个表单关闭后再次显示它,TBaseForm.FormShow 将触发,因此您将从保存的状态加载表单的尺寸和位置,这可能与当表单被隐藏时。自应用程序启动以来,用户可能已经移动并调整了 from 的大小。
这将导致表单在用户不希望这样做的情况下移动其位置,因此它会惹恼您的用户。

也不要使用 TBaseForm.FormActivate,因为每次 Form 获得焦点时都会触发。因此,将焦点从另一个移回这个焦点会 TBaseForm.FormActivate,从而将您的表单尺寸和位置更改为保存的状态,当表单失去焦点时,这可能不是状态。

您调用加载表单初始属性的 LoadFormState 过程的正确位置是在表单构造函数中。