• ベストアンサー

Visual C++ 2008EEでフォーム間の変数渡し

こんにちわ。プログラミングを始めてまだ半年足らずの初心者です。今まではC言語とCOBOLを学んでいたのですが、今回は Visual C++ 2008 EEを使用し、アンケートの質問項目の作成と、その結果を画面に表示するシステムを作ることになりました。フォームを複数使用し、それぞれアンケートの質問項目と結果画面を作成しました。アンケートの質問は100問以上で、それに対する回答は3種類(はい、いいえ、どちらでもない)あります。質問の横に回答をラジオボタンでつけて、その回答に対する答えを結果画面のテキストボックスに表示したいのですが、値(はい:2P、いいえ:1P、どちらでもない:0P)をどのように渡したらよいのかが分かりません。下記の例のようにしたので、どなたかご教授願います。 例) 質問一覧フォーム                                結果画面フォーム                              「はい」を選択 1.______  ・はい・いいえ・どちらでもない       →         1.  2P                              「いいえ」を選択 2.______  ・はい・いいえ・どちらでもない       →         2.  1P    ・                                           ・    ・                                           ・    ・                                           ・    ・                                           ・

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

  • ベストアンサー
noname#259269
noname#259269
回答No.5

>いくつか聞きたいのですが、Form2.h の 器と setter メソッドの定義 と Loadイベントはどこに記述すればよいのですか? Load イベントは、Form2(あなたの実装では KEKKA) のデザイン画面をダブルクリックすれば出てきますので、中身をうめてください。 setter などについては、クラス定義の直下であればどこでもOKです。コンストラクタの下などで良いかと思います。 ---例--- public ref class Form2 : public System::Windows::Forms::Form { private: System::Collections::Generic::List<int>^ Values; public: void SetValues(System::Collections::Generic::List<int>^ list){ this->Values = list; } ・ ・ ・ } --- 正直言いまして、VC++/CLI をいきなりはじめるのは大変な気がします。C の経験がおありでしたら C# の方が良いのではないかな、と私的には思います。インターネット上に落ちているサンプルの数も多いですから勉強もしやすいです。 --- あと、蛇足ですが、FarEyes さんが仰っているように、画面内のコントロールが多すぎると、私も思いました。 私なら、せいぜい20行分のコントロールを貼り付けて、右側に縦スクロールバーを用意し、スクロールバーのイベントで描画状況を書き換える(スクロールしているように見せる)でしょうね。 とにかく、がんばってください。

tierra31
質問者

補足

拙い質問に答えていただき本当にありがとうございます。 edp3142さんとFarEyesさんの仰るとおり、右側にスクロールバーを設置しました。 また質問で申し訳ないのですが、「Form1.h の ボタン押下イベント内」でthis->f2 = (gcnew Form2());のf2がエラーになってしまうのですが、何が原因でしょうか?

その他の回答 (6)

noname#259269
noname#259269
回答No.7

あ、すみません。間違えました。 private: Form2^ f2; こうですね。 TestVCうんたらというのは、当方にて試験実装しているプロジェクトの namespace です、無視してください。

tierra31
質問者

お礼

本当にありがとうございます!

noname#259269
noname#259269
回答No.6

>this->f2 = (gcnew Form2());のf2がエラーになってしまうのですが、何が原因でしょうか? あぁ、そうですね。すみません。 this は、Form1 のインスタンスでその中に f2 というフィールドが定義されている、ということです。 ですから、Form1 のクラス定義直下に、 private: TestVCWinForm::Form2^ f2; というのが必要でした。 #欲を言えば応用を利かせて考えてみてください。。。

noname#144013
noname#144013
回答No.4

tierra31さん、こんにちは。FarEyesです。 ご返信有り難う御座います。 すみません。私の回答【ANo.2】で「MFC前提で」という記述を書き忘れていました。申し訳ありませんでした。 私は、正直言って最近の開発環境については疎いので具体的なプログラミングの方法については、 edp3142さんほか他の方にお譲り致します。お役に立てなくて申し訳ありません。 ここでは、私に返信されたtierra31さんの質問についてのみ回答致します。 >私はフォームを2つ(質問フォームと結果フォーム)使用し、質問フォームに「回答終了」のボタンを作成して、 >それを押せば結果フォームに質問の回答が反映されるようにしたいのですが、メインフォームも作成するべ >きですか? メインフォームを用意しなくても、ご要望のやり方でもできると思います。 その場合でも、質問フォームから結果フォームへのデータ渡しも可能だと思います。 ただ、フォームのデザインの仕方にもよりますが、「質問フォーム」の一画面に100以上もの質問項目を 貼り付けるのは大変ですし、このアプリケーションを使用する立場の人にとっても入力が大変なのでは ないかと思います。 ※画面をスクロールさせる、またはタブ切替え(プロパティシートのような)で切替えるようにすればよいですが、 少なくとも一画面には収まらない気がします。 >また、数値配列やクラスの意味が分かっていないのでこれを作成するのは不可能ですか? 予備知識が全くない状態では難しいと思います。少なくとも最低限のC言語の知識は必要だと思います。 やはり、開発環境付属のマニュアルや市販の書籍等を参照して、ちゃんと用語等の意味およびその役割 とか機能を理解しようとする努力は必要だと思います。 ※でもそれを学習する行為自体を楽しみと思うようにすれば、それ程苦労とは感じないと思います。 一つ理解する度にやる気も沸いてくるのでは? 苦労して自分が作ったプログラムがちゃんと動いた時の気分はナカナカ良いものですよ。(^_^) それ程気を張らずに気軽な気持ちでトライしてみて下さい。ご健闘をお祈り致します。 ※私もガンバッテ勉強してみたいと思います。

