在最大化丢失分配的值之前动态分配表单大小

时间:2020-06-26 23:05:29

标签: delphi windows-10 vcl delphi-10.1-berlin

我有一个始终总是最初最大化的应用程序。这包括将Self.WindowState := wsMaximized;放在主表单的OnCreate中。

在此之前,如果用户要将窗口状态更改为wsNormal,我将分配主窗体的默认尺寸。

因此,简而言之,主表单的OnCreate处理程序看起来像:

procedure TfrmMain.FormCreate(Sender: TObject);
begin
  Width:= 1300;
  Height:= 800;
  WindowState:= wsMaximized;
end;

从理论上讲,我可以在设计时分配这些尺寸,这正是我所需要的。但是,由于屏幕的大小以及IDE的大小,如果不滚动就无法一眼看到整个窗体。在设计中,我将表单尺寸保持较小,因此可以看到所有内容。但是在运行时,我需要分配这些默认尺寸,然后默认将其最大化。当用户将窗口状态更改为最大化时,我希望它会达到我动态分配的尺寸。

问题在于,在最大化表单后,它似乎失去了这些尺寸,并且恢复了设计时的任何值。如果我注释掉WindowState:= wsMaximized;行,那么它将以所需的默认尺寸显示表单。但是,最大化它似乎会覆盖并忽略我之前为其分配的这些值。

如何创建并显示默认情况下最大化的主表单,同时动态分配默认大小,而不会丢失分配的值?

3 个答案:

答案 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;
相关问题