- 締切済み
(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の使い方ミス? 原因や解決法などおわかりの方いましたら、回答よろしくお願いします。
- みんなの回答 (2)
- 専門家の回答
みんなの回答
- redfox63
- ベストアンサー率71% (1325/1856)
ArrayListに追加された物が chkそのものではなく chkの参照だからこのような実行結果になるのでしょう chk = New AAA chk.ValBBB.val = 10 AList.Insert(0,chk) ' 新規のオブジェクトを構築 chk = New AAA chk.ValBBB.val = 20 AList.Insert(0,chk) ' 新規のオブジェクトを構築 chk = New AAA chk.ValBBB.val = 30 AList.Insert(0,chk)
- KG_
- ベストアンサー率62% (34/54)
>chk.ValBBB.val = 10 >AList.Insert(0,chk) >chk.ValBBB.val = 20 >AList.Insert(0,chk) >chk.ValBBB.val = 30 >AList.Insert(0,chk) chk変数をそれぞれ宣言して、 chk1.ValBBB.val = 10 AList.Insert(0,chk1) chk2.ValBBB.val = 20 AList.Insert(0,chk2) chk3.ValBBB.val = 30 AList.Insert(0,chk3) のようにしても同現象が発生しますか? これで解決するならInsertしているのはchkへの参照ということになります。 #小さいサイズだとうまくいくというのがひっかかりますが。。。
補足
確かにAListに格納されるItemがchkへの参照データになっている動きですね。 わたしが質問の中で書いたものに関しては ご指摘の通りに変更したらうまくいきました。 ありがとうございます。 しかし、実際には随時更新される構造体AAAの変数XXXがあって XXX更新のたびに関数の中でAListに格納しています。 Dim XXX as AAA <--- 処理用変数 Dim AList as NEW ArrayList <--- Undo用XXXバッファリング ※XXXが更新されるたびにバッファリング関数XXX_Updateをコール Private Function XXX_Update() Dim XXX_Buf as AAA XXX_Buf = New AAA XXX_Buf = XXX AList.Insert(0,XXX_Buf) End Function という具合に変更しても前と同じ結果NGになってしまいます。 これはXXX_BufがXXXの参照型になっているということでいいでしょうか? だとすればXXX自体が値型ではなく参照型でしょうね。 ではXXX_BufにXXXの実体(値型)を入れるにはどうすればいいでしょうか? XXX_Buf = XXX のところを XXX_Buf = DirectCast(XXX, AAA)としてもダメでした。 どうかよろしくお願いします。