TForm.WindowStateについて

解決


o8o8  2010-11-13 16:18:28  No: 39534  IP: [192.*.*.*]

Delphi2007においてForm1.WindowState=wsMaximizedで設計したとき、
下記コードで最大化したときのサイズが取得できません。

procedure TForm1.FormCreate(Sender: TObject);
begin
  Edit1.Text := IntToStr(self.ClientWidth);
  Edit2.Text := IntToStr(self.ClientHeight);
end;

何か方法があるでしょうか。

編集 削除
 2010-11-13 18:00:50  No: 39535  IP: [192.*.*.*]

これでは?

procedure TForm1.FormShow(Sender: TObject);
begin
  Edit1.Text := IntToStr(self.ClientWidth);
  Edit2.Text := IntToStr(self.ClientHeight);
end;

編集 削除
o8o8  2010-11-13 18:32:18  No: 39536  IP: [192.*.*.*]

FormShowでも駄目でした。
Delphi7ではうまくいくのですが、
制御方法が変わったのでしょうか。

編集 削除
かず  2010-11-13 20:20:42  No: 39537  IP: [192.*.*.*]

FormShowで
IntToStr(Screen.width)でうまくいきます。

編集 削除
Mr.XRAY  2010-11-13 23:11:19  No: 39538  IP: [192.*.*.*]

こんにちは.Mr.XRAYです.

>制御方法が変わったのでしょうか。

制御方法が変わった,と言えば言えなくもないですが,
Delphi 2007以降では,Vista以降のOSのアプリケーションウィンドウに
対応するため,内部的に処理が変更されています.
OnShowでは取得できない場合があります.

取得した値をどんな目的で利用するかにもよりますが,
CM_SHOWINGCHANGEDメッセージかOnResizeイベントで取得してみてください.

今回の件で理解されたと思いますが,実行環境の記述は重要です.
「実行環境」には,OSも含まれます.

質問の趣旨がスクリーンのサイズ取得なのであればOnShowイベント内で
以下のように取得可能です(高さは,screen.Height)

>IntToStr(Screen.width)でうまくいきます。

参考までに.
http://ht-deko.minim.ne.jp/tech045.html#tech095
(個人的には,ちょっとキツイ内容とは思っていますが)

編集 削除
o8o8  2010-11-15 10:28:32  No: 39539  IP: [192.*.*.*]

>Delphi 2007以降では,Vista以降のOSのアプリケーションウィンドウに
>対応するため,内部的に処理が変更されています.

根本的に方法を変えないと駄目なようですね。
最初のコードに書きましたが、フォーム作成直後のクライアント領域の
幅高が必要なのですが、Screenサイズから求めるとなるとかなり手ごわそうです。
情報ありがとうございます。

編集 削除
Fusa  2010-11-15 11:29:27  No: 39540  IP: [192.*.*.*]

Form表示後に処理を行う 
http://delfusa.main.jp/delfusafloor/technic/technic/033_FormShowAfterEvent.html

こういうのでどうでしょうか?

編集 削除