none
子フォームが閉じた事を通知したい RRS feed

  • 質問

  • VS2005のCLRでフォームアプリを作っています。

     

    メインのFormから別の子Formを生成して、

    子Formに値などを入力し、閉じるときに

    親のフォームに値を渡したい(あるいは親フォームからとりに行きたい)です。

    とりあえず自分なりに、下のように書いてみたのですが、

    コンパイルは通るものの実行するとエラーが発生します。

    デバッグしてみると、子フォームからの通知を受け取る関数CloseChildのなかで

    this->textBox1->Text = this->child->textBox1->Text;

    の行が全部「未定義の値」になってエラーが発生しているようでしたが、

    どうしてそうなるのか分かりません。

     

    どうしたらよいのか、どなたか教えていただけると助かります。

    よろしくお願いします。

     

    //-------------親Form-------------------------

    //子フォームから通知を受け取る

    public: System::Void CloseChild(){
        this->textBox1->Text = this->child->textBox1->Text;

      this->Close();
    }

    //子フォーム生成

    private: System::Void buttonCreateChild_Click(System:Surprisebject^  sender, System::EventArgs^  e) {
         child = gcnew childForm();
         child->ShowDialog();
         child->m_parent = this;

    }

     

    //---------------子Form-----------------

    //フォームを閉じる

    System::Void childForm::button_Done_Click(System:Surprisebject^  sender, System::EventArgs^  e){
     m_parent->CloseChild();

    this->Close();
    }

     

     

    2007年7月28日 5:29

すべての返信

  • 自己解決しました。

    モーダルにしたかったのでShowDialogにしていたのですが、

    この場合は子フォーム(モーダルダイアログ)閉じられるまで処理を返してくれないので、

    子フォームか、子フォームに置かれたボタンなどの

    DialogResultプロパティにOKやCancelを渡すことで

    終了させなければならない、ということが分かりました。

     

    お騒がせしました。
    2007年7月28日 6:46
  • 本題と関係ないけど、

         child = gcnew childForm();
         child->ShowDialog();
         child->m_parent = this;

    は、ShowDialogの場合deleteが必要です。
    ついでに、親ウィンドウはShowDialogの引数として指定できます。
    (子Formのインスタンスをほかで使わないのであれば、自動変数にして関数を抜けたときに
    自動でdeleteが動くようにすると良いです。(サンプル参照))

    本題ですが、一般的には親Formに子Formが閉じたときに動かしたい関数を
    用意して、子Formにそのデリゲードを用意してそれを実行させるようにします。
    (ボタンのイベントなら親Formの関数をEventHandlerで追加させておく)
    まぁ、ShowDialogした後でも処理可能であれば、そのほうが簡単でしょうけど。

    具体的な例です。
    Form1.h
    Void button1_Click(Object^ sender, EventArgs^ e)
    {
        Form2 f;
        f.button1->Click += gcnew EventHandler(this, &Form1::CloseChild);
        f.ShowDialog(this);
    }
    Void CloseChild(Object^ sender, EventArgs^ e)
    {
        MessageBox::Show(L"Form2を閉じた。");
    }

    Form2
    public:
        System::Windows::Forms::Button^ button1;    // publicに変更
        
    private: 
        Void button1_Click(Object^ sender, EventArgs^ e)
        {
            this->Close();
        }
    

    ※表示上の関係(コード折曲がって表示される場合があるため)で、System:: はわざと削ってあります。

    それと、質問自体がC++/CLIであれば、
    Visual C++ フォーラム
    のほうが回答が付きやすいでしょう。

    2007年7月28日 7:43