1

さて、基本的に、クラスの関数内で配列値を割り当てています。しかし、クラスが実行された後、配列は何もリセットされません。これが私のコードです:

Public Class MoisacDialog
Public imgArray(,) As Bitmap

Private Sub cmdCancel_Click(sender As Object, e As EventArgs) Handles cmdCancel.Click
    DialogResult = DialogResult.Cancel
End Sub

Private Sub cmdOK_Click(sender As Object, e As EventArgs) Handles cmdOK.Click
    Try
        Dim rows As Integer = Convert.ToInt32(txtRows.Text)
        Dim cols As Integer = Convert.ToInt32(txtCols.Text)
        If rows > 0 And cols > 0 Then
            ReDim imgArray(rows - 1, cols - 1)
            For i As Integer = 0 To cols - 1
                For j As Integer = 0 To rows - 1
                    Using fileImage As New OpenFileDialog
                        If fileImage.ShowDialog() = DialogResult.OK Then
                            imgArray(i, j) = CType(Bitmap.FromFile(fileImage.FileName), Bitmap)
                        End If
                    End Using
                Next
            Next
            DialogResult = DialogResult.OK
        Else
            MessageBox.Show("Rows/columns entered are out of range.", "Error", MessageBoxButtons.OK, MessageBoxIcon.Exclamation)
        End If
    Catch ex As FormatException
        MessageBox.Show("Invalid rows/columns entered.", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error)
    End Try
End Sub
End Class

実行後cmdOK_Click、配列全体はimgArray何もリセットされません。呼び出しフォームでこのように使用すると:

Using sizeDialog As New MoisacDialog
    If MoisacDialog.ShowDialog() = DialogResult.OK Then
        Dim ImageArray(,) As Bitmap = sizeDialog.imgArray
        _img = ImProc.PixelEffects.Moisac(ImageArray)
        picImage.Image = CType(_img, Image)
    End If
End Using

デバッグ ビューを使用し、3 行目以降にImageArray設定されてNothingいますが、 の最後までまだ存在していcmdOK_Clickます。

更新: 2 番目のスニペットの 4 行目を に変更しました_img = ImageArray(0,0)。問題は解決NullReferenceExceptionせず、2 番目のスニペットを囲むコードで a がスローされ、処理されます。

4

1 に答える 1

2

リセットではなく、そもそも設定されていません。

Using sizeDialog As New MoisacDialog
    If MoisacDialog.ShowDialog() = DialogResult.OK Then
        Dim ImageArray(,) As Bitmap = sizeDialog.imgArray

無差別に使用sizeDialogしていることに注意してください。をオブジェクトとして使用すると、同じ名前のクラスのデフォルト インスタンスになります。残念なことに、コンパイル時にここで明らかなエラーをキャッチする代わりに、VB がこれを許可しています。MoisacDialogMoisacDialog

エラーを修正するには、単に使用しますsizeDialog.ShowDialog()

于 2012-11-04T12:01:25.343 に答える