こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

フォーム間のデータ受け渡し

現在VIsual Studio 2005のフォームアプリケーションを使ってプログラミングしています。ボタンを押すことで新たな子フォームを作成し、親フォームから子フォームへグローバル関数で宣言しているbmp[],picture[],red[]などのデータを渡したいのですがどうすればいいのかわからず困っております。子フォームから親フォームへテキストボックスなどの値を渡す方法などはわかったのですが、それをどう応用していいのかもわからない状況です。最終的には親フォームのbmp[0]におけるred[0]が1(画像処理されている)なら子フォームでbmp[0]を表示させたいと思っています。わかる方がいましたらどうかご教授ください。よろしくお願いします。以下がプログラムとなっております。

*** 親フォーム ***
#pragma once

#include "pic2.h"

namespace pic {

using namespace System;
using namespace System::ComponentModel;
using namespace System::Collections;
using namespace System::Windows::Forms;
using namespace System::Data;
using namespace System::Drawing;
using namespace System::IO;

// 省略 //

public ref class Form1 : public System::Windows::Forms::Form
{
public:
Form1(void)
{
InitializeComponent();
//
//TODO: ここにコンストラクタ コードを追加します
//

bmp = nullptr;
Array::Resize( bmp, 20 );
Array::Resize( picture, 20 );
Array::Resize( bmpr, 20 );
this->red = gcnew array<int>(20);
}

// 省略 //

private: System::Windows::Forms::PictureBox^ pictureBox1;


private:array< Bitmap^>^ bmp; // 原画像格納 //
private:array< Bitmap^>^ bmpr; // 処理画像格納 //
private:array< PictureBox^>^ picture;
private:array< int>^ red; // 処理:1 不処理:0 //

// 省略 //

#pragma endregion

private: System::Void Form1_Load(System::Object^ sender, System::EventArgs^ e) {
bmp[0] = gcnew Bitmap("ファイル名",true);

}

private: System::Void button1_Click_1(System::Object^ sender, System::EventArgs^ e) {
pic2 ^p2 = gcnew pic2();
p2->ShowDialog();     /* ボタンを押すことで新たなフォーム作成 */
}
private: System::Void pictureBox1_Click(System::Object^ sender, System::EventArgs^ e) {
int x,y;
int w = bmpr[0]->Width;
int h = bmpr[0]->Height;

if(red[0] == 1){
bmp[0] = gcnew Bitmap("ファイル名",true);
pictureBox1->Image = bmp[0];
red[0] = 0;
return;
}

if(red[0] == 0){
// 画像処理 //
pictureBox1->Image = bmpr[0];
red[0] = 1;
}
}

};

*** 子フォーム ***
#pragma once

//#include "Form1.h"
#include "pic3.h"

using namespace System;
using namespace System::ComponentModel;
using namespace System::Collections;
using namespace System::Windows::Forms;
using namespace System::Data;
using namespace System::Drawing;

namespace pic {

/// <summary>
/// pic2 の概要
///

public ref class pic2 : public System::Windows::Forms::Form
{
public:
pic2(void)
{
InitializeComponent();
//
//TODO: ここにコンストラクタ コードを追加します
//
}

// 省略 //

}
#pragma endregion
private: System::Void pic2_Load(System::Object^ sender, System::EventArgs^ e) {
if(親フォームのred[0]==1ならば){
pictureBox1->Image = bmp[0]
}
}

private: System::Void button1_Click(System::Object^ sender, System::EventArgs^ e) {
 // 新たな子フォームpic3作成 //
}

private: System::Void button2_Click(System::Object^ sender, System::EventArgs^ e) {
this->Close();
}
};
}

投稿日時 - 2008-10-07 19:25:27

QNo.4384601

すぐに回答ほしいです

質問者が選んだベストアンサー

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;
      }
    }
といった具合です

投稿日時 - 2008-10-07 22:20:44

お礼

前回に引き続きお早い回答ありがとうざいます。
さっそくプログラミングを行っている最中なのですが、エラーがでてしまって思うように進めません。
行ったこととしては、
・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': この文字を識別子で使用することはできません”というエラーが何個もでてきてうまくいきません。
もしわかりましたら教えていただきたいです。よろしくお願いします。

投稿日時 - 2008-10-08 18:01:19

このQ&Aは役に立ちましたか?

1人が「このQ&Aが役に立った」と投票しています

回答(2)

ANo.2

この掲示板でのインデントのため全角スペースを使用しています
カットアンドペーストしたのであれば、行頭のスペースを選択して普通のスペースまたはタブ文字に変更してください

宣言時についている private: は 実装コードをCPPファイルに書く場合はいりません
その代わり 関数名pic2_Loadの前に クラス名(pic2::)が必要になります

ヘッダーのクラス定義内の場合、メンバー関数定義ならわざわざ『pict2クラスだ』なんて言わなくてもいいですよね
ですがCPPファイルではそうはいきません
どのクラスの実装コードが記述されるかわからないからです

投稿日時 - 2008-10-08 18:28:12

お礼

わかりやすい説明ありがとうございます。
そういうことだったのですね、理解できました。

しかしまたエラーがでてしまい、悩んでいましたが、
System::Void pic2::pic2_Load→System::Void bmp::pic2::pic2_Loadにしたところうまくうごいてくれました。

本当に助かりました、ありがとうございます。

投稿日時 - 2008-10-09 16:50:30

あなたにオススメの質問