- 締切済み
構造体をコレクションに入れて扱いたいのですが…
当方、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) 何分、まだこの段階まで進めていない状態ですので……(汗 どうぞよろしくお願いします。
- Naocky
- お礼率50% (3/6)
- Visual Basic
- 回答数2
- ありがとう数0
- みんなの回答 (2)
- 専門家の回答
みんなの回答
- ryoukun
- ベストアンサー率38% (16/42)
随分古い質問なので、本人はもう見ないかもしれないけど、同様の問題ではまっている人がいるかも知れないので、書いておきます。 構造体をCollectionに入れるのではなく、構造体をClassに変換して、そのClassをベースとした、Collectionを作成すれば、目的の内容は実現できるはずです。
- maruru01
- ベストアンサー率51% (1179/2272)
こんにちは。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
- 締切済み
- Visual Basic
- 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 上記の※の箇所をどうすれば入れられるのでしょうか。 宜しくお願い致します。
- ベストアンサー
- Visual Basic
- コレクションの取り扱い
宜しくお願いします。 下記のようなソースでクラスをコレクション化したのですが 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
- 締切済み
- Visual Basic
- 構造体を用いて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を併せて判定できません。 おそらく、構造体というものを使うんだろうなとは思うのですが、 どうやって構造体に値を入れていけばいいのかわからず…。 出来ましたら、サンプルソースを交えて教えていただけると 助かります。 宜しくお願いします。
- 締切済み
- Visual Basic
- 構造型の宣言について
VB6.0の標準モジュールにて、 Option Explicit Public Type typeData data() As Variant End Type Public arrData() As typeData と構造型の配列を宣言したのですが、 メインのフォーム内にて Public Sub syori(arrData() As typeData) ~ end sub と記述しても、 プライベートモジュール内で宣言した型は使えません、と出てしまいます。 構造型をサブルーチン内で使うことはできないのでしょうか? 分かる方がいらっしゃいましたら、ご教授のほどお願いいたします。
- 締切済み
- Visual Basic
- 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との違い、クラスとの違いなど詳しく書かれている サイトなどご存じの方教えて下さい。
- 締切済み
- Visual Basic
- 定数を構造体で・・・
こんにちわ。 ちょっと疑問に思いまして、お聞きしたいのですが。 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言語出身なもので、 色々試していて疑問におもったのです。 もっとほかによい方法あるよ!ってのが あればお教えください。 お暇なときでよいので回答お願い致します^^
- 締切済み
- Visual Basic
- 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
- ベストアンサー
- Visual Basic