VisualC++を使い始めて楽しさを覚え始めた頃ですが、壁にぶつかり解決できません。よろしくお願いいたします。

Windowsフォーム作成において、ボタンやラベルなど、ツールボックスからドロップできるコントロールを配列にする方法が分かりません。
ためしにボタンを二つは配置してから、Button1とButton2がButton[0]とButton[1]になるように定義から書き直してみましたが、
private: System::Windows::Forms::Button^ button[2];
の行で、
「: error C2728: 'System::Windows::Forms::Button ^ : ネイティブ配列はこのマネージ型を含むことはできません”」
とエラーがでます。

どうすれば、コントロールの配列を作れるのでしょうか。できるだけ簡単な方法(できればVisualC++の機能でGUIでサクッと作れれば良いのですが)をご教授願います。 過去の質問に似たものがありましたが、参照先のリンクが切れていました。。

このQ&Aに関連する最新のQ&A

A 回答 (2件)

array<Button^>^ button = gcnew array<Button^>(2);


ではダメですか?
    • good
    • 0
この回答へのお礼

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

お礼日時:2008/07/10 01:05

うろ覚えで申し訳ないのですが


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

(ちなみに:コントロールを配列にしたい理由って、例えば一気にEnableをfalseに設定したり...とかそういうった状況でしょうかねやっぱり。)
    • good
    • 0
この回答へのお礼

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

お礼日時:2008/07/09 22:39

このQ&Aに関連する人気のQ&A

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

Q[VC++][MFC][SDI]ダイアログコントロールもしくわツールバー!!詰まってます!!

現在VC++6.0でMFCを使いSDIのプログラムを作っているのですが、フォームにダイアログバーを張っています。

これをツールバーのように自由に動かしたり、左右上下にドッキングさせたり。
これって実現可能でしょうか?

色々ためしてみたんですが無理でした。
やっぱ不可能ですかね?

これが無理なんであればデフォルトで作成されるツールバー([新規作成][開く][保存]等が入ってる)にコントロール(ボタンやリストボックス)を追加して使用、と考えているのですがこれも難しい!!!


まだまだ未熟者なのですがどうかご存知の方おられましたらご教授ください!!
よろしくお願いします!!

Aベストアンサー

Dannerです。
参考URL(英語)を載せておきます。

参考URL:http://www.codeguru.com/Cpp/controls/toolbar/placingcontrolsintoolbars/article.php/c2505/

Q[C++/CLI]マネージコードで配列を作成してネイティブコードの配列にコピーしたい

Visual C++ 2005のC++/CLIでプログラム作成しています。
C言語で書かれたプログラムを組み込みたい為に、
マネージコードでテキストファイル読み込みをして、2次元配列に格納し、
int型に変換してネイティブコードの配列にコピーしたいのですが、上手く書けません。。
テキスト内容は数字のみで2次元に並んでおり、1文字ずつ配列に入れたいです。
エラー出ているのですが、下記にコードを載せます。

#include<string>
#include<vcclr.h>

using namespace System;
using namespace System::IO;

int main(void){

//ファイルオープン
StreamReader^ sr = gcnew StreamReader("hoge.txt");
int x, y;

//ファイルの内容読込み
for(y=0;;y++){
String^ line = sr->ReadLine();
  //データ末尾まで読み込んだらループ終了
if(line == nullptr) break;
   array<array<String^>^>^ table = gcnew array<array<String^>^>(line->Length);
   int X=line->Length;
   int Y=table->Length;
//読み込んだ内容を表示
Console::WriteLine("<System::String表示>" + table);
   //System::Stringのline内容(文字列)をコピーする変数
  char tmp[128];
  sprintf(tmp,"%s",line);
  printf_s("<char配列> tmp=%s\n",tmp);
//char*変数の内容表示
  array<array<int>^>^ data= gcnew array<array<int>^>(Y,X);
//int型に変換
for(x=0;x<X;x++){data[y][x]=atoi(table[y][x]);}
}
//ファイルのクローズ
sr->Close();
  
  return 0;
}

汚く読みづらいコードで大変申し訳ありません。。
元はdefineで成分数(X,Y)を宣言していました。
しかし、読み込むファイル内容によって変えたく、arrayでLengthを使いました。
またこれ以外でいい方法がございましたら、どうか教えてください。
どなたか、ご教授よろしくお願いします。

