0

親クラスがあります:CMove

CMoveを継承する子クラスがたくさんあります:M[移動の名前]

私は辞書を持っています:pMoveSet(of Stings、CMove)

ディクショナリの値は新しい子クラスです。例:pMoveSet(Key1、New MTackle)

ディクショナリから子クラスのインスタンスを保持する配列(CMoveとして)にインスタンスを設定したい:PossMoves(i)= kvp.Value

これは、辞書の「For Each」ループで行い、キーをチェックして値が必要かどうかを確認します。値が必要な場合は、kvpの値を配列の要素と等しくなるように設定します。

子オブジェクトが配列に追加された直後に、配列の位置と子オブジェクトの名前を正しく表示するmsgboxがあります。

私のコードはループを離れ、配列は必要なCMoveの関連するすべての子クラスを保持する必要があると思います。

「ForEach」ループのメッセージボックスと同じメッセージボックスがクラッシュし、「NullReferenceExceptionが処理されませんでした。オブジェクト参照がオブジェクトのインスタンスに設定されていません。」</p>

元々「ForEach」ループで作成されて配列に適用されたインスタンスは、配列がループの外で再度呼び出されるまでに失われているようです。

どうすればこれを修正できますか?これをどのように処理するかについて、いくらか明確にしていただければ幸いです。コードは以下のとおりです。

    Dim PossMoves() As CMove, kvp As KeyValuePair(Of String, CMove)
    ReDim PossMoves(0)

    For Each kvp In pMoveSet
        If Val(kvp.Key) < pLvl Then
            PossMoves(UBound(PossMoves)) = kvp.Value
            MsgBox(UBound(PossMoves) & vbCrLf & PossMoves(UBound(PossMoves)).Name)
            ReDim PossMoves(UBound(PossMoves) + 1) 'Will add unused element after the last possible move
        End If
    Next
    ReDim Preserve PossMoves(UBound(PossMoves) - 1) 'Removes blank value at the top of array
    MsgBox(UBound(PossMoves) & vbCrLf & PossMoves(UBound(PossMoves)).Name) 'Error on this line.
4

1 に答える 1

1

問題は、サイズを変更するときに配列が保持されていないことです。したがって、サイズを変更して新しい要素を配列に追加するたびに、配列がクリアされます。これを修正するには、次のように変更します。

ReDim PossMoves(UBound(PossMoves) + 1)

に:

ReDim Preserve PossMoves(UBound(PossMoves) + 1)

ただし、配列の代わりにList(Of CMove)を使用することを強くお勧めします。作業が簡単になり、効率も向上します。

Dim PossMoves As New List(Of CMove)()
For Each kvp As KeyValuePair(Of String, CMove) In pMoveSet
    If Integer.Parse(kvp.Key) < pLvl Then
        PossMoves.Add(kvp.Value)
    End If
Next
于 2012-09-26T15:37:16.117 に答える