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と関連する良く見られている質問

QVBのFunctionで、配列を引数や返却値にできますか?

配列の要素をソートするFunction を作成しようとしているのですが、
ソート対象配列を引数にして、返却値がソートされた配列になるように
したいと思ったのですが、その方法がわかりません。
それとも、引数に配列を入れることは不可能なのでしょうか。

Aベストアンサー

こんな感じです。配列をクイックソートしています。
配列を引数にするには、
Function hoge( Array()) As Long

End Function
のようにします

VBでは通常は「参照渡し」で引数を渡しますので、hoge()中でArray()の内容を書き換えると、呼び出しもとの関数中でも書き換え後の値を使用することが出来ます。

下記で、「ByRef Values()」としているのは、明示的に参照渡しである事を指定することにより、これを読むプログラマに対して「呼び出すとココの値を変更するねんで」ってことを伝えているわけです。



Option Explicit

Sub Main()
  Dim i As Long
  Dim Values() As Long
  
  '配列を初期化する
  ReDim Values(255) As Long
  For i = 0 To 255
    Values(i) = Rnd * 256
  Next i
  
  '配列をソートする
  Call QuickSortLong(Values())
End Sub

Public Sub QuickSortLong(ByRef Values() As Long, Optional StPos As Long, Optional EdPos As Long)

  Dim Ct As Long    'カウンタ
  Dim LastPos As Long  '配列最終番号
  Dim Buffer As Long   'バッファ
  
  '引数省略時の初期値
  If IsMissing(StPos) Then
    StPos = LBound(Values, 1)
  End If
  If IsMissing(EdPos) Then
    StPos = UBound(Values, 1)
  End If

  '終了番号が開始番号以下のときは処理を行わない
  If StPos >= EdPos Then
    Exit Sub
  End If

  '最初の値をバッファに格納
  Buffer = Values(StPos)
  '各バッファの値をスワップする
  '真ん中にある配列の値を最初の配列に代入する
  Values(StPos) = Values((StPos + EdPos) / 2)
  'バッファに格納された値を真ん中の配列に代入する
  Values((StPos + EdPos) / 2) = Buffer

  LastPos = StPos

  For Ct = StPos + 1 To EdPos
    If Values(Ct) < Values(StPos) Then
      LastPos = LastPos + 1
      '各バッファの値をスワップ
      Buffer = Values(LastPos)
      Values(LastPos) = Values(Ct)
      Values(Ct) = Buffer
    End If
  Next Ct

  '各バッファの値をスワップ
  Buffer = Values(StPos)
  Values(StPos) = Values(LastPos)
  Values(LastPos) = Buffer
  
  '再起呼び出し
  Call QuickSortLong(Values, StPos, LastPos - 1)
  Call QuickSortLong(Values, LastPos + 1, EdPos)
End Sub

こんな感じです。配列をクイックソートしています。
配列を引数にするには、
Function hoge( Array()) As Long

End Function
のようにします

VBでは通常は「参照渡し」で引数を渡しますので、hoge()中でArray()の内容を書き換えると、呼び出しもとの関数中でも書き換え後の値を使用することが出来ます。

下記で、「ByRef Values()」としているのは、明示的に参照渡しである事を指定することにより、これを読むプログラマに対して「呼び出すとココの値を変更するねんで」ってことを伝えているわけです...続きを読む

QVisual C++ と Visual C++ Express Edition

の違いについて教えてください。
ExpressでもMDIを作成できるのでしょうか?

Aベストアンサー

「Express Edition」には、大雑把にリソースエディタとMFCが付いていません。あとインストーラ作成機能が無かったかな?細かな違いはだいぶありますけど。
WindowsAPIやC++/CLIを使う分には、ほぼ同等にプログラムを作る事ができます。
MDIももちろん作れますよ。

「猫でもわかるプログラミング」
http://www.kumei.ne.jp/c_lang/
のようにリソースエディタやクラスウィザードを使わない作り方をする分には、ほぼ差が無いと思います。

QVB.NET: 型が配列のときの戻り値は?

仮に戻す値が無い場合は、私は Nothing かなと思います。
しかし、プログラマでもない素人。
VB.NET の学習も一カ月未満の超初学者。
もっとも、基本的なこととは思いますが答えが知りたいです。

「そうじゃない!ByRef を使う方が望ましい!」

という考え方もありかな!とも思っています。

Aベストアンサー

Functionの話ですね。
たった一つの答えというものはおそらく無くて、その戻り値を受け取る側でどうしているか、に影響されてくるのではないでしょうか。

例えば、そのメソッドの処理内でOKパターンではないと判別したとき、Nothingを返すことにより、待ち受ける側でNothingかどうかにより以後の処理を振り分けることが出来ます。
ただ、この場合は空の配列を返してもいいかもしれません。

