• 締切済み

構造体をコレクションに入れて扱いたいのですが…

当方、Windows2000(SP2) + VB6.0(SP5) の環境です。 今、私が困っている事なのですが、宣言した構造体に入れた値を、 構造体ごとコレクションに追加して扱いたいと言う所なのです。 しかし最初の「構造体をコレクションに追加する」と言う時点で躓いています。 もしかして、構造体ごとコレクションに登録すると言う事は出来ないのでしょうか? 私が考えて書いたコードは以下のようになっております。 --- 標準モジュールにて構造体を宣言 --- Public gcolAddData As New Collection 'Collectionオブジェクト Public Type AddData '各データをレコードで獲得 varName As Variant varPostCd As Variant varAddress As Variant varTellNum As Variant End Type Public gAddData As AddData --- 以下が実際に走っているソースです --- '構造体に取得する With gAddData --- ここで構造体の各変数に値を入れています --- End With '構造体をコレクションに格納 gcolAddData.Add gAddData 普通にAddしてしまう方法なのですが、これでは駄目なのでしょうか。 方法があるのであれば教えて頂けると嬉しいです。 また、これは念の為の確認としてお聞きしたいのですが、 コレクションに追加した構造体を受け取りたい時は 以下のようにSet文で構わないですよね? Dim tmpAddData As gcolAddData Set tmpAddData = gcolAddData.Item(0) 何分、まだこの段階まで進めていない状態ですので……(汗 どうぞよろしくお願いします。

みんなの回答

  • ryoukun
  • ベストアンサー率38% (16/42)
回答No.2

随分古い質問なので、本人はもう見ないかもしれないけど、同様の問題ではまっている人がいるかも知れないので、書いておきます。 構造体をCollectionに入れるのではなく、構造体をClassに変換して、そのClassをベースとした、Collectionを作成すれば、目的の内容は実現できるはずです。

  • maruru01
  • ベストアンサー率51% (1179/2272)
回答No.1

こんにちは。maruru01です。 Collectionオブジェクトのヘルプには以下のように書かれています。 Collection オブジェクトの構成 Collection オブジェクトには、バリアント型 (Variant) で各トピックが格納されています。したがって、Collection オブジェクトに追加できる事柄の一覧は、バリアント型に格納できる事柄の一覧と同じです。これには、基本データ型、オブジェクト、および配列が含まれ、ユーザー定義の型は含まれません。 したがって、ユーザー定義の型(いわゆる構造体)は追加出来ないようです。 コレクションを使ってどうのような処理をしたいのか分かりませんが、だいたいは、配列で代用出来るのではないでしょうか。 では。

関連するQ&A

  • 構造体からレコードセットへの代入

    下のような構造体があり、その値をレコードセットに代入したいと思います。 構造体内の変数名とレコードセットのフィールド名が同じなので名前を 利用して簡潔に書けないかと思うのですが、これは可能でしょうか? '構造体 Type Product  Price As Long  Name As String  Size As Single End Type '変数の宣言 Dim Car As Product 'レコードセットへの代入 With Product  RS("Price").Value = .Price  RS("Name").Value = .Name  RS("Size").Value = .Size End With

  • Collectionによる多次元配列

    VBAでCollectionを二つ使用し、 値が入ったCollectionをもう片方のCollectionに入れて2次元配列のようにしたいのですが、 やり方がいまいちわかりません。 確か昔にそういった使い方をした記憶があるのですが、 ネットで調べてもみかけないので困っています。 Dim colA As Collection Dim colB As Collection Set colA = New Collection Set colB = New Collection colB.Add ("A") colB.Add ("B") colB.Add ("C") ※ colA.Item(1) = colB. Set colA = Nothing Set colB = Nothing 上記の※の箇所をどうすれば入れられるのでしょうか。 宜しくお願い致します。

  • コレクションの取り扱い

    宜しくお願いします。 下記のようなソースでクラスをコレクション化したのですが for each文で値が変わってくれません。(泣) 何か基本的な事だと思うのですが、お知恵を頂ければ幸いです。m(__)m 'emp Collection Public Class clsEmp Inherits System.Collections.ArrayList '色々とメソッドを追加予定・・・ End Class 'empの構造体 Public Structure emp Public ID As Integer Public name As String Public score As Integer Public Sub New(ByVal ID_ As Integer, ByVal name_ As String) Me.ID = ID_ Me.name = name_ Me.score = -1 End Sub End Structure 'モジュール 'empのCollectionを宣言 Private emps As New clsEmp Private Sub Form_Load(・・・) Dim i% 'とりあえず、インスタンスを作る For i = 0 To 10 emps.Add(New emp(i, "test" & i)) Next End Sub Private Sub Button3_Click(・・・) Dim emp_ As emp '初期化してみる For Each emp_ In emps Debug.WriteLine(emp_.name) emp_.score = 0 Next '確認用 For Each emp_ In emps Debug.WriteLine(emp_.score) Next End Sub

  • 構造体を用いてKEYをチェックしたい。

    VB2005、FlexGrid.NET環境です。 DataReaderを使い、KEYがかぶらなければ Gridに行を追加していく、という処理をやりたいと思っています。 たとえばKEYが1つであれば、 Dim keyCheck As New ArrayList While dr.Read 'レコードの数だけ処理を行う  If Not keyCheck.Contains(dr("KEY")) 'かぶっていない場合 fg.Rows.Add() '行を追加  keyCheck.Add(dr("KEY")) End While という処理で良いかと思うのですが、KEYが複数ある場合はどう したら良いか困っています。 たとえば、KEY1が1で、KEY2が2という値があった場合、上記の 方法ではKEY1しか判定できないですし、Arraylistをもう1つ 作ってAndで見るのでは、KEY1とKEY2を併せて判定できません。 おそらく、構造体というものを使うんだろうなとは思うのですが、 どうやって構造体に値を入れていけばいいのかわからず…。 出来ましたら、サンプルソースを交えて教えていただけると 助かります。 宜しくお願いします。

  • 構造型の宣言について

    VB6.0の標準モジュールにて、 Option Explicit Public Type typeData data() As Variant End Type Public arrData() As typeData と構造型の配列を宣言したのですが、 メインのフォーム内にて Public Sub syori(arrData() As typeData) ~ end sub と記述しても、 プライベートモジュール内で宣言した型は使えません、と出てしまいます。 構造型をサブルーチン内で使うことはできないのでしょうか? 分かる方がいらっしゃいましたら、ご教授のほどお願いいたします。

  • 構造体の宣言

    下記のように構造体の宣言をした所、 struct B_PARAM test; 「`test' の領域サイズがわかりません」というエラーになってしまいました。この構造体を宣言し、値を入れていこうとしています。 ヘッダファイルに構造体の形は定義してあるのですが、 構造体の中に構造体があるからでしょうか? またこの構造体を正しく宣言するにはどうすればいいのでしょうか?

  • VB COLLECTIONについて

    VB collectionで  dim col1 as collection と定義した時  ウォッチで見た時    col1 |--- Item1 | |--- Fild1  値 | |--- Fild2  値 | |--- Fild3  値 |--- Item2 このFild1~Field3の名前をセットするにはどうしたらいいの でしょうか? クラスで名前を一つずつ設定すれば出来るのですが、 それを動的に行いたいのです。 配列 AA(2)に AA(0)="Name",AA(1)="Address1",AA(2)="Address2"  col1.add aa, "1" とやってみても(0)(1)(2)となってしまいます。 もし動的にセット出来れば、テーブルの列名を取得して その都度セット出来るようにしたいのですが。

  • VB2005の構造体で配列を含む構造体へアクセスするプロパティの記述方法

    VB2005の構造体で、以下のように Dantaiという配列を含む構造体があり、 プロパティを記述する方法で困っています。 Structure Person Dim namae As String Dim toshi As Integer end Structure Structure Dantai Dim m_DantaiMei As String Dim m_Hito() As Person Public Sub New(mei As String) m_DantaiMe = mei Redim m_Hito(100) End Sub '団体名 Public Property Dantai_Mei() As String Get Return m_DantaiMei End Get Set(ByVal value As String) m_DantaiMei = value End Set End Property '人 Public Property ???  '???????????? どのようにプロパティを設定したらよいのでしょうか? '???? '???? 配列で、しかも構造体です。 '???? '???? End Property End Structure Dim dantai As New Dantai("A") MessageBox(dantai.Dantai_Mei) MessageBox(人100人を表示させたい) '?????????????????????????? あと、構造体のDimはデフォルトで、PublicでしょうかPrivateでしょうか? VB2005の構造体について、VB6との違い、クラスとの違いなど詳しく書かれている サイトなどご存じの方教えて下さい。

  • 定数を構造体で・・・

    こんにちわ。 ちょっと疑問に思いまして、お聞きしたいのですが。 VB.net2005を使用しています。 定数宣言を構造体で宣言するのは 考え方として変でしょうか? たとえば public structure TEST   public dmy as byte '←エラー解除のダミー   public const CNUM as integer = 1 end structure public sub testM()   Lbl1.Text = TEST.CNUM end sub のように作り 定数宣言が多くあった場合に いちいちページ切り替え等をしなくても TEST.と打った後にすぐに一覧がでてくるので 便利だと思ったのですが。 この考え方はやっぱりへんなんですかね? もともとC言語出身なもので、 色々試していて疑問におもったのです。 もっとほかによい方法あるよ!ってのが あればお教えください。 お暇なときでよいので回答お願い致します^^   

  • VB6構造体をVB2008クラスで行う場合

    何方かの質問「VB6構造体をVB2008クラスで行う場合」 の回答プログラムにて参考とさせて頂きましたが 申し訳ありません、初心者しにて・・・・・教えてください。 値を「登録、参照部分」のクラス(抜粋) Public Class Program   Public Shared Sub Main()    (省略)   End Sub End Class 上記部分なのですが (1)Sharedを使用する訳はなんでしょうか?(省いても問題ありませんか?) (2)登録、参照部分のクラスPublic Shared Sub Main()を「登録のメソッド」と「参照のメソッド」に   分けたいのですがどうしてもうまくいきません。   何方か御教授願えないでしょうか? よろしくお願いします。 「以下何方かの質問の回答プログラム」 ■クラス+コレクションクラス 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

専門家に質問してみよう