0

行の配列があり、ある時点でそれらの一部を消去したいと考えています。コードのサンプルを次に示します。

Dim canvas As New Microsoft.VisualBasic.PowerPacks.ShapeContainer
Dim lines(20) As PowerPacks.LineShape
Dim it As Integer = 0

Private Sub GoldenSpi_Load(sender As Object, e As EventArgs) Handles MyBase.Load
    canvas.Parent = Me
    lines.Initialize()
    iter.Text = 0
End Sub
Private Sub iter_TextChanged(sender As Object, e As EventArgs) Handles iter.TextChanged
   If (it > iter.Text And iter.Text <> 0) Then
        ReDim Preserve lines(iter.Text - 1)
   End If
   If (it <> iter.Text) Then
        it = iter.Text
   End If

   For i As Integer = 1 To iter.Text
      lines(i - 1) = New PowerPacks.LineShape(canvas)
      lines(i - 1).StartPoint = pA(i)
      lines(i - 1).EndPoint = pB(i)
      lines(i - 1).BringToFront()
   Next
End Sub

プログラムを実行すると、線が作成されます。しかし、変数「it」よりも小さい値をテキストボックスに与えると、残りの行ではなく最後の行が削除されます。また、デバッグ中に配列のサイズが縮小されていることがわかりました。ということは、サイズを超えた内容はまだ保持されているということですか?何故ですか?。どんな助けでも大歓迎です。ありがとう。

編集:次のようにリストを作成しようとしました:

Dim lines As New Generic.List(Of PowerPacks.LineShape)

Private Sub iter_ValueChanged(blabla) Handles iter.ValueChanged
    If (it > iter.Value And iter.Value <> 0) Then
        lines.RemoveRange(iter.Value - 1, lines.Count - iter.Value)
   End If

   For i As Integer = 1 To iter.Value
      InitPoints()

      If i - 1 = lines.Count Then
        Dim line As New PowerPacks.LineShape
        With line
            .StartPoint = pA(i)
            .EndPoint = pB(i)
            .BringToFront()
            .Parent = canvas
        End With
        lines.Add(line)
      End If
   Next

End Sub

しかし、それでも線はフォームに表示されます。デバッグしたところ、リストのサイズが減少したことがわかりました。私が配列を持っていたときと同じ問題。何が起こっているのですか?...

4

2 に答える 2

1

iter.Textに変更することをお勧めしcint(iter.Text)ます。両方の値をテキストとして比較する可能性があるためです (比較方法が異なります)。

Dim lines(20) As PowerPacks.LineShapeに変更することもお勧めしますDim lines As new generic.list(of PowerPacks.LineShape)

そうすれば、心配する必要はありませんReDim Preserve(ループで実行すると遅くなる可能性があります)。必要に応じて、項目を任意のインデックスに簡単に挿入できます。

于 2014-05-07T13:36:06.530 に答える
0

Option Strict Onエラーやさらに悪いことに予期しない動作を引き起こす可能性のある型間の暗黙的な変換を避けるために、プロジェクトでを使用する必要があります。

一方、必要がTextBoxない限り、数値を格納する必要はありません。NumericUpDownたとえば、を使用します。MSDN ドキュメントを見てください。

そして今、配列については、Listを使用することをお勧めします。これには、要素を処理するために必要なすべてのメソッドが実装されており、.ToArray()必要に応じて配列を提供するメソッドがあります。

次のようなことを試してください:

Dim it As Integer = 0
Dim lines As New List(Of PowerPacks.LineShape)()

Sub iter_TextChanged(sender As Object, e As EventArgs) Handles iter.TextChanged
    Dim iTxt As Integer

    Try 
        iTxt = Integer.Parse(iter.Text)

        If it > iTxt AndAlso iTxt <> 0 Then

        End If

    Catch ex As Exception
        MessageBox.Show(ex.Message)
    End Try

End Sub

私はあなたに例を書くつもりでしたが、あなたが何をしようとしているのか正確にはわからないことに気付きました. 説明していただけますか?

于 2014-05-07T14:10:15.477 に答える