我有一个应用程序,它总是一开始就开始最大化。这包括将Self.WindowState := wsMaximized;
放入主表单的OnCreate
中。
在此之前,如果用户要将窗口状态更改为wsNormal
,我将指定主窗体的默认维度。
因此,简而言之,主表单的OnCreate
处理程序看起来如下所示:
procedure TfrmMain.FormCreate(Sender: TObject);
begin
Width:= 1300;
Height:= 800;
WindowState:= wsMaximized;
end;
从理论上讲,我可以在设计时分配这些维度,这可以满足我的需要。但是,由于我的屏幕的大小,以及IDE,整个表单在没有滚动的情况下是看不见的。在设计中,我把表单大小保持在很小的范围内,这样我就能看到所有的东西。但是在运行时,我需要分配这些默认维度,然后在默认情况下最大化它。当用户将窗口状态更改为最大化时,我希望它进入我动态分配的维度。
问题是,它似乎失去了这些维度后,最大化的形式,并恢复到任何价值在设计时。如果我注释掉行WindowState:= wsMaximized;
,那么它将以所需的默认维度显示表单。然而,最大化它似乎覆盖和忽略了我之前分配的这些值。
如何在默认情况下最大限度地创建和显示我的主表单,同时动态地分配默认大小,而不丢失已分配的值?
发布于 2020-06-27 05:56:31
(确认为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;
当然,您可能应该使用一次性机制来防止连续调用。请你也看看wsMaximized窗体未显示为最大化。
发布于 2020-06-29 10:31:22
显然,VCL并不存储显式的中间大小(无论如何在一些Delphi版本中),而是在实际显示表单时将更改与最大化的更改合并起来。
正如谢尔塔克·阿尤兹非常正确的建议,您可以使用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;
发布于 2020-06-26 23:44:54
必须在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;
https://stackoverflow.com/questions/62604026
复制相似问题