【C++/CLI】フォーム間参照

下図のように、メインのフォームから設定値を設定するための子ウィンドウ(ダイアログボックス)を
表示し親のウィンドウに値を設定しなおす方法を紹介します。

 

 

フォームを開く

フォームをモーダルで表示する場合は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 で作成しています。

 

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください