フォームを次のように設定するWindowState = wsMaximized
と、フォームが最大化されることがありますが、そうではありません。
長年のバグ: これは、2003 年に Borland ニュースグループで最初に尋ねた質問です。
そして2006年に再び:
そして2008年に再び:
2012 年に Embarcadero フォーラムで誰かが質問しました。
18 年前のバグを Stackoverflow に移植するときが来ました。誰かが最終的に回避策を見つけたのかもしれません。
再現手順:
私の投稿には半ダースの失敗モードが含まれていましたが、最も簡単なのは次のとおりです。
Label
aとEdit
a をフォームにドロップします。OnEnter
次のイベントを追加しTEdit
ます。procedure TForm1.Edit1Enter(Sender: TObject); begin Label1.Font.Style := Label1.Font.Style + [fsBold]; end;
フォームを設定します。
WindowState
wsMaximizedへ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;
しかし、ハックよりも優れたハックはありません。