[delphi-users:4048] ShowModal→FormShowの時に自らをクローズさせるには。

559 views
Skip to first unread message

OE

unread,
Jan 23, 2015, 2:57:21 AM1/23/15
to delphi...@freeml.com
こんにちは、お世話になります。
環境はWindows 7(64bit)でDelphi2010です。

フォームのあるWindowsを作っています。

メインフォームからサブフォームを、
ShowModalで生成して表示させています。

  ↓こんな感じです。
  //メインフォーム内のコード
fm_Test := Tfm_Test.Create(self);
try
fm_Test.Caption := 'Test';
fm_Test.ShowModal;
finally
fm_Test.Free;
end;

この時、サブフォームのFormShowのイベントにて、ある計算を行い、
結果によっては、サブフォーム自らをすぐに閉じたいです。

しかし、仮に単純に下記の通りにしても、閉じてくれないことが、
わかりました。
 //サブフォーム内のコード
procedure Tfm_Test.FormShow(Sender: TObject);
begin
close;
end;

どうすれば、サブフォーム内のコードで自身を閉じることが
できるでしょうか。

よろしくお願いいたします。









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

----------------------------------------------------------------------
6┃0┃0┃0┃円┃分┃ギ┃フ┃ト┃券┃全┃員┃プ┃レ┃ゼ┃ン┃ト┃
━┛━┛━┛━┛━┛━┛━┛━┛━┛━┛━┛━┛━┛━┛━┛━┛━┛
<今だけ!>簡単なアンケート+無料相談で全員にギフト券プレゼント!
☆おかげさまでお申し込み者数7万人突破中!保険ゲートの無料相談☆
http://ad.freeml.com/cgi-bin/sa.cgi?id=muNuZ
------------------------------------------------------[freeml byGMO]--

umez

unread,
Jan 23, 2015, 3:27:17 AM1/23/15
to delphi...@freeml.com
こんにちは、梅澤@プロキャストです。

自分がよくやっている方法は、PostMessage() で、WM_CLOSEを呼ぶ方法
です。
以下のような感じ。

 //サブフォーム内のコード
procedure Tfm_Test.FormShow(Sender: TObject);
var
SuccSw: Boolean;
begin
// ここである処理をする
// 処理の成否がSuccSwに入っているとする。

if not SuccSw then begin
FForceCloseSw := True;
PostMessage(Handle, WM_CLOSE, 0, 0);
end;
end;


(不要かもしれませんが)
ダイアログのOnCloseQuery() イベントでダイアログを閉じるか
どうかの確認をしている場合は、フィールド変数で、
FForceCloseSw: Boolean;
を用意しておき、その値で問い合わせを出す/出さないを制御してい
ます。


OE <delphi...@freeml.com> さんは書きました。<2015/01/23>
----------
Tomomi Umezawa um...@procast.co.jp


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

----------------------------------------------------------------------
人気の≪温泉≫箱根・京都・南房総など人気の温泉リゾートに格安
で宿泊できる「体験宿泊」の情報をお届け致します。早い者勝ち!
■大感謝プラン(1):【平日】  ¥500~
■大感謝プラン(2):【土・連休】¥1,500~
http://ad.freeml.com/cgi-bin/sa.cgi?id=muNMt
------------------------------------------------------[freeml byGMO]--

noobow

unread,
Jan 23, 2015, 3:29:35 AM1/23/15
to delphi...@freeml.com
こんにちは

サブフォーム内のコードを以下のようにすれば
クローズできないでしょうか?

//サブフォーム内のコード
procedure Tfm_Test.FormShow(Sender: TObject);
begin
PostMessage(Handle,WM_CLOSE,0,0);
end;
http://ad.freeml.com/cgi-bin/sa.cgi?id=muNP0
------------------------------------------------------[freeml byGMO]--

akikamo

unread,
Jan 23, 2015, 3:30:17 AM1/23/15
to delphi...@freeml.com
OEさん、こんにちは

FormShowイベント中のクローズができないのは、Windowsの仕様で
ウィンドウの表示処理中のクローズは受け付けられないからです。

正しいかはわかりませんが、私は自動で閉じる必要があるときは、
下記のようにしています。

procedure Tfm_Test.FormShow(Sender: TObject);
begin
PostMessage(Handle, WM_CLOSE, 0, 0);
end;

PostMessage (WindowsAPI) を使うと Show イベントが終わった後に
WM_CLOSE メッセージを受けてフォームが閉じると思います。


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

----------------------------------------------------------------------
人気の≪温泉≫箱根・京都・南房総など人気の温泉リゾートに格安
で宿泊できる「体験宿泊」の情報をお届け致します。早い者勝ち!
■大感謝プラン(1):【平日】  ¥500~
■大感謝プラン(2):【土・連休】¥1,500~
http://ad.freeml.com/cgi-bin/sa.cgi?id=muNPZ
------------------------------------------------------[freeml byGMO]--

高木太郎

unread,
Jan 23, 2015, 7:32:31 PM1/23/15
to delphi...@freeml.com
イマジオムの高木です。 皆さん、お久しぶりです。

OE さん:
> フォームのあるWindowsを作っています。メインフォームから
> サブフォームを、ShowModalで生成して表示させています。
>
>   ↓こんな感じです。
>   //メインフォーム内のコード
> fm_Test := Tfm_Test.Create(self);
> try
> fm_Test.Caption := 'Test';
> fm_Test.ShowModal;
> finally
> fm_Test.Free;
> end;
>
> この時、サブフォームのFormShowのイベントにて、ある計算を行い、
> 結果によっては、サブフォーム自らをすぐに閉じたいです。
>
> しかし、仮に単純に下記の通りにしても、閉じてくれないことが、
> わかりました。
>  //サブフォーム内のコード
> procedure Tfm_Test.FormShow(Sender: TObject);
> begin
> close;
> end;
>
> どうすれば、サブフォーム内のコードで自身を閉じることが
> できるでしょうか。

 何人かの方から PostMessage(WM_CLOSE) を使う方法が
示されていますので、ちょっと別のアプローチをお話しします。

 まず OnShow イベントで表示可否を判定されていますが、
OnCreate イベントで判定して「否」の場合には Abort() を
呼び出す方法ではいけませんか? この方法だと、一瞬
サブフォームが表示されるのを防ぐことができます。

 またサブフォームを一瞬させないといけない(OnShow
以後に判定しなければならない)事情があるのであれば、
OnPaint イベントで表示の可否を判定し、閉じる方法も
使えます。 この方法だと直接 Windows APIを使わずに
すみます。
――――――――――――――――――――――――――――――――――――
株式会社イマジオム 代表取締役 高木太郎
〒316-0024 茨城県 日立市 水木町 1-11-10
電話:0294-28-0147
ファクシミリ:0294-28-0148
電子メール:tarou_...@imageom.co.jp
ホームページ:http://www.imageom.co.jp/


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

----------------------------------------------------------------------
デザインから、場所から、日時から予約できる
ネイル予約サービス「NAIL+(ネイルプラス)」
http://ad.freeml.com/cgi-bin/sa.cgi?id=muWBj
予約後にレビューすると3,000円キャッシュバック実施中♪
詳しくは△▲URL▲△を今すぐチェック!
------------------------------------------------------[freeml byGMO]--

遊歩人

unread,
Jan 23, 2015, 9:30:04 PM1/23/15
to delphi...@freeml.com
こんにちは。

>この時、サブフォームのFormShowのイベントにて、ある計算を行い、
>結果によっては、サブフォーム自らをすぐに閉じたいです。
文面だけでは、何とも判断が付きにくいのですが..
そもそも、この場合サブフォームを呼ぶ必要があるのかを検討する事も必要かと・・
メインで計算をさせ、必要だったらサブフォームを呼ぶとか・・

外していたら申し訳ないですが。

遊歩人


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

----------------------------------------------------------------------
6┃0┃0┃0┃円┃分┃ギ┃フ┃ト┃券┃全┃員┃プ┃レ┃ゼ┃ン┃ト┃
━┛━┛━┛━┛━┛━┛━┛━┛━┛━┛━┛━┛━┛━┛━┛━┛━┛
<今だけ!>簡単なアンケート+無料相談で全員にギフト券プレゼント!
☆おかげさまでお申し込み者数7万人突破中!保険ゲートの無料相談☆
http://ad.freeml.com/cgi-bin/sa.cgi?id=muXSn
------------------------------------------------------[freeml byGMO]--