Visual C++ 2005のC++/CLIでプログラム作成しています。
C言語で書かれたプログラムを組み込みたい為に、
マネージコードでテキストファイル読み込みをして、2次元配列に格納し、
int型に変換してネイティブコードの配列にコピーしたいのですが、上手く書けません。。
テキスト内容は数字のみで2次元に並んでおり、1文字ずつ配列に入れたいです。
エラー出ているのですが、下記にコードを載せます。

#include<string>
#include<vcclr.h>

using namespace System;
using namespace System::IO;

in...続きを読む

Aベストアンサー

 こんばんは。補足を頂きました。

 合点が行きました。ファイルによってXとYが可変するという事は、少なくともdata[y][x]は動的に割り当てないと対応できないのでは。
 なるべくString^やarray<T>^を利用して、寸前までC言語への変換を遅らせた方が良いかもしれません。

 array<array<String^>^>^ table

 とされていますが、実際には

 array<String^>^ table

 で十分だと思います。ストリームリーダへ1ライン毎に読み込ませながら、tableを拡大して行けば良いと思います。

 y = table->Length
 x = line->Length

 を使って、int data[y][x]を動的に割り当てて、

 data[y][x] = int::Parse(table[y][x].ToString())

 としていけば、atoi()を使用せずとも簡単に変換出来ます。
 複雑化して来ているので、なるべくフェーズ毎に関数へ分解した方が最終的には取り扱いが楽になります。
 後、ループはfor each in構文を使用した方が、良い事もあります。
 以下参考程度です。

 因みに此れ、例えば、
 2547379780
 6972206030111
 7920373017
 2
 11
 657

 などでも受け付けます。array<T>^やString^を使用しているので、そう言った事が簡単に出来ます。
 もしかしたら、間違いがあるかもしれませんが、そこはご勘弁です。

#include<string.h>
#include<vcclr.h>
#include<stdlib.h>

using namespace System;
using namespace System::IO;

//2次元配列のハンドル
struct Array2DHandle
{
int width;//Xの事
int height;//Yの事
int** data;//data[y][x]で使用する
};
//2次元配列を割り当てる
void AllocateArray2D(Array2DHandle* handle)
{
//縦幅を割り当てる
handle->data = new int*[handle->height];

//横幅を割り当てる
for(int y = 0; y < handle->height; ++y)
{
handle->data[y] = new int[handle->width];
}
}
//2次元配列を開放する
void Array2DFree(Array2DHandle* handle)
{
//横幅を開放する
for(int y = 0; y < handle->height; ++y)
{
delete [] handle->data[y];
handle->data[y] = NULL;
}

//縦幅を開放する
delete [] handle->data;
handle->data = NULL;
}
//String^テーブルからint[y][x]に変換する
void ConvertArray2DFrom(Array2DHandle* handle, array<String^>^% table)
{
int y = 0;
for each(String^ line in table)
{
printf("<int配列> ");
int x = 0;
for each(Char wc in line)
{
handle->data[y][x] = int::Parse(wc.ToString());
printf("%d", handle->data[y][x]);
++x;
}
printf("\n");
++y;
}
}
//ストリームリーダーを読み込んで、String^テーブルを作成する
array<String^>^ ConvertTableFrom(StreamReader^% sr)
{
array<String^>^ table = gcnew array<String^>(0);
String^ line = nullptr;
while(!sr->EndOfStream)
{
line = sr->ReadLine();

//読み込んだ内容を表示
Console::WriteLine("<System::String表示>" + line);

//String^テーブルを拡大して読み込んだ内容を入れていく
table->Resize(table, table->Length + 1);
table[table->Length - 1] = line;
}
return table;
}
//String^テーブルの最大横幅を調べる
int GetTableMaxWidth(array<String^>^% table)
{
int width = 0;
for each(String^ line in table)
{
//比較しながら一番文字数が多かったString^がdata[y][x]のxに必要な幅
if(width > line->Length)
continue;

width = line->Length;
}
return width;
}

