1

これは私のコードです:

Public Class Form1
  Public TheImage As Image = PictureBox1.BackgroundImage
  Public Function AppendBorder(ByVal original As Image, ByVal borderWidth As Integer) As Image
    Dim borderColor As Color = Color.Red
    Dim mypen As New Pen(borderColor, borderWidth * 2)
    Dim newSize As Size = New Size(original.Width + borderWidth * 2, original.Height + borderWidth * 2)
    Dim img As Bitmap = New Bitmap(newSize.Width, newSize.Height)
    Dim g As Graphics = Graphics.FromImage(img)

    ' g.Clear(borderColor)
    g.DrawImage(original, New Point(borderWidth, borderWidth))
    g.DrawRectangle(mypen, 0, 0, newSize.Width, newSize.Height)
    g.Dispose()
    Return img
  End Function

  Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
    Dim OutputImage As Image = AppendBorder(TheImage, 2)
    PictureBox1.BackgroundImage = OutputImage
  End Sub
End Class

PictureBox1デザイナーで追加した実際の背景画像が の中にあります。しかし、デバッグすると、次のエラー メッセージが表示されます。

InvalidOperationException が処理されませんでした

私は何を間違っていますか?

4

2 に答える 2

1
 Public TheImage As Image = PictureBox1.BackgroundImage

それはうまくいきません。このステートメントの実行時には、PictureBox1にはまだ値がありません。これは、InitializeComponent()メソッドが実行されるまで発生しません。あなたはおそらくまだそれについて聞いたことがないでしょう、魔法の呪文はあなたが「PublicSubNew」とタイプすることです。Enterキーを押すと、次のように表示されます。

Public Sub New()

    ' This call is required by the Windows Form Designer.
    InitializeComponent()

    ' Add any initialization after the InitializeComponent() call.

End Sub

これがコンストラクターであり、.NETクラスの非常に重要な部分です。生成された「初期化を追加」コメントに注意してください。ここでTheImageを初期化します。このようにするには:

Public TheImage As Image

Public Sub New()
    InitializeComponent()
    TheImage = PictureBox1.BackgroundImage
End Sub

これがまだすべて不思議な場合は、本を読んで詳細を確認してください。

于 2012-12-13T01:27:48.403 に答える
1

コードのこの部分:

Public TheImage As Image = PictureBox1.BackgroundImage

が呼び出されるTheImage前に初期化されるため、この時点ではまだ作成されていません。このピースをに移動すると、すべてが完全に機能しました。InitializeComponentPictureBox1Form_Load

Public TheImage As Image
'...
Private Sub Form1_Load(sender As Object, e As System.EventArgs) Handles Me.Load
  TheImage = PictureBox1.BackgroundImage
End Sub
于 2012-12-13T01:27:59.253 に答える