- ベストアンサー
VC++のWindowsFormでコントローラを配列にする方法とイベントの配列化について
- VC++のWindowsFormで、ボタンやテキストボックスなどのコントローラを配列にする方法と、イベントも配列にする方法について教えてください。
- デザイナで作成したソースに手を加えることなく、コントローラを配列として取得する方法はありますか?また、ボタンなどのイベントも配列にすることは可能でしょうか?
- ボタンが50ほどあるプログラムを考えており、それぞれのボタンは独立ではないため、配列での処理が望ましいです。回答していただけると助かります。
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
FormのLoadイベントはデザイン画面を表示して、Form1を選択中にしてプロパティウィンドウ(初期は右側に出ると思う) のイベント(雷マーク)のLoadイベントにForm1_Loadと記入すればコードが自動的に挿入されます。 ちなみにbutton1、button2、、、というオブジェクト名であれば、 this->buttons = gcnew Generic::List<Button^>(); for (int i = 1; i <= 5; ++i) { Button^ btn = static_cast<Button^>(this->Controls[L"button" + i.ToString()]); this->buttons->Add(btn); btn->Click += gcnew System::EventHandler(this, &Form1::buttons_Click); } という記述もできます。 (パネル等のコンテナを使っているともう一工夫必要だが) 一応参考 http://hpcgi1.nifty.com/MADIA/Vcbbs/wwwlng.cgi?print+200703/07030007.txt
その他の回答 (1)
- bluecampus
- ベストアンサー率66% (138/209)
デザイナでちゃんと使えるようにするには、自分で配列に割り当てるような処理を入れないとダメでしょう。 よってボタンが10個、20個あれば、10行、20行と配列に入れる処理を記述する。 たとえば、FormのLoadイベントで private: Generic::List<Button^>^ buttons; System::Void Form1_Load(System::Object^ sender, System::EventArgs^ e) { this->buttons = gcnew Generic::List<Button^>(); this->buttons->Add(this->button1); this->buttons->Add(this->button2); this->buttons->Add(this->button3); this->buttons->Add(this->button4); this->buttons->Add(this->button5); for each (Button^ btn in this->buttons) { btn->Click += gcnew System::EventHandler(this, &Form1::buttons_Click); } } System::Void buttons_Click(System::Object^ sender, System::EventArgs^ e) { MessageBox::Show(static_cast<Button^>(sender)->Name); } という風にするとか。
お礼
ありがとうございます! イベント処理をひとつにしてsenderで識別するのは思いつきませんでした!非常に有用な情報ありがとうございました。 しかし、前半の配列化する部分は力不足のため理解できず、コンパイルエラーを回避できません。。 Loadイベントとはどこで発生するのでしょうか。もう少し具体的に教えていただけるとありがたいです。
お礼
お礼が遅くなり申し訳ありません。大変理解し易い説明ありがとうございました。 また、他の疑問が浮かんできましたが、タイトルに沿わないので、新しく質問を立てたいと思います。 お時間ありましたらまたよろしくお願いいたします。