もちろん、値を返さない場合があるという状況を作りたくないのであれば、FunctionではなくSubとして、ByRefの引数を使うという手もなくはないかも知れません。
この場合、事前に引数として用意しておかなければなりませんが。

大事なことかなと思うので2回言いますが、結局は「どうしたいか」が答えを決めると思います。

QVisual C++ 2008 Express EditionとVisual c++.net standard version 2003

私は大学生なのですが、最近大学のPCでMicrosoft Visual C++ 2008 Express Editionを使って自分なりに真面目にプログラムに取り組むようになりました。
そんな中、家の中の引き出しを整理していると、数年前に興味本位で購入したVisual c++.net standard version 2003が見つかりました。当時はちょっといじっただけでほとんど放置状態でした。

そこで詳しい方にお伺いしたいのですが、『Microsoft Visual C++ 2008 Express Edition』と『Visual c++.net standard version 2003』、これからはどちらを使ってプログラムを組んでいく方が良いと思われますか?幾つかサイトで調べてみましたが、イマイチ違いが分かりませんでした。

恐らくプログラムの目的によって変わってくるとは思いますが、その辺りも含めて御教え頂けたら…(こういうことするならこっち、特に何も制限がないならこちらを勧める、など)
ちなみに今の所、Microsoft Visual C++ 2008 Express Editionで不便に思ったことはありません。

私は大学生なのですが、最近大学のPCでMicrosoft Visual C++ 2008 Express Editionを使って自分なりに真面目にプログラムに取り組むようになりました。
そんな中、家の中の引き出しを整理していると、数年前に興味本位で購入したVisual c++.net standard version 2003が見つかりました。当時はちょっといじっただけでほとんど放置状態でした。

そこで詳しい方にお伺いしたいのですが、『Microsoft Visual C++ 2008 Express Edition』と『Visual c++.net standard version 2003』、これからはどちらを使ってプ...続きを読む

Aベストアンサー

2003と2008の違いは大学生が趣味か学業のためにやる程度であれば差がないと思います.

2003から2008への変更点ですが,
・Vista対応
・64ビットCPUへの対応
・.NetFramework 3.5に対応
・コンパイラの最適化精度が上がっている

ExpressEditionは,使用用途や製品版と比べてWindows SDKなどが省かれています.

QArrayListの初期値に二次元配列を設定したい(VB2005)

下記は、aryhogeにTextBoxオブジェクトを格納する処理です。

----------------------------------------
'a)
Dim hoge()() As TextBox = _
      {New TextBox() {txta01, txtb01, txtc01}, _
      New TextBox() {txta02, txtb02, txtc02}, _
      New TextBox() {txta03, txtb03, txtc03}}

Dim aryhoge As New ArrayList    'b)

aryhoge.Add(hoge(0))
aryhoge.Add(hoge(1))
aryhoge.Add(hoge(2))
----------------------------------------

(a)を(b)の初期値として設定するにはどのようにすればよいか、ということが質問内容です。

試しに(b)の部分を以下のようにしてみましたが、「1次元配列の値を変換できない」とのエラーが出ました。
Dim aryhoge As New ArrayList(New TextBox() {hoge(0), hoge(1), hoge(2)})

どうぞよろしくお願い致します。

下記は、aryhogeにTextBoxオブジェクトを格納する処理です。

----------------------------------------
'a)
Dim hoge()() As TextBox = _
      {New TextBox() {txta01, txtb01, txtc01}, _
      New TextBox() {txta02, txtb02, txtc02}, _
      New TextBox() {txta03, txtb03, txtc03}}

Dim aryhoge As New ArrayList    'b)

aryhoge.Add(hoge(0))
aryhoge.Add(hoge(1))
aryhoge.Add(hoge(2))
----------------------------------------

(a)を(b)の初期値として...続きを読む

Aベストアンサー

Dim aryhoge As New ArrayList(hoge)

QVisualC++でコントロール配列

 Visual C++において、VBのコントロール配列のような事をすることはできるのでしょうか?
 たとえば、VBでコントロールをコピーアンドペーストして10個作った際、コントロールは
 Control(1).Caption="どうのこうの"
 として扱うことができますよね。
 このようなまるで配列(?)のような機能は、VC++では使えるのでしょうか?
 もし使えるのでしたら、どのように使えばいいのでしょうか?教えてください。

Aベストアンサー

コントロール配列そのものはありませんが、工夫次第で近いことはできます。

参考URL:http://search.acty-net.ne.jp/mfc_search/archive/1998-1/msg03255.html

QVB6でやると構造体の配列になる変数をVB2008では何で作ればいいか

VB6でプログラムを作っていたときは
値のセットが配列になるとき
構造体を動的配列で宣言してデータを足して作りました。

VB2008で開発をすることになり
同じようなことをしたいのですが
もっと便利なやり方が登場したりするのでしょうか?
クラスで挑戦したのですが動的配列はできないようでした。