int main(void)
{
//ファイルオープン
StreamReader^ sr = gcnew StreamReader("hoge.txt");

//ファイルが無い
if(sr == nullptr)
return 0;

//String^の配列に変換する
array<String^>^ table = ConvertTableFrom(sr);

//ファイルのクローズ
sr->Close();

//配列が拡張されなかった
if(table->Length == 0)
return 0;

//2次元配列の作成準備
//サイズ固定={X, Y}で入力する
//Array2DHandle handle = {10, 3};

//こっちは、読み込んだ文字列の行数と一番大きな文字列数からdata[y][x]のyとxを決定する
Array2DHandle handle = {GetTableMaxWidth(table), table->Length};

//割り当てる
AllocateArray2D(&handle);

//String^の配列からint[y][x]に変換する
ConvertArray2DFrom(&handle, table);

//開放する
Array2DFree(&handle);

return 0;
}

 こんばんは。補足を頂きました。

 合点が行きました。ファイルによってXとYが可変するという事は、少なくともdata[y][x]は動的に割り当てないと対応できないのでは。
 なるべくString^やarray<T>^を利用して、寸前までC言語への変換を遅らせた方が良いかもしれません。

 array<array<String^>^>^ table

 とされていますが、実際には

 array<String^>^ table

 で十分だと思います。ストリームリーダへ1ライン毎に読み込ませながら、tableを拡大して行けば良いと思います。

 y = table-...続きを読む

Q[C++]const int と配列

constについて教えてください。以下のコード
//------------------------------------------------------
#include <stdio.h>
#include <math.h>
const double RANGE = 12.;
const int MESH = 10;
//const int N = (int)(12.0*10); // (1) OK
//const int N = (int)(12.0*MESH); // (2) OK
const int N = (int)(RANGE*10); // (3) NG
//const int N = (int)rint(12.0*10); // (4) NG
double Array[N];
//------------------------------------------------------
をg++ 4.0.1でcompileすると
error: array bound is not an integer constant
とでてきます。(1)(2)ではエラーは出ません。
(1)(2)が良くて、(3)がだめな理由がわかりません。
どなたか教えてください。

constについて教えてください。以下のコード
//------------------------------------------------------
#include <stdio.h>
#include <math.h>
const double RANGE = 12.;
const int MESH = 10;
//const int N = (int)(12.0*10); // (1) OK
//const int N = (int)(12.0*MESH); // (2) OK
const int N = (int)(RANGE*10); // (3) NG
//const int N = (int)rint(12.0*10); // (4) NG
double Array[N];
//----------------------------------------...続きを読む

Aベストアンサー

配列を宣言するときの要素数は, 整数型の定数式が必要です.
この「整数型の定数式」に「リテラル」や「整数型の const 変数」は使えるんですが, 「実数型の const 変数」を使うことはできません. そういうものです.
ISO だと 5.19 Constant expression のあたりに, この制限が書かれています.

Qchar *name1[4] とchar name2[][4] の違いについて

C言語のことで質問があります。

char *name1[4]は
char *name1[4] = {"abcdefghi","jkl","l","mn"};
と宣言でき,ポインタを4つ確保した形となりました。

char name2[][4]は
char name2[][4] = {"abc","def","ghi","jkl","mno","pqr","stu","vwx"};
と4文字以内の文字列を初期化した数だけ確保した形となりました。

この結果からchar *name1[4]の意味は,char name2[][4]ではなくchar name2[4][]に近いと思いました。
しかし,char name2[4][]ではポインタを4つ確保した事にはならないみたいでコンパイルが通りません。
*name1[4]では4つのポインタを確保できるのに~と思ってしまいます。

ポインタと配列は別物と考えるべきなのでしょうか?
訳の分からない質問かもしれませんが,
何卒ご指導いただくようよろしくお願いします。

Aベストアンサー

ポインタと配列の違いというのは、変数と定数の違いのようなものです。

話を簡単にするために、一次元配列から考えましょう。

char *p1; と定義した時のp1は、いうまでもなくポインタで、
これは変数です。p1は任意の文字列を指すことができます。
char a1[4]; と配列の形で定義した場合のa1については、
a1[0]やa1[1]等を、通常のchar型の変数と全く同じように扱うことが
できます。しかし、a1自体は、例えば a1 = p1; のように値を代入する
ことができません。(逆の p1 = a1; は可能。)つまり、この場合のa1は、
変数ではなく、定数のようなものなのです。

