[Delphi:90183] マルチモニタ環境でのFormのAlign

593 views
Skip to first unread message

MoonDoldo

unread,
Dec 23, 2007, 10:37:51 AM12/23/07
to Del...@ml.users.gr.jp
 MoonDoldoです、こんばんは。

マルチモニタ環境で、例えばモニタ2番目にフォームを移動後
Form1.Align := alTop;
等とすると、必ず1番目のモニタで表示されてしまいます。

フォームごとに親となるモニタの設定があるのかな?と予想しつつ
Form1.Monitorあたりを調べてみたのですが、このあたりは全部ReadOnlyプロパ
ティーで書き込み出来ない様です。

親となるモニタの設定が出来るプロパティ・メソッドが存在しているのか、それ
ともAlignはそういう仕様で何かしら細工が必要なのか…マルチモニタの情報が
あまり見つからないのでちょっと詰んでる状況です。

何かヒントを下さい、よろしくお願いします。

ムーンドルド


MUROHASHI Yuzo

unread,
Dec 24, 2007, 3:08:16 AM12/24/07
to Del...@ml.users.gr.jp
室橋雄三@自宅です。
お世話になっております。

ムーンドルド さん
---
> 必ず1番目のモニタで表示されてしまいます。
---


Delphi 7 ですが、ちょっと調べてみました。

Form1.Align := alTop;
- procedure TControl.SetAlign(Value: TAlign);
- procedure TWinControl.AdjustSize;
- procedure TCustomForm.RequestAlign;
- procedure TScreen.AlignForm(AForm: TCustomForm);
- procedure TScreen.AlignForms(AForm: TCustomForm; var Rect: TRect);

このような挙動になっていて、
TScreen.AlignForms メソッドの Rect パラメータに指定したサイズに
リサイズされるようです。

TScreen.AlignForm メソッドで Rect の設定値を取得する時、
---
SystemParametersInfo(SPI_GETWORKAREA, 0, @Rect, 0);
AlignForms(AForm, Rect);
---
と処理されていて、
---
【MSDNより抜粋】
SPI_GETWORKAREA

プライマリモニタの作業領域のサイズを取得します。
作業領域とは、画面全体からシステムのタスクバーや
アプリケーションのツールバーが占有する領域を除いた部分を意味します。
pvParam パラメータで、1 個の RECT 構造体へのポインタを指定します。
関数から制御が返ると、この構造体に、仮想画面の座標に基づく、
作業領域の座標が格納されます。

プライマリモニタ以外のモニタの作業領域を取得するには、
GetMonitorInfo 関数を使います。
---
と説明があるように、常にプライマリモニタの作業領域が取得されるため、
期待通りに動作しないようです。

個人的にVCLに細工するのはちょっと抵抗あります。
Alignを使わないで、Screen.MonitorFromWindow、WM_NCLBUTTONDOWN あたりを
駆使して代替した方が無難かもしれませんね・・・。

n n
+=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- d(^n^)b -=+
| 室橋雄三 [MUROHASHI Yuzo] |
| Mail: maxi...@power.email.ne.jp |
+=- q(-~-)p -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=+
U U

MoonDoldo

unread,
Dec 25, 2007, 9:49:15 PM12/25/07
to Del...@ml.users.gr.jp
 MoonDoldoです。

室橋雄三さんお返事ありがとうございます。

>TScreen.AlignForm メソッドで Rect の設定値を取得する時、
>---
>SystemParametersInfo(SPI_GETWORKAREA, 0, @Rect, 0);
>AlignForms(AForm, Rect);
>---
>と処理されていて、
>---

~中略~

>と説明があるように、常にプライマリモニタの作業領域が取得されるため、
>期待通りに動作しないようです。

なるほど…仕様でしたか、がっくし。

助かりました、情報ありがとうございます。
どうにか細工して実現してみようと思います。

Hikaru Fukushi

unread,
Dec 25, 2007, 10:06:17 PM12/25/07
to Del...@ml.users.gr.jp
MoonDoldoさん、こんにちは。福士と申します。

蛇足ですが。

> >と説明があるように、常にプライマリモニタの作業領域が取得されるため、
> >期待通りに動作しないようです。
>
> なるほど…仕様でしたか、がっくし。
>
> 助かりました、情報ありがとうございます。
> どうにか細工して実現してみようと思います。

この処理に介入する方法ですが、TCustomForm.RequestAlignが
protectedで仮想関数になっていますので、該当のフォームで
RequestAlignをoverrideして(Forms.pasの該当部分を参考に)
所望の処理を記述するのが楽だと思います。


+=========+=========+=========+=========+=========+=========+=========+
東洋テクニカルシステム株式会社 システム開発部 福士 光
Hikaru Fukushi (Toyo Technical System Inc.)
mailto:fuk...@tts-inc.co.jp
+=========+=========+=========+=========+=========+=========+=========+

MoonDoldo

unread,
Dec 28, 2007, 10:49:52 PM12/28/07
to Del...@ml.users.gr.jp
 MoonDoldoです。

福士さんお返事ありがとうございます。

> この処理に介入する方法ですが、TCustomForm.RequestAlignが
>protectedで仮想関数になっていますので、該当のフォームで
>RequestAlignをoverrideして(Forms.pasの該当部分を参考に)
>所望の処理を記述するのが楽だと思います。

おお、なるほど…
こういう既存の処理を変えるのって、どの部分で自分の書いた処理を入れるかが
悩みどころ&重要なので、ポイントを教えていただくととても助かります。

教えていただきありがとうございます。

ムーンドルド

Reply all
Reply to author
Forward
0 new messages