【问题标题】:Setting the WindowState is showing the form设置 WindowState 正在显示表单
【发布时间】:2020-12-15 03:37:10
【问题描述】:

我的许多应用程序表单都继承自一个基础表单,该表单加载在 FormClose 期间记录的保存的窗口大小、位置和状态,并在 FormShow 期间应用它。

FormShow 的后代版本中的inherited; 行通常位于方法的开头,并且通常后面有相当数量的代码,这些代码需要在表单已创建,以便可以对其进行操作和设置。

我遇到的问题是表单通常隐藏到后代 FormShow 事件结束,这是预期的行为,除非正在设置 WindowState到祖先类 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 之外,还有其他方法可以将表单设置为最大化而不实际显示吗表格?

【问题讨论】:

    标签: delphi vcl windowstate


    【解决方案1】:

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

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

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

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

    【讨论】:

    • 我同意使用 FormActivate 可能需要一些逻辑来指示它第一次触发它可以加载表单状态,但随后的触发应该什么都不做。不用担心 FormShow,因为我从不使用 FormHide。最后,我在 FormShow 事件结束时为每个需要它的后代表单编写了 LoadFormState。
    • 使用 FormShow 也是如此,因为它也可以在您的应用程序执行期间被多次调用。
    • 不知道你在说什么。是的。 FormShow 可以多次调用,但前提是用户关闭并重新打开表单,并且由于我在关闭时存储表单状态,因此当重新打开表单时,它将重新加载尺寸和位置,就像它关闭时一样,所以是的,状态总是一样的。由于我的表单永远不会隐藏,只会被销毁,因此 FormShow 事件不能对任何给定的表单实例执行多次,因此为什么我的 LoadFormState 是 FormShow 事件中的最后一段代码。如果您最小化/最大化表单然后恢复它,则不会触发 FormShow。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-01
    • 1970-01-01
    • 2011-12-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多