将表单设置为WindowState = wsMaximized有时会导致表单最大化但不会:

长期存在的错误:这是我在 2003 年首次在 Borland 新闻组中提出的问题:
然后在 2006 年再次:
然后在 2008 年再次出现:
有人在 2012 年的 Embarcadero 论坛上问过:
现在是时候将这个 18 年前的 bug 移植到 Stackoverflow 上了。也许有人终于想出了一个解决方法。
重现步骤:
我的帖子包含六种故障模式,但最简单的是:
- 将 a - Label和 an- Edit放在表单上: 
- 为:添加 - OnEnter事件- TEdit- procedure TForm1.Edit1Enter(Sender: TObject); begin Label1.Font.Style := Label1.Font.Style + [fsBold]; end;
- 并设置表格: - WindowState到wsMaximized
- AutoScroll为假
 
和 bazinga,失败了。
2008 年帖子的另一组步骤之一:
- 创建一个新的应用程序和一个表单。
- 在设计时将窗体设置为最大化 (WindowState = wsMaximized)。
- 将 ListView 控件拖放到窗体上
在 OnShow 期间,将 20 个空项添加到列表视图:
procedure TForm1.FormShow(Sender: TObject); var i: Integer; begin for i := 1 to 20 do ListView1.Items.Add; end;
在设计时将窗体的 AutoScroll 属性设置为 false (AutoScroll = False)
当然,我不追求的是“在 RadStudio 版本n中修复。只需使用它”。我正在寻找一个实际的修复(如果有的话);这可能包括在 CodeGear 最终修复它时引用 VCL 源的相关更改。(如果它甚至是固定的)。
注意:Position从poDesigned更改为其他任何东西都不能解决它。
解决方法
我一直在使用的一个可怕、丑陋、可怕、恶心的解决方法是在 期间启动一个计时器OnShow,然后当计时器触发时,最大化表单:
procedure TForm1.tmrVclMaximizeHackTimer(Sender: TObject);
begin
   Self.WindowState := wsMaximized;
end;
我后来改进了这个技巧,以便在OnShow;期间发布一条消息。这与定时器消息基本相同,无需使用定时器:
const
  WM_MaximizeWindow = WM_APP + $03;
procedure TForm1.FormShow(Sender: TObject);
begin
  if (Self.WindowState = wsMaximized) then
  begin
     Self.WindowState := wsNormal;
     PostMessage(Self.Handle, WM_MaximizeWindow , 0, 0);
  end;
end;
private
   procedure WMMaximizeWindow(var Message: TMessage); message WM_MaximizeWindow;
procedure TForm1.WMMaximizeWindow(var Message: TMessage);
begin
   Self.WindowState := wsMaximized;
end;
有时我会发明OnAfterShowDelphi 从未做过的事件:
const
  WM_AfterShow = WM_APP + $02;
procedure TForm1.FormShow(Sender: TObject);
begin
  PostMessage(Self.Handle, WM_AfterShow, 0, 0);
  if (Self.WindowState = wsMaximized) then
  begin
     Self.WindowState := wsNormal;
     FMaximizeNeeded := True;
  end;
end;
private
   procedure WMAfterShow(var Message: TMessage); message WM_AfterShow;
procedure TForm1.WMAfterShow(var Message: TMessage);
begin
   if FMaximizeNeeded then
   begin    
      FMaximizeNeeded := False;
      Self.WindowState := wsMaximized;
   end;
end;
但是没有黑客比黑客更好。