Aベストアンサー

#書き連ねてたらやたら長くなってしまったので必要と思うところだけ抜粋して読んでくださいませ。

> できれば下記のようにしたかったので
> 同じようなことができないでしょうか?

■構造体+配列
Public Structure MainGroup
  Public ID As Integer
  Public SubGroups As SubGroup()
End Structure

Public Structure SubGroup
  Public ID As Integer
  Public Value1 As Integer
  Public Value2 As Integer
  Public Sub New(ByVal ID As Integer, ByVal Value1 As Integer, ByVal Value2 As Integer)
    Me.ID = ID : Me.Value1 = Value1 : Me.Value2 = Value2
  End Sub
End Structure

Public Class Program
  Public Shared Sub Main()
    Dim DataArray As MainGroup() = {}
    Array.Resize(DataArray, 3)

    With DataArray(0)
      .ID = 1
      Array.Resize(.SubGroups, 4)
      .SubGroups(0) = New SubGroup(101, 123, 456)
      .SubGroups(1) = New SubGroup(102, 234, 567)
      ' (略)
    End With

    With DataArray(1)
      ' (略)
    End With
  End Sub
End Class

■クラス+コレクション
Public Class MainGroup
  Public ID As Integer
  Public SubGroup As New System.Collections.Generic.List(Of SubGroup)
End Class

Public Class SubGroup
  Public ID As Integer
  Public Value1 As Integer
  Public Value2 As Integer
  Public Sub New(ByVal ID As Integer, ByVal Value1 As Integer, ByVal Value2 As Integer)
    Me.ID = ID : Me.Value1 = Value1 : Me.Value2 = Value2
  End Sub
End Class

Public Class Program
  Public Shared Sub Main()
    Dim DataList As New System.Collections.Generic.List(Of MainGroup)
    Dim NewMain As MainGroup

    NewMain = New MainGroup
    NewMain.ID = 1
    NewMain.SubGroup.Add(New SubGroup(101, 123, 456))
    NewMain.SubGroup.Add(New SubGroup(102, 234, 567))
    ' (略)
    DataList.Add(NewMain)
  End Sub
End Class

配列+クラスはNULL参照を発生させる可能性がある点で相性がよくありません。コレクション+構造体は、#2で挙げたようにデータ書き換えの手間がかかり、やはり相性はよくありません。
配列は要素数の変動に対してパフォーマンスが悪く、細かく増減させるには不向きです。コレクションは増減することを前提としている点や、削除した箇所を詰めたり途中に挿入したりが容易な点で優れています。
クラス or 構造体、配列 or コレクション をどう組み合わせるかはこれらのほか、ユーザビリティ・保守性・整合性・パフォーマンスなどと共に天秤にかけることになるでしょう。状況にあわせてうまく使い分けてください。


> addでどんどん追加して全体をループさせずに小項目IDを取得する方法

小項目IDがユニークであれば、リストコレクションではなく辞書コレクションを使うことでIDからクラスを取得できるようになります。クラスが保持しているデータをキーに使う場合は、コレクションを継承したクラスを作り、AddをShadowsで置き換えたほうがコーディングミスを防ぐことが出来ます。

■クラス+コレクションクラス
Public Class Group
  Public MainID As Integer
  Public SubID As Integer
  Public Value1 As Integer
  Public Value2 As Integer
End Class

Public Class GroupCollection : Inherits System.Collections.Generic.Dictionary(Of Integer, Group)
  Public Shadows Sub Add(ByVal Item As Group)
    MyBase.Add(Item.SubID, Item)
  End Sub
End Class

Public Class Program
  Public Shared Sub Main()
    Dim DataDict As New GroupCollection
    Dim NewGroup As New Group
    NewGroup.MainID = 1
    NewGroup.SubID = 101
    NewGroup.Value1 = 123
    NewGroup.Value2 = 234

    DataDict.Add(NewGroup)

    Console.WriteLine(DataDict.Item(101).Value2) ' 出力 234
  End Sub
End Class

#書き連ねてたらやたら長くなってしまったので必要と思うところだけ抜粋して読んでくださいませ。

> できれば下記のようにしたかったので
> 同じようなことができないでしょうか?

■構造体+配列
Public Structure MainGroup
  Public ID As Integer
  Public SubGroups As SubGroup()
End Structure

