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

Jer*_*dge 3 delphi vcl windows-10 delphi-10.1-berlin

我有一个应用程序,它最初总是以最大化的方式启动。这包括推杆Self.WindowState := wsMaximized;OnCreate主窗体的。

在此之前,如果用户要将窗口状态更改为wsNormal.

所以,简而言之,主窗体的OnCreate处理程序看起来像:

procedure TfrmMain.FormCreate(Sender: TObject);
begin
  Width:= 1300;
  Height:= 800;
  WindowState:= wsMaximized;
end;
Run Code Online (Sandbox Code Playgroud)

从理论上讲,我可以在设计时分配这些维度,而这正是我所需要的。但是,由于我的屏幕和 IDE 的大小,如果不滚动,整个表单一目了然。在设计中,我保持表格尺寸小,所以我可以看到一切。但是在运行时,我需要分配这些默认尺寸,然后默认最大化。当用户将窗口状态更改为最大化时,我希望它会转到我动态分配的那些维度。

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

如何创建和显示默认最大化的主窗体,同时动态分配默认大小,而不会丢失分配的值?

NGL*_*GLN 5

(已在 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;
Run Code Online (Sandbox Code Playgroud)

一个可能的解决方案是在OnCreate事件中设置所需的大小,就像您现在所做的那样,但将所需的 WindowsState 设置推迟到OnShow事件发生之前。

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

procedure TForm1.FormShow(Sender: TObject);
begin
  WindowState := wsMaximized;
end;
Run Code Online (Sandbox Code Playgroud)

当然,您可能应该使用一次性机制来防止连续调用。请看一下wsMaximized 表单也没有出现最大化