- ベストアンサー
フォーム間のデータ受け渡し
- 現在VIsual Studio 2005のフォームアプリケーションを使ってプログラミングしています。ボタンを押すことで新たな子フォームを作成し、親フォームから子フォームへグローバル関数で宣言しているbmp[],picture[],red[]などのデータを渡したいのですがどうすればいいのかわからず困っております。
- 子フォームから親フォームへテキストボックスなどの値を渡す方法などはわかったのですが、それをどう応用していいのかもわからない状況です。
- 最終的には親フォームのbmp[0]におけるred[0]が1(画像処理されている)なら子フォームでbmp[0]を表示させたいと思っています。わかる方がいましたらどうかご教授ください。
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
pic2を表示するのに 親フォームを渡してやれば pic2側でOwnerプロパティでForm1を参照可能です p2->ShowDialog(); を p2->ShowDialog( this ); とします pic2からForm1のデータをもらいに行くイベントは CPPファイルに記述します 冒頭で Form1が参照できるように #include "Form1.h" を宣言します 次の行で namespaceの指示をします using namespace pic; System::Void pic2::pic2_Load(System::Object^ sender, System::EventArgs^ e) { Bitmap^ bmp = nullptr; // redはプライベートなので Form1側で判断したほうがいいでしょう bmp = ((Form1^)this->Owner)->GetImage(); if ( bmp != nullptr ) { pictureBox1->Image = bmp; } } Pic2.hのLoadイベントを 宣言のみにします private: System::Void pic2_Load(System::Object^ sender, System::EventArgs^ e) { if(親フォームのred[0]==1ならば){ pictureBox1->Image = bmp[0] } } を private: System::Void pic2_Load(System::Object^ sender, System::EventArgs^ e); とします Form1側にデータを取得するメソッドを追加します public: System::Drawing::Bitmap^ GetImage() { if ( red[0] ) { return bmp[0]; } else { return nullptr; } } といった具合です
その他の回答 (1)
- redfox63
- ベストアンサー率71% (1325/1856)
この掲示板でのインデントのため全角スペースを使用しています カットアンドペーストしたのであれば、行頭のスペースを選択して普通のスペースまたはタブ文字に変更してください 宣言時についている private: は 実装コードをCPPファイルに書く場合はいりません その代わり 関数名pic2_Loadの前に クラス名(pic2::)が必要になります ヘッダーのクラス定義内の場合、メンバー関数定義ならわざわざ『pict2クラスだ』なんて言わなくてもいいですよね ですがCPPファイルではそうはいきません どのクラスの実装コードが記述されるかわからないからです
お礼
わかりやすい説明ありがとうございます。 そういうことだったのですね、理解できました。 しかしまたエラーがでてしまい、悩んでいましたが、 System::Void pic2::pic2_Load→System::Void bmp::pic2::pic2_Loadにしたところうまくうごいてくれました。 本当に助かりました、ありがとうございます。
お礼
前回に引き続きお早い回答ありがとうざいます。 さっそくプログラミングを行っている最中なのですが、エラーがでてしまって思うように進めません。 行ったこととしては、 ・p2->ShowDialog(); → p2->ShowDialog( this ); に変更しました。 ・pic2.cppに #include "Form1.h" と using namespace pic; を宣言しました。 System::Void pic2::pic2_Load(System::Object^ sender, System::EventArgs^ e){ // 処理 // } と private: System::Void pic2_Load(System::Object^ sender, System::EventArgs^ e);(宣言のみにする) は別ものと考えるのでしょうか? 最後に書かれているメソッドの追加というのはForm1.hのどの場所においてあげるものなのでしょうか?Form1のいろんな場所においてみたのですが、どうしても”'0x3000': この文字を識別子で使用することはできません”というエラーが何個もでてきてうまくいきません。 もしわかりましたら教えていただきたいです。よろしくお願いします。