- PR -

親フォームを閉じても子フォームを残す方法について

1
投稿者投稿内容
とら
ベテラン
会議室デビュー日: 2006/10/04
投稿数: 54
投稿日時: 2007-12-06 13:59
VisualStudio2005 C#でWindowsアプリケーションの開発を行っております。

以下のような構成の画面を定義したいのですが上手く出来ません。

□実装したい画面

1.メニュー用のフォーム(Form1)
以下のようなロジックを使用して、ボタン押下に伴って、Form2を
モードレスで呼び出す。

private void button1_Click(object sender, EventArgs e)
{
Form2 myForm2 = new Form2();
myForm2.Show();
}


2.処理用のフォーム(Form2)
Form1より必要に応じて複数表示され、それぞれは平行して作業を行う。



このようにした場合、Form1でボタンをクリックするたびに、Form2の
画面が表示され、平行で処理が出来るのですが、Form1をCloseすると、
今まで開いていた全てのForm2が一緒にCloseしてしまいます。

親がCloseするので子もCloseするのだと思うのですが、全てが独立して
稼動するような実装は出来ないのでしょうか?

つまり、Form1が最初に表示され、Form1から複数のForm2が表示されるが
Form1をCloseしても、複数のForm2はそれぞれCloseボタン等で明示的に
終了しなければCloseしないような仕組みにしたいと考えています。

ちなみに、Program.csは以下のように、しています。
[STAThread]
static void Main()
{
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
Application.Run(new Form1());
}

なにか、アイディアをお持ちの方はいらっしゃいませんでしょうか?

宜しくお願いします。
Atsuto
会議室デビュー日: 2007/12/06
投稿数: 2
投稿日時: 2007-12-06 14:37
「親がCloseされたから子もCloseされる」というのはないと思います。

今回の場合は、
Application.Run(new Form1());
と記述している限りでは、Form1が閉じられたらexeを終了するので、その他のリソース(子Formも含まれる)が全て破棄されるものだと思います。

下記のような方法はどうでしょうか?

Program.csは以下のように変更して下さい。
[STAThread]
static void Main()
{
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
ParentForm form = new ParentForm();
form.Show();
Application.Run();  ← 引数無し
}

あとは、exeを落としたいタイミングで、メインスレッドから
Application.ExitThread();
を呼び出す。

以上で、いちおうは実装できそうな気がします。

ちなみに・・・実行ファイルとしてはどのタイミングで落とそうと考えているのでしょうか?_?
burton999
ぬし
会議室デビュー日: 2003/10/06
投稿数: 898
お住まい・勤務地: 東京
投稿日時: 2007-12-06 14:41
もしくはApplicationContextで、表示しているフォームを管理するとか。

Application.Run メソッド (ApplicationContext) (System.Windows.Forms)
http://msdn2.microsoft.com/ja-jp/library/ms157901(VS.80).aspx
とある根性なし
ベテラン
会議室デビュー日: 2006/08/15
投稿数: 54
投稿日時: 2007-12-06 15:29
プロジェクトの「シャットダウンモード」ってVBだけなんですね・・・

じぃちゃん作って Hide にしておいて、親呼び出すってのはダメでしょうか。

[追記]
こんなステキなことをしてらっしゃる方もいました
http://www.divakk.co.jp/blog/aoyagi/archive/2006/04/17/7196.aspx
尊敬

[ メッセージ編集済み 編集者: とある根性なし 編集日時 2007-12-06 15:36 ]
nakaP
大ベテラン
会議室デビュー日: 2005/09/27
投稿数: 138
お住まい・勤務地: 高知
投稿日時: 2007-12-06 16:31
こんにちは。
ApplicationContextで管理するのが一般的でしょうね。

引用:

[STAThread]
static void Main()
{
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
ParentForm form = new ParentForm();
form.Show();
Application.Run();  ← 引数無し
}


メッセージポンプのこともあるので、Application.Run()以前にFormを表示するのは避けたほうが良いです。
参考:http://dobon.net/vb/dotnet/form/notopenform.html
1

スキルアップ/キャリアアップ(JOB@IT)