複合的なケースについて見てみましょう。
char **q1; ポインタへのポインタ
 q1,*q1,**q1,q1[0],*q1[0],q1[0][0] のいずれも変数として
 扱うことができます。(値を代入することが文法的に許されます。
 ただし、実行時にはアクセス違反になる場合もあります。)
char q2[4][4]; 二次元配列
 q2,q2[0]は変数として扱うことができません。q2[0][0]のように
 して、初めて変数として扱えるようになります。
char *q3[4]; ポインタの配列
 q3は変数として扱うことができませんが、q3[0],*q3[0],q3[0][0]
 はいずれも変数として扱うことができます。
 なお、この定義は char *(q3[4]); とした場合と全く同じ意味です。
char (*q4)[4]; 配列へのポインタ
 q4,(*q4)[0],q4[0][0]はいずれも変数として扱うことができます。
 しかし、*q4,q4[0]は変数として扱うことができません。

char *name1[4]; と char name2[4][]; は確かに似ています。しかし
違うところもあります。それは、name1[0] が変数として扱えるのに
対し、name2[0] には値を代入できないという点です。(データの
具体的な構造については、inthefloiさんが書いておられる通りです。
> char name2[4][]ではポインタを4つ確保した事にはならないみたい
というのも、全くその通りで、配列の定義では、ポインタ変数の領域
を確保する余地はないのです。

ポインタと配列の違いというのは、変数と定数の違いのようなものです。

話を簡単にするために、一次元配列から考えましょう。

char *p1; と定義した時のp1は、いうまでもなくポインタで、
これは変数です。p1は任意の文字列を指すことができます。
char a1[4]; と配列の形で定義した場合のa1については、
a1[0]やa1[1]等を、通常のchar型の変数と全く同じように扱うことが
できます。しかし、a1自体は、例えば a1 = p1; のように値を代入する
ことができません。(逆の p1 = a1; は可能。)つまり...続きを読む

Q[C#]連想配列の中に配列を入れたい

いつもありがとうございます。

value["A"]["0"] = "a0";
value["A"]["1"] = "a1";
value["A"]["2"] = "a2";
value["B"]["0"] = "b0";
value["B"]["1"] = "b1";
....

みたいなのを作りたいと考えているのですが以下のようにやっても、できませんでした。
何が悪いのかがわかりません。

Dictionary<string, Dictionary<string, string>> value = new Dictionary<string, Dictionary<string, string>>();
value["A"]["0"] = "a0"; ←
value["A"]["1"] = "a1";
value["A"]["2"] = "a2";
value["B"]["0"] = "b0";
value["B"]["1"] = "b1";
...

実行すると、←のところで、
「指定されたキーはディレクトリ内に存在しませんでした。」
とエラーが出てしまいます。

上記のような配列を作りたい時はどのように書けばいいのでしょうか?
よろしくお願いします。

いつもありがとうございます。

value["A"]["0"] = "a0";
value["A"]["1"] = "a1";
value["A"]["2"] = "a2";
value["B"]["0"] = "b0";
value["B"]["1"] = "b1";
....

みたいなのを作りたいと考えているのですが以下のようにやっても、できませんでした。
何が悪いのかがわかりません。

Dictionary<string, Dictionary<string, string>> value = new Dictionary<string, Dictionary<string, string>>();
value["A"]["0"] = "a0"; ←
value["A"]["1"] = "a1";
value["A"]["2"] = "a2";
value["B"]["0"] = "b0";
va...続きを読む

Aベストアンサー

Dictionary<string, Dictionary<string, string>> value = new Dictionary<string, Dictionary<string, string>>();
value["A"] = new Dictionary<string, string>(); // これと
value["B"] = new Dictionary<string, string>(); // これを追加
value["A"]["0"] = "a0";
value["A"]["1"] = "a1";
value["A"]["2"] = "a2";
value["B"]["0"] = "b0";
value["B"]["1"] = "b1";


このQ&Aを見た人がよく見るQ&A

人気Q&Aランキング

おすすめ情報