• ベストアンサー

Visual C++ でコントロールを配列にする方法

VisualC++を使い始めて楽しさを覚え始めた頃ですが、壁にぶつかり解決できません。よろしくお願いいたします。 Windowsフォーム作成において、ボタンやラベルなど、ツールボックスからドロップできるコントロールを配列にする方法が分かりません。 ためしにボタンを二つは配置してから、Button1とButton2がButton[0]とButton[1]になるように定義から書き直してみましたが、 private: System::Windows::Forms::Button^ button[2]; の行で、 「: error C2728: 'System::Windows::Forms::Button ^ : ネイティブ配列はこのマネージ型を含むことはできません”」 とエラーがでます。 どうすれば、コントロールの配列を作れるのでしょうか。できるだけ簡単な方法(できればVisualC++の機能でGUIでサクッと作れれば良いのですが)をご教授願います。 過去の質問に似たものがありましたが、参照先のリンクが切れていました。。

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

  • ベストアンサー
回答No.2

array<Button^>^ button = gcnew array<Button^>(2); ではダメですか?

chaw-chaw
質問者

お礼

あ、できました!!! ありがとうございます。 しかし、なぜデザイナでサクッとできないのか。。。 コントローラをマトリックス状に配置するとかのニーズは多いと思うのですが。。。 というわけで、もう少し締め切りを待ってみます。

その他の回答 (1)

  • KDASH-XP
  • ベストアンサー率46% (63/136)
回答No.1

うろ覚えで申し訳ないのですが VC++でコントロールの配列をGUIでは作成できなかったような...気がします。Windowsフォームでコントロールの配列を扱う場合、フォームのメンバ変数か(なんでも良いんですが...)何かで、例えばButtonの配列を用意しておいて、フォームのプロパティから、Controls.Add とかでフォーム上に配置するような操作をしたような記憶があります。 (その場合配列の各要素のButtonコントロールごとに座標とかサイズとか設定してやる必要があったと思います。基本的に動的コントロールなので、どうしてもプロパティ関連はコーディング依存になってしまったかと) (ちなみに:コントロールを配列にしたい理由って、例えば一気にEnableをfalseに設定したり...とかそういうった状況でしょうかねやっぱり。)

chaw-chaw
質問者

お礼

やっぱりGUIでは無理ですかね・・・。 ありがとうございます。参考にして試してみます! あ、そうですね、配列にしたい理由を言えば、配列にしない他の方法もご提案頂けるかもしれません。 といっても、ご想像通りの理由ですが。。。複数のコントロールに同様の操作をする際にひとつひとつ書かなければならないし、コードが長くなるからです。

