[delphi-users:5254] 複数起動時、表示位置をずらす方法

26 views
Skip to first unread message

kuze

unread,
Jul 31, 2019, 2:18:49 AM7/31/19
to delphi...@freeml.com
皆様

久世です。

このような質問は、既出のような気がするのですが、記事を見つけることが出来ませんでしたのでお知恵を貸してください。
同一アプリを複数起動する際、重ならないように少し右下に表示したいのですが、良い方法はありますでしょうか?

hosokawa

unread,
Jul 31, 2019, 3:44:21 AM7/31/19
to delphi...@freeml.com
久世さん

こんにちは。
細川です。

旧 Delphi-ML は新 Delphi-ML である Google Groups に移行しています。
今後は新 ML をご利用ください。

今回は、このまま続けます。

> 同一アプリを複数起動する際、重ならないように少し右下に表示したいのですが、良い方法はありますでしょうか?

TForm.Position を poDefaultPosOnly にする、という方法では上手くいかないという
ことですよね?

VCL: http://docwiki.embarcadero.com/Libraries/Rio/ja/Vcl.Forms.TForm.Position
FMX: http://docwiki.embarcadero.com/Libraries/Rio/ja/FMX.Forms.TForm.Position

OS に任せず自分で作る場合は、いくつか方法が考えられますが Windows だけで良い場
合は

・最後に起動したアプリの内まだ起動しているアプリの Window Handle を取得する
・GetWindowRect API を使ってウィンドウの位置を取る
・取得した位置から少しずらした位置に自分を移動する

という流れになると思います。

じゃあ「最後に起動したアプリの内まだ起動しているアプリの Window Handle を取得
する」っていうのはどうやるのかというと、これもいくつかやり方がありますね。

一例を示すと、

1.ユーザー定義メッセージを作成
2.ユーザー定義メッセージを受け取ったら起動時間を返すようにしておく
3.EnumWindows API でウィンドウを列挙して GetClassName API を使って自分と同じ
クラス名の物を見つける
4.見つかった Window Handle に対して SendMessage でユーザー定義メッセージを投
げて、起動時間を取得
5.起動時間が一番新しい Window Handle を使って位置を取得する

となるでしょうか。


よろしくお願いいたします。
Regards,
HOSOKAWA Jun
Application Division 3 Manager
embarcadero MVP for Delphi

[S/G] SERIALGAMES Inc.
TEL: 03-5812-4368
FAX: 03-5812-0970

---------------------------------------------------------------
このメールには、本来の宛先の方のみに限定された機密情報が含まれて
いる場合がございます。お心あたりのない場合は、送信者にご連絡のうえ、
このメールを削除してくださいますようお願い申し上げます。
PLEASE READ:This e-mail is confidential and intended for
the named recipient only. If you are not an intended recipient,
please notify the sender and delete this e-mail.
---------------------------------------------------------------


MLホームページ: https://www.freeml.com/delphi-users

----------------------------------------------------------------------
スマホアプリ版で100万ダウンロード突破の
「キャプテン翼ZERO~決めろ!ミラクルシュート~」
HTML5ゲームプラットフォーム「ゲソてん byGMO」にて、
PCブラウザ版を好評配信中!
https://gesoten.com/games/genre/sports/tsubasa-zero
------------------------------------------------------[freeml byGMO]--

「WiMAX(ワイマックス)」ならおトクなGMOとくとくBB。
今なら高額ポイントがもらえます♪
まずはかんたん登録♪ -ポイントタウン-
https://www.pointtown.com/ptu/rd.cgi?cid=9533
----------------------------------------------------------------------

kuze

unread,
Jul 31, 2019, 4:44:56 AM7/31/19
to delphi...@freeml.com

細川さん

久世です。

早速の回答ありがとうございます。
次回より新 Delphi-ML(Japan RAD Studio User Group)に
投稿するようにいたします。

> TForm.Position を poDefaultPosOnly にする、という方法では上手くいかな
いという
> ことですよね?

はい。Left, Topの値を起動時に触っているため、poDefaultPosOnly が
意味をなしていないのだと思います。

ただ、教えていただくまで、poDefaultPosOnly の機能のことが分かっていな
かったです。アドバイスありがとうございます。

起動中のアプリから少しずらした位置の計算が少し複雑だと思い、
便利なAPIがないか知りたかったのが本音ですが、自前で書くしか
ないということが分かりました。
表示位置が、下や右の端になった場合、左上に戻らないといけないと
思うのですがなかなか楽ができないものですね、、、

まずは、いただいたアドバイスをもとにコーディングしてみます。
MLホームページ: https://www.freeml.com/delphi-users

----------------------------------------------------------------------
【重要】必ずお読みください
■freeml byGMOサービス終了のお知らせ■
2019年12月2日(月)12:00をもちまして、
サービスの提供を終了させていただきます。
詳しくはこちら
http://ck.freeml.com/rd.php?cid=11272
Reply all
Reply to author
Forward
0 new messages