tierra31
質問者

補足

やはり予備知識は必要ですよね・・。 質問に答えていただいてありがとうございました! これから一つずつ勉強していきます。

noname#259269
noname#259269
回答No.3

FarEyes さんのご回答では、MFC を利用していますので、貴方の利用している実装とは異なるようです。どのライブラリ(MFC/ATL/CLR)を使って実装しているのか、その辺も知りたかったので、最初にコーディングの質問をしましたが、この部分については判りました。 ただ、貼り付けて頂いたソースは、質問フォームでテキストボックスに格納するコードであって、私が知りたかったのは、「質問フォームから、結果フォームをどのように表示しているか?(ひとまず値の貼り付けは置いといて)」だったのですが。。。 とりあえず勝手に、質問フォームから結果フォームを起動するつくりになっているものとして以下回答します。 1.結果フォームに、質問フォームと同じだけの Label 類を貼り付ける。 2.結果フォームに、結果値を受け取る器(配列や ArrayList 等)を定義する。 3.質問フォームから結果フォームのインスタンスを作成する際に、結果フォーム側の器に、結果値をセットしてやる。 4.結果フォームの Load イベントなどで、結果値の器から、Label 類に値をセットする。 こういう流れで良いと思います。 ■簡単なサンプルソース Form1 から Form2 を起動し、Form2 に Form1 側の値を引き渡して、 Form2 の listBox に表示する。 ---"Form1.h" の ボタン押下イベント内--- (list 内に 1,2,3 という数値を順に格納し、list を Form2 に渡す) this->f2 = (gcnew Form2()); System::Collections::Generic::List<int>^ list = gcnew System::Collections::Generic::List<int>(); list->Add(1); list->Add(2); list->Add(3); this->f2->SetValues(list); this->Visible = false; f2->ShowDialog(); this->Visible = true; ---"Form2.h" の 器と setter メソッドの定義 --- private: System::Collections::Generic::List<int>^ Values; public: void SetValues(System::Collections::Generic::List<int>^ list){ this->Values = list; } ---"Form2.h" の Loadイベント --- private: System::Void Form2_Load(System::Object^ sender, System::EventArgs^ e) { IEnumerator^ ie = this->Values->GetEnumerator(); while (ie->MoveNext()){ this->listBox1->Items->Add(ie->Current->ToString()); } }

tierra31
質問者

補足

ご回答ありがとうございます。 「質問フォームから、結果フォームをどのように表示しているか?」 全く見当違いの回答をしてしまってすみません。 private: System::Void ENDbutton1_Click(System::Object^ sender, System::EventArgs^ e) { KEKKA^form_d = gcnew KEKKA(); form_d->ShowDialog(); } 質問フォームに「回答終了」のボタンを作成し、それを押せば結果フォームにいくようにしています。 いくつか聞きたいのですが、Form2.h の 器と setter メソッドの定義 と Loadイベントはどこに記述すればよいのですか? 初歩的な質問ですみません・・・。

noname#144013
noname#144013
回答No.2

