The Delphi Bug List

Entry No.
470
VCL - 一般 - フォーム
フォームが最大化/最小化/リストアされるとき、FormResize イベント内でのフォームの WindowState プロパティは正しい値ではない。WindowState は FormResize イベントの後に更新されている。
1.02 2.01 3.0 3.01 3.02 4.0 4.01 4.02 4.03 5.0 5.01 6.0 6.01 6.02 Kylix 1.0
Absent Absent Absent Absent Absent Exists Exists Exists Exists Unknown Unknown Unknown Unknown Unknown N/A
(訳注:5.01 日本語版では Exists でした)
解説
Reported by David Willis
再現するには、最大化/リストアの際に、FormResize イベント内で WindowState プロパティの値を確認してください。値は間違っています。Delphi 1.02 と Delphi 3 では正しい値を返します。添付のサンプルコードは、フォーム上のラベルを現在の WindowState の値で更新します。最大化とリストアを試してみてください。(訳注:添付ファイルは本家へのリンクです)

このバグを修正するには、FORMS.PAS を編集する必要があります。私は WM_SIZE メッセージをトラップすることで回避できると確信していますが、VCL のコードを修正しない回避方法は試していません。

TCustomForm.WMSize プロシージャを、WindowState プロパティをセットしている case 文の後で "inherited" が呼ばれるように修正する必要があります。
procedure TCustomForm.WMSize(var Message: TWMSize);
begin
  {inherited;}  // この行を削除

  if not (csDesigning in ComponentState) then
    case Message.SizeType of
      SIZENORMAL: FWindowState := wsNormal;
      SIZEICONIC: FWindowState := wsMinimized;
      SIZEFULLSCREEN: FWindowState := wsMaximized;
    end;
  inherited;    // ここに移動
  RequestAlign;
  ......
私は US 英語版 Delphi 4.0 Professional に 1998/08/12 のパッチを当てたバージョンを使用しています。
ユーザーからのコメント
Thad Suits
29 Dec 2003  09:46 PM GMT
このバグは Delphi 6.0 でも存在します。残念なことに、Delphi 4 用に提案されている上記の回避方法は Delphi 6 では使えませんでした。更新された回避方法を知ることが出来ればうれしいです。
Latest update of this entry: 1999-02-24
本家 The Delphi Bug List のエントリーはこちら
The Delphi Bug List 日本語訳 へ