我的许多应用程序表单继承了一个基本窗体,它加载在FormClose中记录的保存的窗口大小、位置和状态,并在FormShow中应用它。
inherited;行位于FormShow的子代版本中,通常位于方法开头的位置,通常后面是相当多的代码,这些代码要求创建表单上的可视组件,以便操作和设置它们。
我遇到的问题是,表单通常隐藏到后代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;该问题的明显原因在于该方法中的某个地方:ShowWindow或RecreateWnd,这似乎正在触发要立即绘制的表单。
除了将我的TBaseForm.FormShow方法从TBaseForm.FormActivate,转移到TBaseForm.FormActivate,之外,还有其他方法可以使表单在没有实际显示表单的情况下被最大化吗?
发布于 2020-12-15 04:22:38
您不应该从TBaseForm.FormShow或TBaseForm.FormActivate调用您的TBaseForm.FormShow过程。
每次表单的可见性从False更改为True时,都会调用False。
因此,例如,如果您在显示另一个窗体时隐藏它,然后在另一个窗体关闭后再次显示它,TBaseForm.FormShow将触发,因此您将从保存的状态加载表单的尺寸和位置,而该状态可能与窗体隐藏时的状态不同。自应用程序启动以来,用户可能已经移动并调整了from的大小。
这将导致形式移动它的位置,而没有用户希望这样做,因此它将激怒您的用户地狱。
也不要使用TBaseForm.FormActivate,因为每次表单收到焦点时都会触发。因此,将焦点从另一个更改回这个焦点将是TBaseForm.FormActivate,从而将您的表单维度和位置更改为保存状态,当表单失去焦点时,这可能不是状态。
调用加载窗体初始属性的LoadFormState过程的正确位置在窗体构造函数中。
https://stackoverflow.com/questions/65299664
复制相似问题