関連するQ&A

  • Visual C++ 2008 EEでボタンの判定、結果を配列に格納

    OSはXPでViaual C++ 2008 Express EditionのWindowsフォームアプリケーションにて一つのフォームで全132問に答えるというものを作成しています。フォームには[戻る]、[次へ進む]、[チェック除外]ボタンと「はい」、「いいえ」、「どちらでもない」のラジオボタン、問題文とタイマーのラベル、テキストボックス(問題番号を入力すると[戻る]ボタンが[移動]ボタンに変わり、入力した問題に進む)があります。最初に変数qに1を入れ、[次へ進む]を押すとqに1がプラスされswitch文で2問以降に進む(ラベルのみ切り替わる)というもので、最後の問題に行くと[次へ進む]ボタンが[終了]ボタンに変わります。ただし、全ての問題に解答していなければ終了できないようにしています。この解答結果をCSVに(はいなら1、いいえなら2、どちらでもないなら3)出力したいと考えているのですが、ラジオボタンにチェックを入れ、[次へ進む]ボタンを押したときのみ「インデックスが配列の境界外です」というエラーが表示されてしまいます。コードは以下の通りですが、どこを直せばよいのか分からないのでご教授願います。 private: System::Void button1_Click(System::Object^ sender, System::EventArgs^ e) { endflag = 0; this->button2->Text = "次へ進む"; if(flag == 1){ q = jump; flag = 0; this->button1->Text = "戻る"; this->textBox1->Text = ""; }else{ q--; } if(q == 1){ this->button1->Enabled = false; } switch(q){ case 1:                          ・                          ・                          ・                          case 132                           endflag = 1; break; }                            }: private: System::Void button2_Click(System::Object^ sender, System::EventArgs^ e) { String^ s = rtrstrg(); if(endflag == 1){ if(s == "") { MessageBox::Show("全ての質問に答えて下さい。","エラー"); } else if(MessageBox::Show("終了しますか?", "確認", MessageBoxButtons::OKCancel, MessageBoxIcon::Question) == System::Windows::Forms::DialogResult::OK) { this->Close(); } } q++; this->button1->Enabled = true; switch(q){ case 2:                      ・                      ・                      ・                      case 132                       endflag = 1;    break; }                      }: private: System::Void button3_Click(System::Object^ sender, System::EventArgs^ e) { this->radioButton1->Checked = false; this->radioButton2->Checked = false; this->radioButton3->Checked = false; } private: System::Void chg(System::Object^ sender, System::EventArgs^ e) { bool result = int::TryParse(textBox1->Text, jump); if(jump > 0 && jump <= 132){ if(jump != q){ this->button1->Text = "移動"; this->button1->Enabled = true; flag = 1; } } else{ textBox1->Text = ""; this->button1->Text = "戻る"; flag = 0; } } private: System::String^ rtrstrg() { String^ s; for(int i=1; i<=QSTNB; i++) { s += this->rtrdt(i); if(s->EndsWith("×")) { return ""; } } return s->Remove(s->Length - 1); } private: System::String^ rtrdt(int qstn) { //配列の宣言 array<RadioButton^>^ arb = gcnew array<RadioButton^>(SZBH); for(int i=0; i<SZBH; i++) { arb[i] = dynamic_cast<RadioButton^>(this->Controls->Find("radioButton"+(qstn*SZBH-SZBH+1+i), true)[0]); } return this->chck(arb); } private: System::String^ chck(array<RadioButton^>^ arb) { for(int i=0; i<arb->Length; i++) { if(arb[i]->Checked == true) { return i + 1 + ","; } } return "×"; }

  • CheckBoxのコントロール配列について

    VB2008を使用しています。 True状態のCheckBox1~70をButtonを押すことによってFalse状態にさせようとしていますが、一つずつコードを記載するのは長くなってしまうため以前こちらに投稿されていたTextBoxのコントロール配列を参考に下記のコードを作成しました。 Dim c As Integer For c = 1 To 70 Me.Controls("CheckBox" & c.ToString).Checked = False Next しかし、このコードでは下記のエラーが出てしまいます。 "CheckedはSystem.Windows.Forms.Controlのメンバではありません。" どなたかお知恵をお貸し下さい。

  • C# パネルの中にボタンを動的に配置したいです

    C# でフォームの中にパネルを置き、そのパネルの中に、ボタンを動的に配置したいです。 以下のページにあるようなことを、パネル内にしたいです。 動的にコントロールの配列を作成する http://dobon.net/vb/dotnet/control/buttonarray.html ---------------------- [C#] //ボタンコントロール配列のフィールドを作成 private System.Windows.Forms.Button[] testButtons; //フォームのLoadイベントハンドラ private void Form1_Load(object sender, System.EventArgs e) { //ボタンコントロール配列の作成(ここでは5つ作成) this.testButtons = new System.Windows.Forms.Button[5]; //ボタンコントロールのインスタンス作成し、プロパティを設定する this.SuspendLayout(); for (int i = 0; i < this.testButtons.Length; i++) { //インスタンス作成 this.testButtons[i] = new System.Windows.Forms.Button(); //プロパティ設定 this.testButtons[i].Name = "Button" + i.ToString(); this.testButtons[i].Text = i.ToString(); this.testButtons[i].Size = new Size(30, 30); this.testButtons[i].Location = new Point(i * 30, 10); //イベントハンドラに関連付け this.testButtons[i].Click += new EventHandler(this.testButtons_Click); } //フォームにコントロールを追加 this.Controls.AddRange(this.testButtons); this.ResumeLayout(false); } //Buttonのクリックイベントハンドラ private void testButtons_Click(object sender, EventArgs e) { //クリックされたボタンのNameを表示する MessageBox.Show(((System.Windows.Forms.Button) sender).Name); } ----------------------------- プログラムの初心者です。宜しくお願いいたします。

  • VC++で、DateTime型の変数の配列を作りたい

    初歩的な質問ですが、よろしくお願いします。 単純に DateTime 取引日[3]; と、すると  error C2728:'System::DateTime' : ネイティブ配列はこのマネージ型を含むことはできません というエラーになります。 どうすればいいのでしょうか?

  • VC++2010で配列を使用する方法

    String ^test[10]; とすると 1>d:\documents and settings\my documents\visual studio 2010\projects\Form1.h(233): error C2728: 'System::String ^' : ネイティブ配列はこのマネージ型を含むことはできません とエラーが出ます どのようにすれば良いのでしょうか?

  • コントロールの配列について

    VB2005で質問です。 初心者のため勉強しながら作成している為かうまくできません。コントロール配列を使ってボタンを204個、 チェックボックスを768個表示するプログラムを作りました。 6個のボタンのうち、1個のボタンをクリックすると128個のチェックボックスがONし、 別の6個のボタンのうち1個は、128個のチェックボックスがOFFし、 96個のボタンは、1個押すと8個のチェックボックスがONし、残りの96個はOFFするプログラムを作成していますが、 配列に登録した名前でクリックイベントハンドラーを作成すると 「HANDOLES句には、それを含む型または基本型の1つで定義されたWith Events変数が必要です」というエラー表示が出ます。 またチェックボックスも同じように名前は宣言されていませんと出ますが、 どう直せば良いか把握できていないのでどなたか教えて貰えないでしょうか。 Dim chkIo(768) As System.Windows.Forms.CheckBox Dim btnIdOn(6) As System.Windows.Forms.Button Dim btnIdOff(6) As System.Windows.Forms.Button Dim btnIoOn(96) As System.Windows.Forms.Button Dim btnIoOff(96) As System.Windows.Forms.Button Const strName1 As String = "chkIo" Const strName2 As String = "btnIdOn" Const strName3 As String = "btnIdOff" Const strName4 As String = "btnIoOn" Const strName5 As String = "btnIoOff" Dim i As Integer Dim a As Integer Dim b As Integer Dim c As Integer Dim d As Integer Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load For c = 0 To 5 For i = 0 To 127 Checkboxio() Next b = 0 ButtonIoOn() b = 0 ButtonIoOff() ButtonIdOn() ButtonIdOff() Next End Sub Public Sub Checkboxio() chkIo(i) = New CheckBox With chkIo(i) .Size = New Size(15, 15) If i < 8 Then a = i b = 0 Contchk() 以下省略 ElseIf i < 128 Then a = i - 120 b = 15 Contchk() End If End With Me.Controls.Add(chkIo(i)) End Sub Public Sub Contchk() With chkIo(i) .Location = New Point((a * 25) + (290 * c) + 80, (b * 35) + 75) a = a + (10 * b) + (200 * c) .Tag = a .Name = strName1 & a.ToString End With End Sub Public Sub ButtonIoOn() For i = 0 To 15 btnIoOn(i) = New Button With btnIoOn(i) a = i .Size = New Size(15, 15) .Location = New Point((290 * c) + 19, (b * 35) + 74) a = a + (20 * c) .Name = strName4 & a.ToString b = b + 1 End With Me.Controls.Add(btnIoOn(i)) Next End Sub Public Sub ButtonIoOff() For i = 0 To 15 btnIoOff(i) = New Button 以下省略 Next End Sub Public Sub ButtonIdOn() 以下省略 End Sub Public Sub ButtonIdOff() btnIdOff(c) = New Button With btnIdOff(c) .Size = New Size(15, 15) .Location = New Point((290 * c) + 154, 29) .Name = strName3 & c.ToString End With Me.Controls.Add(btnIdOff(c)) End Sub ここからエラーがでたプログラムです Private Sub MixedControls_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnIdOn.Click, btnIdOn1.Click, btnIdOn2.Click, btnIdOn3.Click, btnIdOn4.Click, btnIdOn5.Click, btnIdOff0.Click, _ btnIdOff1.Click, btnIdOff2.Click, btnIdOff3.Click, btnIdOff4.Click, btnIdOff5.Click, btnIoOn0.Click  Select Case DirectCast(sender, Button).Name Case btnIoOn0.Name For i = 0 To 7 Me.chkIo(i).Checked = True Next End Select End Sub

  • フォームのテキストコントロールへの出力

    Cは分かりますが、C++初心者です。 よろしくお願いします。 namespace sample1 外にある関数から、フォームのコントロールにアクセスするには、 どうしたらいいのでしょうか? ========================================================== #pragma once void DspData( ReadData *readdata ); //コールバック関数宣言 namespace sample1 { using namespace System; using namespace System::ComponentModel; using namespace System::Collections; using namespace System::Windows::Forms; using namespace System::Data; using namespace System::Drawing; public __gc class Form1 : public System::Windows::Forms::Form { public: Form1(void) { InitializeComponent(); } protected: void Dispose(Boolean disposing) { if (disposing && components) { components->Dispose(); } __super::Dispose(disposing); } private: System::Windows::Forms::Label * label1; private: System::Windows::Forms::Button * start; private: System::Windows::Forms::Button * end; public: System::Windows::Forms::TextBox * textBox1; private: System::ComponentModel::Container * components; void InitializeComponent(void) { } private: System::Void start_Click(System::Object * sender, System::EventArgs * e) { } }; } //------------------------------------------------ // DspData //------------------------------------------------ void DspData( ReadData *readdata ) { //***↓ここでフォームのテキストボックスへの表示を行いたい。***** textBox1->set_text("ここで出力") return; } ==========================================================

  • 【VB2005】 実行時に動的にコントロールを作成した後のコントロールへの処理

    こんばんわ、VB5.0を1週間ほどかじって現在2005に乗り換えたばかりのド初心者です。 (用語の使い方などが間違っている可能性があるかもしれません。おかしなところは指摘していただけるとありがたいです) VB5.0を使っていたときはコントロール配列を使って簡単にできた事が2005になってコントロール配列を使えなくなったため行き詰ってしまいました。 内容は、ある操作をすると画面にコントロールが1つずつ追加されていき、そのコントロールのプロパティを他のコントロールから操作できるようにする物です。 検索などで情報を集めて、なんとかコントロールを追加していくことができるようにはなったのですが、プロパティを変更するためにコントロールにアクセスする際にエラーになってしまって困っています。 一つだけコントロールが追加された場合は、問題なくプロパティをいじれるのですが、2つ以上追加した場合に最新のコントロール以外のプロパティをいじろうとするとエラーになってしまうのです。 下に私の作りたいプログラムを簡潔にしたサンプルソースを記述させていただきます。 間違いの指摘やアドバイスをいただければ幸いです。 FormにはAddButtonというボタンが一つだけあります。 Dim Index As Integer Private Buttons() As System.Windows.Forms.Button Private Labels() As System.Windows.Forms.Label Private Sub AddButton_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles AddButton.Click Index += 1 Me.Buttons = New System.Windows.Forms.Button(Index) {} Me.Labels = New System.Windows.Forms.Label(Index) {} Me.SuspendLayout() Me.Buttons(Index - 1) = New System.Windows.Forms.Button Me.Buttons(Index - 1).Text = Index - 1 Me.Buttons(Index - 1).Size = New Size(30, 30) Me.Buttons(Index - 1).Location = New Point((Index - 1) * 30, 50) Me.Labels(Index - 1) = New System.Windows.Forms.Label Me.Labels(Index - 1).Text = Index - 1 Me.Labels(Index - 1).Size = New Size(30, 30) Me.Labels(Index - 1).Location = New Point((Index - 1) * 30, 100) AddHandler Me.Buttons(Index - 1).Click, _ AddressOf Me.Buttons_Click Me.Controls.AddRange(Me.Buttons) Me.Controls.AddRange(Me.Labels) Me.ResumeLayout(False) End Sub Private Sub Buttons_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Labels(sender.text).ForeColor = Color.Red End Sub

  • C#の配列の定数

    BCCを使用していたのですが、最近VS2013でC#を勉強し始めました フォームの指定した位置にいくつかのボタンを設置し、あらかじめ定義しておいた テーブルからボタンのtextを表示したいと思い、以下のようにコーディングしたのですが エラーが出てしまい思ったような結果に持って行くことができません C#ならこうした方がいいという指摘も含めて どうやるのがいいのか ご教授ください 足りない情報があれば追加します ちなみにまだテスト段階だから2列定義して1列しか表示するようにしかなってません ----------------------------------------------------------------------- using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows.Forms; namespace haneda { public partial class Form1 : Form { private Button[] buttons; public Form1() { InitializeComponent(); } private void Form1_Load(object sender, EventArgs e) { int i; //ボタンコントロール配列の作成 this.buttons = new Button[table.MAX_R]; for (i = 0; i < buttons.Length; i++) { //ボタンコントロールのインスタンス作成 this.buttons[i] = new Button(); //プロパティ設定 this.buttons[i].Name = "btn" + i.ToString(); this.buttons[i].Text = table.roomNo[1, i]; <=ここがエラー this.buttons[i].Top = table.roomX01[i]; <=ここがエラー this.buttons[i].Left = table.roomY01[i]; <=ここがエラー this.buttons[i].Click += new System.EventHandler(button_Click); //コントロールをフォームに追加 this.Controls.Add(this.buttons[i]); } } private void button_Click(object sender, System.EventArgs e) { Button btn = (Button)sender; MessageBox.Show(btn.Name); } } public class define { public const bool IGNORE = false; //非表示 public const bool EFFECT = true; //表示 /* 最大値 */ public const int MAX_F = 2; //フロア数 public const int MAX_R = 3; //ルーム数 } public class table { /* ナンバー */ public readonly string[,] roomNo = new string[define.MAX_F, define.MAX_R] { { "101", "102", "103"}, { "201", "202", "203"} } /* 表示・非表示 */ public readonly bool[,] effectRoom = new bool[define.MAX_F, define.MAX_R] { {EFFECT, IGNORE, EFFECT}, {EFFECT, EFFECT, EFFECT} } public readonly int[] roomX01 = new int[define.MAX_R] { 5, 70, 135 } public readonly int[] roomY01 = new int[define.MAX_R] { 100, 100, 100 } } }

  • 配列を利用したコントロールを作成して同一配列番号のコントロールを操作するには

    VB.NET2003を利用しています http://jeanne.wankuma.com/tips/control/arraycontrol.html こちらを参考にしてコントロールの配列を作成 ComboBox(i) Button(i) i=1 to 5(実際のコントロールのNameは違いますが便宜上このような記述にさせていただきました) として位置を変えながら配置していきました。  ComboBox   Button 1[不可 ▽] 1[ボタン]    可 2[不可 ▽] 1[ボタン] 3[不可 ▽] 1[ボタン] 4[不可 ▽] 1[ボタン] 5[不可 ▽] 1[ボタン] ComboBoxは同一イベントを使いたいと思っています ComboBox(i)のインデックス値が変わったらButton(i)のEnableを変更しようと思う場合どのように記述したらよいのでしょうか? 例:1が「不可」から「 可」に変わったら、1の「ボタン」というテキストを「押して」というテキストに変える と言うように同一配列番号のコントロールのプロパティを操作したいのです こういった場合はどのようにしたらよいのでしょうか 足りない情報などありましたらどんどんおっしゃってください よろしくお願いします

専門家に質問してみよう