我有一个始终总是最初最大化的应用程序。这包括将Self.WindowState := wsMaximized;
放在主表单的OnCreate
中。
在此之前,如果用户要将窗口状态更改为wsNormal
,我将分配主窗体的默认尺寸。
因此,简而言之,主表单的OnCreate
处理程序看起来像:
procedure TfrmMain.FormCreate(Sender: TObject);
begin
Width:= 1300;
Height:= 800;
WindowState:= wsMaximized;
end;
从理论上讲,我可以在设计时分配这些尺寸,这正是我所需要的。但是,由于屏幕的大小以及IDE的大小,如果不滚动就无法一眼看到整个窗体。在设计中,我将表单尺寸保持较小,因此可以看到所有内容。但是在运行时,我需要分配这些默认尺寸,然后默认将其最大化。当用户将窗口状态更改为最大化时,我希望它会达到我动态分配的尺寸。
问题在于,在最大化表单后,它似乎失去了这些尺寸,并且恢复了设计时的任何值。如果我注释掉WindowState:= wsMaximized;
行,那么它将以所需的默认尺寸显示表单。但是,最大化它似乎会覆盖并忽略我之前为其分配的这些值。
如何创建并显示默认情况下最大化的主表单,同时动态分配默认大小,而不会丢失分配的值?
答案 0 :(得分:4)
(已通过10.3.3确认。) 我无法查明此问题的确切原因,但合理的原因是在构造函数期间正在读取表单组件,并且以前的大小似乎已明确备份:
procedure TControl.SetWidth(Value: Integer);
begin
SetBounds(FLeft, FTop, Value, FHeight);
Include(FScalingFlags, sfWidth);
if csReading in ComponentState then
FExplicitWidth := FWidth;
end;
一种可行的解决方案是像现在一样在OnCreate
事件中设置所需的大小,但是将所需的WindowsState的设置推迟到OnShow
事件中。
procedure TForm1.FormCreate(Sender: TObject);
begin
Width := 1300;
Height := 800;
end;
procedure TForm1.FormShow(Sender: TObject);
begin
WindowState := wsMaximized;
end;
当然,您可能应该使用a one-off mechanism来阻止连续的呼叫。 也请看看wsMaximized forms do not appear maximized。
答案 1 :(得分:3)
显然,VCL并没有存储显式的中间大小(无论如何在某些Delphi版本中),但似乎在实际显示表单时将更改与最大化的合并。
就像Sertac Akyuz一样,您可以使用SetWindowPlacement绕过VCL干扰:
procedure TForm1.FormCreate(Sender: TObject);
var
WindowPlacement: TWindowPlacement;
begin
GetWindowPlacement(Handle, WindowPlacement);
WindowPlacement.rcNormalPosition := Bounds(Left, Top, 1300, 800);
WindowPlacement.showCmd := SW_SHOWMAXIMIZED;
SetWindowPlacement(Handle, WindowPlacement);
end;
答案 2 :(得分:1)
您必须在FormActivate上设置表单大小:
procedure TfrmMain.FormActivate(Sender: TObject);
begin
if Tag = 0 then
begin
// Top := 100;
// Left := 100;
Width:= 1300;
Height:= 800;
WindowState:= wsMaximized;
Tag := 1;
end;
end;