下図のように、メインのフォームから設定値を設定するための子ウィンドウ(ダイアログボックス)を
表示し親のウィンドウに値を設定しなおす方法を紹介します。
フォームを開く
フォームをモーダルで表示する場合はShowDialogメソッドを、
モードレスで表示する場合はShowメソッドを用います。
(コード例) Form1.hにて
#include "Form2.h"
:
:
Form2^ frm2 = gcnew Form2;
//Form2の表示、Form2の親(Owner)をForm1(this)に設定
frm2->ShowDialog(this);
ここでのポイントはForm1からForm2を参照できるようにForm2をfrm2という
フィールド(メンバ変数)に代入していることと、Form2の親がForm1であることがわかるように
ShowDialogメソッドでthisを設定しています。
こうすることで、自分のフォームの親はどのフォームなのか?を調べる場合はフォームの
Ownerプロパティを参照することで可能となります。
別フォームの参照
別のフォームからテキストボックスなどのオブジェクトを参照する場合には
frm2->textBox1->Text
などとしたくなるのですが、デフォルトではエラーとなってしまいます。
そこで別のフォームからオブジェクトを参照できるようにオブジェクトのModifiersプロパティを
Publicなどに設定すると、別のフォームからオブジェクトを参照できるようになります。
循環参照(相互参照)
今回の例のように、Form1からForm2を参照、Form2からForm1を参照するので、
Form1.hにて
#include “Form2.h”
Form2.hにて
#include “Form1.h”
としたくなるのですが、お互いを参照してグルグル回ってしまうので、ヘッダの宣言の部分を
*.hファイルではなく、*.cppファイルに持って行きます。
今回のサンプルの例ではイベント処理の部分も*.cppファイルに持っていって
(コード例) Form2.cppにて
#include "StdAfx.h"
#include "Form2.h"
#include "Form1.h"
using namespace prjForm;
System::Void Form2::Form2_Load(System::Object^ sender, System::EventArgs^ e) {
Form1^ ParentForm;
if (this->Owner != nullptr){
//親のフォームクラス
ParentForm = static_cast<Form1^>(this->Owner);
this->textBox1->Text = ParentForm->textBox1->Text;
this->textBox2->Text = ParentForm->textBox2->Text;
this->textBox3->Text = ParentForm->textBox3->Text;
}
}
サンプルプログラム
このサンプルプログラムはフォーム間参照サンプルプログラムでダウンロードができます。
VisualStudio2005 Express Edition で作成しています。