• 締切済み

(VB2005) ArrayListへの実体(値型変数)格納について

先刻も質問させてもらい、redfox63さま、KGさまに 回答いただきありがとうございました。 ArrayListに参照型データが格納されているようであることが判明しました。 ではArrayListに値型(変数の実体)を格納するにはどうすればいいでしょうか? 【前提】 ・処理の中で構造体変数XXXが更新される。 ・XXX更新の都度、Undo用ArrayListのAListにXXXを保存する関数をコールする。 Dim XXX as New AAA Dim AList as NEW ArrayList  XXX <--- 処理の中で更新がかかるとともに、保存関数XXX_Updateをコールする。 Private Function XXX_Update( )  Dim XXX_Buf as AAA  XXX_Buf = NEW AAA  XXX_Buf = XXX …(1)  AList.Insert(0,XXX_Buf) …(2) End Function このような関数ではAListにXXXへの参照データが入ってしまい、 過去に保存したはずのItemすべてが現在のXXXになってしまいます。 ということはAListに格納されているデータはすべて 現在のXXXを参照するデータになっているということですね? AListにXXXの実体(値型)を格納するにはどうすればいいでしょうか? DirectCastが値型と参照型の変換という説明を見つけたので使ってみましたが、 うまくいきませんでした。  (1)⇒ XXX_Buf = DirectCast(XXX, AAA)  (2)⇒ AList.Insert(0,DirectCast(XXX_Buf,AAA)) 原因や解決法などおわかりの方いましたら、回答よろしくお願いします。

  • DLTC
  • お礼率0% (0/3)

みんなの回答

  • redfox63
  • ベストアンサー率71% (1325/1856)
回答No.1

構造体AAAに コンストラクタNewを定義してみてはいかがでしょう structure AAA dim ValBBB as BBB Sub New( src as AAA)   ' ここでメンバーのコピーをする   ValBBB = src.ValBBB ENd Sub End Structure といった具合に定義しておいて dim bbb as New AAA( XXX ) Alist.Insert( 0, bbb ) といった具合にしてみましょう