Public Structure SubGroup
  Public ID As Integer
  Public Value1 As Integer
  Public Value2 As Integer
  Public Sub New(ByVal ID As Integer, ByVal Value1 As Integer, B...続きを読む

QVisual C++ 6.0とVisual C++ 2005 についてですが・・・

Visual C++ 6.0でワークスペースと呼ばれていた物がVisual C++ 2005になるとソリューションと言う名前になったと聞きました。
また、Visual C++ 6.0で製作したファイルはVisual C++ 2005でも開けるけどVisual C++ 2005製作したファイルはVisual C++ 6.0では開けないと聞いたのですがVisual C++ 2005製作したファイルをVisual C++ 6.0でも開ける様に互換性を持たせる方法はありませんか?
学校と家で使っている環境が違うので互換性がもてれば両方で使えてとても便利になります。
御存知の方がいましたら御伝授お願いします。

Aベストアンサー

ソースファイルやヘッダファイル(拡張子CPP/C/H/HPPなど)はVisual C++ 6.0と2005で共用できるので、6.0用のプロジェクトファイル&ワークスペースと、2005用のプロジェクトファイル&ソリューションファイルを用意すれば両方の環境で開発を進めることができるでしょう。

但し、以下の点にご注意下さい。
・ソースファイルの追加や削除は両方のプロジェクトに対して行うこと。
・Visual C++6.0ではManaged C++が使えないのでManaged C++は使わないこと。
・MFCの仕様がだいぶ違うので、MFCも避けること。MFCを知り尽くしているのでしたらチャレンジはご自由に。
・C++コンパイラとしても若干仕様が違うので(for文内で定義された変数のスコープなど)、常に両方の環境でコンパイルできるか考えながら開発する必要があること。

QVBスクリプトの配列数字をJAVAスクリプトで使うには

表題があまり良くないですが
VBSでページを作っています

その中で
ページ閲覧者がテキストボックスに値を記入したときに
JAVAスクリプトのonchangeでJAVAスクリプトへ飛んで

VBスクリプトで定義した配列の値を代入したいのですが
うまくいきません
飛んでいった先のコードが
<script type="text/javascript">
<!--
//値の代入
function hoge(FRM){
FRM.hoge1.value=ここにVBスクリプトの配列
}
// -->
</script>
これだけのことなのですが
配列を直接数字で書くと
FRM.hoge1.value=<%=atai(1)%>
hoge1にはきちんと値が入力されます

しかし この1と言う数字の所に
FRM.hoge2.value の値をいれてやろうとすると
イメージとしては
FRM.hoge1.value=<%=atai(FRM.hoge2.value )%>
なんですが、これではエラーがでます(当然ですよね)
色々"" でくくったり & や + ()などの
組み合わせでやってもうまくいきません

どなたか正しい構文か方法を教えてください
よろしくお願いします


 

表題があまり良くないですが
VBSでページを作っています

その中で
ページ閲覧者がテキストボックスに値を記入したときに
JAVAスクリプトのonchangeでJAVAスクリプトへ飛んで

VBスクリプトで定義した配列の値を代入したいのですが
うまくいきません
飛んでいった先のコードが
<script type="text/javascript">
<!--
//値の代入
function hoge(FRM){
FRM.hoge1.value=ここにVBスクリプトの配列
}
// -->
</script>
これだけのことなのですが
配列を直接数字で書くと
FRM.hoge1.v...続きを読む

Aベストアンサー

何かを勘違いされていると思います。

umadura4747さんが言われている、VBScriptの配列と言うのは、サーバー上での変数を指し、JavaScriptの値と言うのは、クライアント上の変数を指しています。
つまり、次元が違うため実行できないのです。

解決方法としては、

1. VBScriptという配列がサーバー上でしか定義できない場合
 以下のようなJavaScriptのソースを生成するために、ASPコードを追加してあげる。

 var a = new Array("a", "b", "c");

2. クライアント側でも配列が定義できる場合
 先ほどと同じコードをあらかじめJavascriptで定義しておく

ASPとは、サーバー上で動的にHTMLソースを生成することを目的としています。
まずは、やりたいことをHTMLソースで記述し、それを生成するためには、どういったASPコードを書くかを考えてください。

QVisual C++ 6.0で作成したプログラムをVisual C++

Visual C++ 6.0で作成したプログラムをVisual C++ 2008で実行することはできるのでしょうか?

ビルドしてみるのですが、afxwin.hがないと表示されてしまいます。
自分でも検索してみたのですが、ダウンロードできる状況なのかも良く分かりませんでした。

2週間後にプレゼンがあるのですが、手持ちのパソコンにはVisual C++2008しかないため、6.0をインストール、と考えたのですがそれもできないようなので・・・

もし、実行できるのであればその方法をお手数ですが分かりやすく教えてくださるとうれしいです。

Aベストアンサー

ひょっとして Visual C++ Express Edition を使っているのでしょうか。

afxwin.h は MFC のヘッダーで、MFC は Visual C++ Express Edition では利用できません。
Visual Studio の Standard Edition 以上を購入するか、Visual C++ 6.0のプログラムをもとに .NET で作り直すかのどちらかですが、……前者は結構な出費となりますし、後者は 2 週間ではかなり難しいと思います。


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

人気Q&Aランキング