【发布时间】:2013-10-29 02:40:17
【问题描述】:
将表单设置为WindowState = wsMaximized 有时会导致表单最大化但不会:
长期错误:这是我在 2003 年首次在 Borland 新闻组中提出的问题:
然后在 2006 年再次:
然后在 2008 年再次:
2012 年有人在 Embarcadero 论坛上问过这个问题:
现在是时候将这个存在 18 年之久的错误移植到 Stackoverflow。也许有人终于找到了解决方法。
复制步骤:
我的帖子包含六种失败模式,但最简单的是:
-
在表单上放置
Label和Edit: -
为
TEdit添加OnEnter事件: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 更改为 anything else 并不能解决问题。
解决方法
我一直在使用的一个可怕、丑陋、可怕、恶心的解决方法是在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;
有时我发明了 Delphi 从未做过的 OnAfterShow 事件:
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;
但没有比 hack 更好的 hack。
【问题讨论】:
-
是否有需要注意的版本差异?标记 D5 和 D7?两者都失败?我也没有,只有D6。如果我在那里调试,那可能就足够了。
-
好吧,我无法在 D6 中重现。我需要使用 Windows 2000 吗? ;-)
-
它在 Windows 7 上的 Delphi 7 中失败(我昨天制作的屏幕截图)。如果它在 Delphi 8 中的 Windows 8 上失败,则没有任何消息;或 Delphi 8.1 中的 Windows 8.1。
-
对我来说不是。虽然我使用的是 D6。请使用@myname 以便我收到通知。
-
无法在 Windows 7 上使用 Delphi XE4 重现
标签: delphi delphi-7 vcl delphi-5