我的许多应用程序表单都继承自一个基本表单,该表单加载在 FormClose 期间记录的保存的窗口大小、位置和状态,并在FormShow期间应用它。
FormShowinherited;
的后代版本中的行位于方法开头的通常位置,并且通常后面有相当数量的代码,这些代码需要创建表单上的可视组件,以便可以操作和设置它们.
我遇到的问题是表单通常隐藏到后代FormShow事件结束,这是预期的行为,除非在祖先类FormShow事件中将WindowState设置为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;
问题的明显原因在于该方法的某个地方。theShowWindow
或 the RecreateWnd
,这似乎触发了立即绘制表单。
除了将我的LoadFormState(Self);
方法从TBaseForm.FormShow移动到TBaseForm.FormActivate 之外,还有其他方法可以将表单设置为最大化而不实际显示表单吗?