设置 WindowState 显示表单
Setting the WindowState is showing the form
我的许多应用程序表单继承自一个基本表单,该表单加载在 FormClose 期间记录的已保存 window 大小、位置和状态,并在 期间应用它]FormShow.
FormShow 的后代版本中的 inherited;
行通常位于方法开头的位置,通常后面跟着大量代码这需要创建表单上的可视组件,以便可以对其进行操作和设置。
我遇到的问题是表单通常隐藏到后代 FormShow 事件结束,这是预期的行为,除非 WindowState 在祖先 class FormShow 事件中被设置为 wsMaximized。在这种情况下,一旦执行了 inherited;
行,表单就会变得可见,并且您可以看到剩余的视觉元素得到组织。
当设置一个VCL.Forms.TForm的WindowState属性时,执行如下代码:
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;
问题的明显原因在该方法中; ShowWindow
或 RecreateWnd
,这似乎会触发立即绘制表单。
除了将我的 LoadFormState(Self);
方法从 TBaseForm.FormShow 移动到 TBaseForm.FormActivate 之外,还有吗还有其他方法可以将表单设置为最大化而不实际显示表单吗?
您不应该从 TBaseForm.FormShow
或 TBaseForm.FormActivate
调用您的 LoadFromState
过程。
每次表单的可见性从 False
变为 True
时调用 TBaseForm.FormShow
。
因此,例如,如果您在显示另一个表单时隐藏您的 from,然后在另一个表单关闭后再次显示它,TBaseForm.FormShow
将触发,因此您将从保存的状态加载表单的尺寸和位置,这可能与当表单被隐藏时。自应用程序启动以来,用户可能已经移动并调整了 from 的大小。
这将导致表单在用户不希望这样做的情况下移动其位置,因此它会惹恼您的用户。
也不要使用 TBaseForm.FormActivate
,因为每次 Form 获得焦点时都会触发。因此,将焦点从另一个移回这个焦点会 TBaseForm.FormActivate
,从而将您的表单尺寸和位置更改为保存的状态,当表单失去焦点时,这可能不是状态。
您调用加载表单初始属性的 LoadFormState
过程的正确位置是在表单构造函数中。
我的许多应用程序表单继承自一个基本表单,该表单加载在 FormClose 期间记录的已保存 window 大小、位置和状态,并在 期间应用它]FormShow.
FormShow 的后代版本中的 inherited;
行通常位于方法开头的位置,通常后面跟着大量代码这需要创建表单上的可视组件,以便可以对其进行操作和设置。
我遇到的问题是表单通常隐藏到后代 FormShow 事件结束,这是预期的行为,除非 WindowState 在祖先 class FormShow 事件中被设置为 wsMaximized。在这种情况下,一旦执行了 inherited;
行,表单就会变得可见,并且您可以看到剩余的视觉元素得到组织。
当设置一个VCL.Forms.TForm的WindowState属性时,执行如下代码:
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;
问题的明显原因在该方法中; ShowWindow
或 RecreateWnd
,这似乎会触发立即绘制表单。
除了将我的 LoadFormState(Self);
方法从 TBaseForm.FormShow 移动到 TBaseForm.FormActivate 之外,还有吗还有其他方法可以将表单设置为最大化而不实际显示表单吗?
您不应该从 TBaseForm.FormShow
或 TBaseForm.FormActivate
调用您的 LoadFromState
过程。
False
变为 True
时调用 TBaseForm.FormShow
。
因此,例如,如果您在显示另一个表单时隐藏您的 from,然后在另一个表单关闭后再次显示它,TBaseForm.FormShow
将触发,因此您将从保存的状态加载表单的尺寸和位置,这可能与当表单被隐藏时。自应用程序启动以来,用户可能已经移动并调整了 from 的大小。
这将导致表单在用户不希望这样做的情况下移动其位置,因此它会惹恼您的用户。
也不要使用 TBaseForm.FormActivate
,因为每次 Form 获得焦点时都会触发。因此,将焦点从另一个移回这个焦点会 TBaseForm.FormActivate
,从而将您的表单尺寸和位置更改为保存的状态,当表单失去焦点时,这可能不是状态。
您调用加载表单初始属性的 LoadFormState
过程的正确位置是在表单构造函数中。