フォームを次のように設定するWindowState = wsMaximizedと、フォームが最大化されることがありますが、そうではありません。

長年のバグ: これは、2003 年に Borland ニュースグループで最初に尋ねた質問です。
そして2006年に再び:
そして2008年に再び:
2012 年に Embarcadero フォーラムで誰かが質問しました。
18 年前のバグを Stackoverflow に移植するときが来ました。誰かが最終的に回避策を見つけたのかもしれません。
再現手順:
私の投稿には半ダースの失敗モードが含まれていましたが、最も簡単なのは次のとおりです。
LabelaとEdita をフォームにドロップします。
OnEnter次のイベントを追加しTEditます。procedure TForm1.Edit1Enter(Sender: TObject); begin Label1.Font.Style := Label1.Font.Style + [fsBold]; end;フォームを設定します。
WindowStatewsMaximizedへAutoScroll偽に
そしてバジンガ、失敗。
2008 年の投稿からの他の一連の手順の 1 つ:
- 新しいアプリとフォームを作成します。
- 設計時にフォームを最大化 (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 ソースへの関連する変更を引用することが含まれる可能性があります。(それが修正されている場合)。
注: poDesignedPositionから他のものに変更しても、問題は解決しません。
回避策
私が使用していた恐ろしい、醜い、ひどい、嫌な回避策は、 中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;
しかし、ハックよりも優れたハックはありません。