関連するQ&A

  • (VB2005) ArrayListにおいて、Itemを追加すると、以前追加されたものまで更新

    VB初心者です。 処理を行う都度更新のかかる変数をUndo用にArrayListへ保存しています。 最新のデータを0番目に格納したいため、.Insert(0,変数)を繰り返し行っていますが、 以前格納したItemデータ(1番目以降)も最新で格納したデータ(0番目)になってしまいます。 変数は複数の入れ子構造体を持つ構造体変数でサイズは29962292バイトあります。 構造体の詳細と変数の初期化処理は省略しますが、このような感じです。 public Structure AAA   ・・・   dim ValBBB as BBB   ・・・ End Structure public Structure BBB   ・・・   dim val   ・・・ End Structure dim chk as New AAA dim AList as New ArrayList chk.ValBBB.val = 10 AList.Insert(0,chk) chk.ValBBB.val = 20 AList.Insert(0,chk) chk.ValBBB.val = 30 AList.Insert(0,chk) dim str as string = "" str = "AList.Count = " & AList.Count & " " For loop1 as integer = 0 To AList.Count - 1   str = str & CType(AList(loop1),AAA).ValBBB.val & " " Next MsgBox(str) メッセージBOXに表示される結果が   "AList.Count = 3 30 30 30" となってしまうんです。 サイズ小さめの構造体で試したらうまくいくのですが、 上記の処理がうまく動作しません。 ・Itemサイズに上限あり? ・AListの属性かなにか? ・変数chkの属性かなにか? ・ArrayListの使い方ミス? 原因や解決法などおわかりの方いましたら、回答よろしくお願いします。

  • ArrayListへArrayListの格納

    お世話になっております。 ArrayListを2つ使用して2次元配列のような事をしようとしております。 データベースから取得したデータの1行をArrayListItemへ格納してそのArrayListItemをArrayListRecordへ格納しようとしております。 追加し終わり最後にArrayListRecordの中身を見ると全て一番最後のデータで置き換わっています。 どなたかご存知でしたらお教え願います。 ' 変数宣言 Dim objSqlDR As SqlDataReader Dim alSetItem As ArrayList Dim alSetRecord As ArrayList alSetItem = New ArrayList alSetRecord = New ArrayList ' データ取得分ループ While objSqlDR.Read()  alSetItem.Clear()  For intSetIndex = 0 To (objSqlDR.FieldCount - 1)   alSetItem.Add(objSqlDR(intSetIndex))  Next intSetIndex  alSetRecord.Add(alSetItem) End While

  • ArrayListの初期値に二次元配列を設定したい(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)}) どうぞよろしくお願い致します。

  • VB.NETの配列とArrayListについて教えてください。

    VB.NETで配列にPoint型のデータを入れたいのですが、 ArrayListのAddメソッドのように総数をあらかじめ指定せずに 順次追加するように登録していきたいのですが、 そのようなことは可能でしょうか? 最終的には Dim points As Point() g.DrawLines(Pens.Black, points) の方法で線分を描きたいのですが、 ArrayListですとデータ型が指定できないので Point型のデータを格納できないです。 良い方法がありましたら、ご教示頂けると助かります。

  • Generic.Listに1次元配列の配列を格納したい(VB2005)

    VB2005の質問です。 変数ghogeにString型の1次元配列の配列を格納したいと考えています。 ----------------------------------------------- 'a) Dim hoge()() As string = _       {New string() {"a1", "b1", "c1"}, _       New string() {"a2", "b2", "c2"}, _       New string() {"a3", "b3", "c3"}} Dim ghoge As New Generic.List(of )   'b) MessageBox.Show(ghoge(1)(1))      ' "b2"と表示したい ----------------------------------------------- 質問内容は、(a)を(b)の初期値として設定するにはどのようにすればよいか、ということです。 (b)がGeneric.ListでなくArrayListの場合だと、   Dim ghoge As New ArrayList(hoge) でhoge配列を格納できますが、Generic.Listの場合はどのような構文にすればよいでしょうか。 現在は、下記のような処理でghogeに値を格納しています。 ------------------------------------------------------------ Dim ghoge As New Generic.List(Of Generic.List(Of String)) Dim aryhoge1 As New Generic.List(Of String)(New String() {"a1", "b1", "c1"}) Dim aryhoge2 As New Generic.List(Of String)(New String() {"a2", "b2", "c2"}) gary_hoge.Add(ary_hoge1) gary_hoge.Add(ary_hoge2) MessageBox.Show(gary_hoge(1)(1))    ' "b2"と表示される ------------------------------------------------------------ どうぞよろしくお願い致します。

  • ArrayListに格納したクラス内のメンバの呼び出し方法(VB)

    お世話になります。VB2003でご質問があります。 通常Arryalistでは下記例1のように使用するのが一般的だと思うのですが、例2のようにArryaListにクラスを追加し、その中のメンバを呼び出すにはどのようにコーディングすればよいのでしょうか? コメントのコンパイルエラー箇所の部分です。 お手数ですが、ご教授よろしくお願いいたします。 ******************************************* (例1) Dim Test as new ArrayList Test.ADD("テスト") console.writeline(test(0)) ******************************************* ******************************************* (例2) Public Class A public strA as string public sub subTest() strA = "おはよう" end sub End Class Public Class B Dim a as new ArrayList a.Add(new A) a(0).subTest '--コンパイルエラー箇所 console.writeline(a(0).strA) '--コンパイルエラー箇所 End Class *******************************************

  • ArrayListの初期値の設定の仕方(VB.NET)

    VB.NET2005についての質問です。 ArrayList型の変数の初期値に、プロパティの戻り値を設定することは可能でしょうか。 (つまり、下記の(a)(b)の二行を一行にまとめたい、と考えています) どうぞよろしくお願い致します。 Public Class form1   Dim hoge As New ArrayList  'a)初期値としてClass1.P_hogeを設定したい   hoge = Class1.P_hoge    'b)消したい End Class Public Class Class1   Private Shared _hoge As New ArrayList  'すでに値が格納されているものとする   Public Shared Property P_hoge() As ArrayList      Get    Return _hoge    End Get   End Property End Class

  • コンボボックスの値をVBAで配列に格納したい

    コンボボックスの値をVBAで配列に格納したいのですが どういうコードにすればいいでしょうか? コンボボックスの参照元を格納するのではなく、 現在コンボボックスに表示されてるデータを格納したいです。 今、 Sub test() Dim varComb As Variant varComb = ActiveSheet.ComboBox1.Value End Sub というコードを作ったのですが、 これだと「aaa」しか取得できません。 varCombに"aaa,bbb,ccc"とカンマ区切りで格納するにはどうすればいいでしょうか? ComboBox1に表示されるデータ数を取得し、 ループさせ、 varComb = varComb & "," & ActiveSheet.ComboBox1.Value で格納していくイメージですが、コードが作れません。 よろしくお願いします。

  • VB.net 変数を動的にできませんか?

    わかる方ならすぐに回答いただけるものなのかもしれませんが 初心者でよろしくお願いします。 ActiveReportを使って帳票を作成しています。 質問自体は直接的に関係がないかもしれません。 ---------------------------------------- Dim report01 As New rptList() Dim report02 As New rptList() Dim report03 As New rptList() 'レコードがあれば印刷 If xxx.Count <> 0 Then report01.Run() End If If xxx.Count <> 0 Then report02.Run() End If If xxx.Count <> 0 Then report03.Run() End If 'ドキュメントマージ report01.Document.Pages.AddRange(report02.Document.Pages) report01.Document.Pages.AddRange(report03.Document.Pages) p.Export(report01.Document, m_stream) ---------------------------------------- データがあったものだけを印刷し、 最終的にマージして1つの帳票として出すのですが、 「データがあったとき」だけなので 最後のマージの部分のマージ元になる帳票名と (今はreport01です) あと追加する帳票が動的に変化してしまいます。 これを解決するためにはどうしたらよろしいでしょうか? やることは簡単なのにできない自分がいます。 よろしくお願いします。

  • Option Strictと構造体とArrayListの関係について(VB2005)

    下記はArrayListに構造体の値を格納し、表示させるプログラムです。 -------------------------------- Option Strict Off '構造体 Public Structure hoge   Dim a As String   Dim b As String   Dim c As String End Structure Private Sub test()   Dim aryhoge As New ArrayList   Dim foo As hoge   foo.a = "aa"   foo.b = "bb"   foo.c = "cc"   aryhoge.Add(foo)           MessageBox.Show(aryhoge(0).a)  'A) Option Strict Off だと"aa"と表示される End Sub -------------------------------- このプログラムはOption Strict Offだとメッセージボックスに"aa"と表示されます。 ですがOption Strict Onだと、(A)の箇所にて「遅延バインディングを使用できません」というエラーが発生し、実行ができません。 質問内容は、Option Strict Onで上記のプログラムを動かすには、(A)をどのように修正すればよいか、というものです。 どうぞよろしくお願い致します。