• ベストアンサー

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点)の値を代入したいと考えているのですが・・方法が分からなくて困っています。

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • Visual C++ 2008 EEでメッセージ表示

    Visual C++ 2008 EEを使用し、以下のコードを組みました。これは1つのフォーム(仮に質問フォームとする)に3つのボタンを作成し、ボタンを押すとそれぞれの3種類の質問項目フォームにいって、質問回答が終わったら再び質問フォームに戻ります。このとき、一度回答した質問項目のボタンは選べないようにしていて、全部の質問に答えた場合(全てのボタンが選べなくなった場合)に「これで質問は終わりです」というようなメッセージを表示したいのですが、方法が分からないのでご教授願います。 private: System::Void button1_Click(System::Object^ sender, System::EventArgs^ e) { this->Hide(); Sai500^ cSai500 = gcnew Sai500(); cSai500->gvflnm(this->flnm); cSai500->ShowDialog(); this->button1->Visible = false; this->Show(); } private: System::Void button2_Click(System::Object^ sender, System::EventArgs^ e) { this->Hide(); Sai030^ cSai030 = gcnew Sai030(); cSai030->gvflnm(this->flnm); cSai030->ShowDialog(); this->button2->Visible = false; this->Show(); } private: System::Void button3_Click(System::Object^ sender, System::EventArgs^ e) { this->Hide(); Sai040^ cSai040 = gcnew Sai040(); cSai040->gvflnm(this->flnm); cSai040->ShowDialog(); this->button3->Visible = false; this->Show(); }

  • フォームの内容を選択されたチェックボックス等で変更(visual C#)

    質問させていただきます 現在visual C# 2003を独学しております よく市販アプリケーションのインストール時に色々な 選択項目、ボタン等があり、その選択内容、アクションによってその後フォームに表示されるオブジェクトの内容が変わる物があります (ちょうど本のページをめくるような感じで) ああいった物を作成したい場合は通常どのように 作成するのでしょうか 私が思いついた方法としては一つのフォームにすべて のオブジェクトを生成し、その表示プロパティの 表示する、表示しないをアクションごとに判定する といった方法なのですが、全く合理的でない方法 だと思うのでなにか良い方法があるのではないか と考え質問しました すみませんがどなたかおわかりになられる方ご教授 よろしくお願いいたします

  • Visual C++ 2008からExcel2003への出力方法

    私はVisual C++ 2008でWindowsフォームを使用し、アンケートを作成しています。同じフォームに回答のラジオボタン(はい、いいえ、どちらでもないの3種)を設置し、その結果をExcel2003のセルへ出力したいと考えているのですが、可能ですか? ※セルへ出力する値は数字でしたいと思っています。 はい・・2、いいえ・・0、どちらでもない・・1

  • アンケートフォームで未入力をチェックする

    Web上でのアンケートフォームをASPを使って作成しています。 いくつかある質問項目の中で、ラジオボタンで作成したもののみ必須項目にしたいとおもっています。ラジオボタンを選択せずに送信ボタンをクリックした際、入力を求めるメッセージを表示させるにはどうしたらいいのでしょうか?よろしくお願いします。

  • NINJA TOOLSで投票フォーム

    http://teokure.arrow.jp/ranking/07/touhyou.php 上記と全く同じような恐らくNINJATOOLSで作られている投票フォームを作りたいのですが、いまいちよくわからず作れません。 忍者アンケートフォームを使って作成できるのでしょうか。 ただ選択していくだけの投票フォームはできるのですが、URLのような新規項目を付けたり、コメント、グラフを付ける例が見当たらず作れません。 どなたか分かる方教えてください。

  • 無料アンケートフォームについて

    現在、FC2の無料フォームに登録しています。 今度、アンケートフォームを作成したいと考えているのですが、いくつか疑問があります。 ●一人の人が何度も回答できないようになっているか。(重複回答の禁止機能があるのか) ●アンケート集計結果は、どのように表示されるのか。 (アンケート回答者が回答を送信した後、結果が見られるようになっているのか。それとも管理者のみがチェックできるようになっているのか) ご存知の方がいましたら、ぜひ教えて下さい。 FC2以外では http://formmail.jp/ などもありますが、同様に重複回答の扱いがどうなっているのか分かりませんでした。 「レンタルアンケートシステム質問くん」http://www.supreme.co.jp/cfm/ask3/ は良さそうだと感じたものの、フリーメールでは利用できないので諦めました。

  • visual C++ windowsフォーム

    簡単なプログラムですが windowsフォームを使ったことがないので質問させていただきます。 ボタンとlabelを用いて ボタンを押したら labelに計算結果が表示されるというものです。 private: System::Void button1_Click(System::Object^ sender, System::EventArgs^ e) {  int a;   for(a=0;a<=10000;a++)   {     label1->Text=a.ToString();  } } このような 簡単なプログラムを書いたのですが。ボタンを押した結果は少したって10000というものでした。 私がイメージしてるは1,2,3,4、・・・・・10000(※1が表示され、2が表示 横に続くのではない)と表示されるものを作りたいのですが。 今までは コマンドプロンプトで行っていたのですが この場合はイメージ通りにできたのですが。 windowsフォームでは、できませんでした。 なぜでしょか?? 詳しいやり方を教えてください。

  • Accessフォーム検索

    AccessでA、B、C個別のフォーム検索があり 各々検索結果を別フォームで表示させています。 ここから更に、条件選択で表示させる方法はありますか? 例) A:カテゴリー B:名前 C:素材 をAND、ORでフォーム表示させたいのです。 宜しくお願い致します。

  • アンケートフォームで入力後、

    アンケートフォームで入力後、 確認画面を表示するWEBページを 作りたいのですが、ユーザーが、 質問項目のフィールドを自由に 設定するだけで、確認画面にも 反映するようなことを実現するには どのような方法が、ありますでしようか。

    • ベストアンサー
    • HTML
  • アンケートフォームの記憶

    最近アンケートフォームを作って困ってることがあります。アンケート結果はメールで送信してもらう方法をしています。HTMLでアンケートページを2ページ作って実験したのですが、1ページ目の回答がメールで表示されず、2ページ目だけ表示されました。 普通なら、1つのページで質問をすべて作ってされると思うのですが、1ページごとに質問をしたいのですが何か方法はありますか?またすべてのアンケート結果を出すことも可能でしょうか?よろしくお願いします。