- ベストアンサー
C# formの2重起動禁止
子formを呼び出し,もう一度同じformを呼び出せるように現在なっているのですが,これを 子formがすでに開いていたら閉じてから新たに子formを開き直すようにしたいのですが, ネットで調べてもいまいち良く解らないのでご質問させていただきました. どなたかご教示よろしくお願いいたします.
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
Public int buf = 0;の下ですね。 mouse_clicked()の中で宣言してしまうと、そのサブルーチン終了とともに f2が破棄されてしまい、Form2のインスタンスは有るけど、それを管理出来なく なります。 これではクリックした時に既にForm2が有るのか無いのかわからなくなるので、 サブルーチンの外で宣言しないといけません。 私の書いたNo.2は不要みたいなので、public Form2 f2 = null;を追加すれば、 動くとおもいますよ。
その他の回答 (2)
- unacyo
- ベストアンサー率51% (35/68)
割り込みで失礼します。 私も良く#1さんの示す処理を使います。 まず、#1さんの文章をよく読んでください。変数定義とif()以降は書く位置が違いますよね? 貴方のコードで言う所の"Form2 f2"は、子フォームの生成するイベント(ボタン?)に 書くのではなく、親のメンバ変数を定義する場所に書きます。 そして、f2=nullは、親フォームの初期化を行う所に書きます。 子フォームを生成するイベントに、if()以降を書くのです。 また、子フォームの生成はelseルートではなく、if()の結果に関係なく生成する必要が あります。 纏めると… 1.親フォームのメンバ変数を定義する場所に書く Form2 f2; 2.親フォームの初期化処理に書く f2 = null; 3.子フォームを作るイベント処理に書く if( f2 != null ) f2.Close(); f2 = new Form2( this ); f2.Show(); 1の定義で、Form2 f2 = null;と書けるならば、2は不要。 このコードの肝は3で、f2がnullかそうでないかによって、f2.Close()を呼ぶのか、 呼ばなくて良いのかを決めているところです。 初回動作時はf2=nullなので呼ばない、二回目以降は前回動作時に生成したフォームが f2に入ったままなので閉じてからフォームを生成する、と動くのです。 このコードを正しく動かすには、f2がnullから始まる必要があるので、親の初期化 でnullをいれなければなりません。 #1さんが言いたいことは、この様な内容だと、私は解釈しています。 割り込み失礼しました。
補足
unacvoさん ご回答ありがとうございます. 私も,おっしゃっていることは良く解りますが, 1.2の内容は具体的にどのあたりに記入知るのでしょうか? ご教示よろしくお願いいたします. 下記にプログラムの関係部を張り付けておきます public int but = 0; private void mybutton1_Click(object sender, EventArgs e) { //Form2クラスの宣言 Form2 f2 = null; //Form2を表示する //ここではモーダルダイアログボックスとして表示する ////オーナーウィンドウにthisを指定する //f.ShowDialog(this); //フォームが必要なくなったところで、Disposeを呼び出す //Form2クラスのインスタンスを作成する if (f2 != null) f2.Close(); f2 = new Form2(this); f2.Show(); }
- toro-nekomata
- ベストアンサー率45% (24/53)
子Formのクラス名がChirdFormだとすると, ChirdForm cf = null; と親フォームの中で宣言しておいて, 子formを出す処理のところで, if ( cf != null ) cf.Close(); cf = new ChirdForm(); cf.Show(); って感じでは,ダメですか. ちゃんと,構文確認してないので,メソッド名など誤っているかもしれませんが, 考え方としては,伝わりますか?
補足
toro-nekomataさん ご回答ありがとうございます. //Form2クラスの宣言 Form2 f2 = null; if (f2 != null) { f2.Close(); } else { //Form2クラスのインスタンスを作成する f2 = new Form2(this); f2.Show(); } 教えて頂いたように上記のようにしてみましたが,うまくいきませんでした. どこがいけないのでしょうか? ご教授よろしくお願いいたします.
お礼
unacvoさん ありがとうございました.思い通りの処理が出来ました. 私もまだまだ勉強不足ですね.