【发布时间】:2020-12-15 03:37:10
【问题描述】:
我的许多应用程序表单都继承自一个基础表单,该表单加载在 FormClose 期间记录的保存的窗口大小、位置和状态,并在 FormShow 期间应用它。
FormShow 的后代版本中的inherited; 行通常位于方法的开头,并且通常后面有相当数量的代码,这些代码需要在表单已创建,以便可以对其进行操作和设置。
我遇到的问题是表单通常隐藏到后代 FormShow 事件结束,这是预期的行为,除非正在设置 WindowState到祖先类 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 之外,还有其他方法可以将表单设置为最大化而不实际显示吗表格?
【问题讨论】:
标签: delphi vcl windowstate