tierra31さん、はじめまして。 私は、「Visual C++ 2008」は持ってなく、すごく古いですが「Visual C++ 5.0」しか持って いないので、すみませんが共通だと思われる事柄の範囲のコメントとなります。 ※見当違い、間違いがあった場合は申し訳ありません。 例えば、作成したプログラムが下記のようなダイアログベースのものだったと仮定します。 ※下記中、「ダイアログ=フォーム」としています。 ┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┯━┓ ┃■アンケート調査フォーム                           │×┃ ┠─────────────────────────────┴─┨ ┃ ┌────────────┐ ┌─────────────┐ ┃ ┃ │質問グループ1(問01~問10)│ │質問グループ6(問51~問60)  │ ┃←┬ ボタンクリックで ┃ └────────────┘ └─────────────┘ ┃  │ 質問一覧フォーム ┃ ┌────────────┐ ┌─────────────┐ ┃  │ を表示 ┃ │質問グループ2(問11~問20)│ │質問グループ7(問61~問70)  │ ┃  │ ┃ └────────────┘ └─────────────┘ ┃  │ ┃ ┌────────────┐ ┌─────────────┐ ┃  │ ┃ │質問グループ3(問21~問30)│ │質問グループ8(問71~問80)  │ ┃  │ ┃ └────────────┘ └─────────────┘ ┃  │ ┃ ┌────────────┐ ┌─────────────┐ ┃  │ ┃ │質問グループ4(問31~問40)│ │質問グループ9(問81~問90)  │ ┃  │ ┃ └────────────┘ └─────────────┘ ┃  │ ┃ ┌────────────┐ ┌─────────────┐ ┃  │ ┃ │質問グループ5(問41~問50)│ │質問グループ10(問91~問100)│ ┃←┘ ┃ └────────────┘ └─────────────┘ ┃ ┃        ┌───────┐          ┌───────┐  ┃ ┃        │  回答結果   │          │  終  了    │  ┃← [回答結果]ボタンクリックで   ┃        └───────┘          └───────┘  ┃  結果画面フォームを表示 ┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛ 大雑把な手順&処理として下記のようなものが考えられます。 1)メインフォームのダイアログクラスに回答保存用のデータバッファを追加  ・数値データバッファ(数値配列)をメンバデータとして追加   例: int m_nAns[100]; ←これに回答値を保存する 2)「質問一覧フォーム」用のフォームを作成  ・フォームの中に、質問用のラジオボタンを作成 3)「質問一覧フォーム」用のダイアログクラスを作成...(ClassWizard使用)  ・ラジオボタンに対応したメンバデータを追加   例: int m_nRadio01; ~ int m_nRadio10; ←ラジオボタンの値取得用 4)「結果画面フォーム」用のフォームを作成  ・フォームの中に結果表示用のテキストボックス(エディットボックス)を作成 5)「結果画面フォーム」用のダイアログクラスを作成...(ClassWizard使用)  ・テキストボックスに対応したメンバデータを追加   例: CString m_strAns; ←テキストボックスにセットする文字列用      CEdit m_ctrAns;  ←テキストボックスのコントロール用(必要時作成) 6)メインのダイアログクラスに、子ダイアログクラスのメンバデータを   取得&設定するような処理を追加。 <フォーム(ダイアログ)間のデータの流れ> ・メインのダイアログクラスの回答保存用のデータバッファを初期化する    ↓ ・メインのダイアログクラスで、「質問一覧フォーム」のダイアログクラスの  メンバーデータ(ラジオボタン用のデータ)に初期値の回答値をセット    ↓ ・メインのダイアログクラスで、「質問一覧フォーム」のダイアログを表示    ↓ ・メインのダイアログクラスで、「質問一覧フォーム」のダイアログクラスの  メンバデータ(ラジオボタン用のデータ)を取得し回答保存用バッファにセット    ↓ ・メインのダイアログクラスで、「結果画面フォーム」のダイアログクラスの  メンバーデータ(テキストボックス用の文字列データ)に保存していた回答値をセット  ※その際、数値→文字列変換等の処理を行う    ↓ ・メインのダイアログクラスで、「結果画面フォーム」のダイアログを表示

tierra31
質問者

補足

初めまして。ご回答ありがとうございます。 私はフォームを2つ(質問フォームと結果フォーム)使用し、質問フォームに「回答終了」のボタンを作成して、それを押せば結果フォームに質問の回答が反映されるようにしたいのですが、メインフォームも作成するべきですか?また、数値配列やクラスの意味が分かっていないのでこれを作成するのは不可能ですか?

noname#259269
noname#259269
回答No.1

質問一覧フォームから結果画面フォームを表示する部分はどんなコーディングになっていますか?

tierra31
質問者

補足

private: System::Void ENDbutton1_Click(System::Object^ sender, System::EventArgs^ e) { int Ycount = 0; int Ncount = 0; int Ocount = 0; int Kcount = 0; if(radioButton1->Checked){ Ycount = Ycount + 1; Kcount++; } else if(radioButton2->Checked){ Ncount = Ncount + 1; Kcount++; } else if(radioButton3->Checked){ Ocount = Ocount + 1; Kcount++; } ・              ・              ・         if(radioButton394->Checked){ Ycount = Ycount + 1; Kcount++; } else if(radioButton395->Checked){ Ncount = Ncount + 1; Kcount++; } else if(radioButton396->Checked){ Ocount = Ocount + 1; Kcount++; }          textBox1->Text = Ycount.ToString(); textBox2->Text = Ncount.ToString(); textBox3->Text = Ocount.ToString(); textBox4->Text = Kcount.ToString(); 今は、確認のために質問フォームにテキストボックスを4つ作り、以下の内容を入れました。 Ycount=はいの数 Ncount=いいえの数 Ocount=どちらでもないの数 Kcount=質問に答えた数 これを、結果フォームに質問数分のテキストボックスを作成し、質問に対応した点数(はい=2点、いいえ=0点、どちらでもない=1点)の値を代入したいと考えているのですが・・方法が分からなくて困っています。