OE

unread,
Jan 25, 2015, 10:36:44 PM1/25/15
to delphi...@freeml.com
>高木さん
Abort()でサブフォームが表示されるのを防ぎたいですし、
本来なら、OnShow以後に判定しなければならない事情など無いように
作るべきなのでしょうが…
今回はOnShow以後に判定の方式に逃げてしまってました。


>遊歩人さん
ごもっともでございます。
呼ぶ(生成)前に判定すべきなのですが、
複数フォームから様々な方法で呼び出されるので、
スマートでは無いのですが、呼んだ後の判定にしちゃいました。


>umezさん、noobowさん、akikamoさん、
ありがとうございました。
今回は、PostMessage(Handle, WM_CLOSE, 0, 0);
で行くことにします。


大変助かりました。
皆さま、ありがとうございました。


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

----------------------------------------------------------------------
人気の≪温泉≫箱根・京都・南房総など人気の温泉リゾートに格安
で宿泊できる「体験宿泊」の情報をお届け致します。早い者勝ち!
■大感謝プラン(1):【平日】  ¥500~
■大感謝プラン(2):【土・連休】¥1,500~
http://ad.freeml.com/cgi-bin/sa.cgi?id=mvwUe
------------------------------------------------------[freeml byGMO]--

高木太郎

unread,
Jan 25, 2015, 10:43:17 PM1/25/15
to delphi...@freeml.com
こんにちは、高木です。

OE さん:
> Abort()でサブフォームが表示されるのを防ぎたいですし、
> 本来なら、OnShow以後に判定しなければならない事情など
> 無いように作るべきなのでしょうが…
> 今回はOnShow以後に判定の方式に逃げてしまってました。

 PostMessage(WM_CLOSE) で行くと決められているところで
蛇足になりますが、ご参考までに……

 私なら、サブフォームに表示の可否を判定するクラス
メソッドを置くと思います。 これならインスタンスを作らずに
判定ができるので、お勧めですよ。
――――――――――――――――――――――――――――――――――――
株式会社イマジオム 代表取締役 高木太郎
〒316-0024 茨城県 日立市 水木町 1-11-10
電話:0294-28-0147
ファクシミリ:0294-28-0148
電子メール:tarou_...@imageom.co.jp
ホームページ:http://www.imageom.co.jp/


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

----------------------------------------------------------------------
6┃0┃0┃0┃円┃分┃ギ┃フ┃ト┃券┃全┃員┃プ┃レ┃ゼ┃ン┃ト┃
━┛━┛━┛━┛━┛━┛━┛━┛━┛━┛━┛━┛━┛━┛━┛━┛━┛
<今だけ!>簡単なアンケート+無料相談で全員にギフト券プレゼント!
☆おかげさまでお申し込み者数7万人突破中!保険ゲートの無料相談☆
http://ad.freeml.com/cgi-bin/sa.cgi?id=mvwZy
------------------------------------------------------[freeml byGMO]--

OE

unread,
Jan 26, 2015, 4:50:12 AM1/26/15
to delphi...@freeml.com
高木さん

>  私なら、サブフォームに表示の可否を判定するクラス
> メソッドを置くと思います。 これならインスタンスを作らずに
> 判定ができるので、お勧めですよ。

アドバイス、ありがとうございます。

クラスを作ったり使ったりしたことが無いのですが、
これはつまり、こんな感じでしょうか。

1.サブフォームに判定用クラスメソッドを作っておく。
2.他フォームからは判定用クラスメソッド実行して判定
3.判定結果によってはサブフォームを生成する。
  (逆の判定結果の場合はもちろんサブフォーム生成させない)

これは初体験で良い勉強になりそうなので、
じっくり取り組んでみようと思います。

ありがとうございました。


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

----------------------------------------------------------------------
人気の≪温泉≫箱根・京都・南房総など人気の温泉リゾートに格安
で宿泊できる「体験宿泊」の情報をお届け致します。早い者勝ち!
■大感謝プラン(1):【平日】  ¥500~
■大感謝プラン(2):【土・連休】¥1,500~
http://ad.freeml.com/cgi-bin/sa.cgi?id=mv2kd
------------------------------------------------------[freeml byGMO]--

Reply all
Reply to author
Forward
0 new messages