将表单设置为WindowState = wsMaximized
有时会导致表单最大化但不会:
长期存在的错误:这是我在 2003 年首次在 Borland 新闻组中提出的问题:
然后在 2006 年再次:
然后在 2008 年再次出现:
有人在 2012 年的 Embarcadero 论坛上问过:
现在是时候将这个 18 年前的 bug 移植到 Stackoverflow 上了。也许有人终于想出了一个解决方法。
重现步骤:
我的帖子包含六种故障模式,但最简单的是:
将 a
Label
和 anEdit
放在表单上:为:添加
OnEnter
事件TEdit
procedure TForm1.Edit1Enter(Sender: TObject); begin Label1.Font.Style := Label1.Font.Style + [fsBold]; end;
并设置表格:
WindowState
到wsMaximizedAutoScroll
为假
和 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;
有时我会发明OnAfterShow
Delphi 从未做过的事件:
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;
但是没有黑客比黑客更好。