TextBox_TextChangeでオブジェクトのNothingを避けるには

解決


Pooh  2010-12-28 11:50:37  No: 147278  IP: [192.*.*.*]

グラフの描画をしていますが、TextBoxを使って最大値の変更で描画レベルを変えるプログラムを作成しています。
TextBox1_TextChangedで変更されたかを入手していますが、プログラムを開始すると「オブジェクト変数  または  withブロック変数が設定されていません」
と出てきます。
Private Sub TextBox1_TextChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles TextBox1.TextChanged
    ScaleMax = Val(TextBox1.Text)

    Try
        Call DrawRoutine(g)
    Catch ex As Exception
        MsgBox("Error" & vbCrLf & ex.Message)
    End Try
End Sub
gはグラフィックオブジェクトで、FormLoad時にオブジェクトを作成していますが、プログラムをランするとフォームロードを通らずに上記プログラムを通り、g = Nothingとなってしまいます。
解決法を宜しくお願いいたします。

編集 削除
魔界の仮面弁士  2010-12-28 22:43:05  No: 147279  IP: [192.*.*.*]

> gはグラフィックオブジェクトで、
「g」というのは、
「g」の事でしょうか?

> FormLoad時にオブジェクトを作成していますが
どのようにして Graphics を得ていますか?
Bitmap インスタンスに対する Graphics.FromImage でしょうか。
それとも CreateGraphics でしょうか。

描画先が Form だとすれば、
  Sub TextBox1_TextChanegd(…
    ScaleMax = Val(TextBox1.Text)
    Me.Invalidate()
  End Sub
  Sub Form1_Paint(…
    Call DrawRoutine(e.Graphics)
  End Sub
のようにすべきかと思います。

もし、CreateGraphics を使っているのだしたら、その方法は使わないでください。
下記の「解説」にもあるように、イベントをまたいで利用することはできません。
http://msdn.microsoft.com/ja-jp/library/system.windows.forms.control.creategraphics.aspx

編集 削除
上岡勇人  2010-12-31 15:06:44  No: 147280  IP: [192.*.*.*]

If文を使うとか、山ほどアイデアはあるんじゃないの?
exitを使用するとかさ。

VB極意の本を推奨します。

編集 削除
ろくでな〜し  2010-12-31 18:24:59  No: 147281  IP: [192.*.*.*]

はいはいごくろうさん

編集 削除
ろくでな〜し  2010-12-31 18:29:32  No: 147282  IP: [192.*.*.*]

管理人さん

おかしなレスは削除しましょうよ

編集 削除
Pooh  2011-01-05 08:59:05  No: 147283  IP: [192.*.*.*]

魔界の仮面弁士  様

ご意見ありがとうございます。
暫らくぶりに、窓の世界に戻ってまいりました。

描画はPictureBoxに対して行なっており、フォームロード時に下記のように描画オブジェクトを入手していますが、このルーチンを通る前に  Sub TextBox1_TextChanegd(…  に突入しています。

IF文などで処理は出来ると思いますが、なぜフォームロードより先になることが不思議で投稿いたしました。

Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load

    PictureBox1.Image = New Bitmap(PictureBox1.Width, PictureBox1.Height)

    ' Graphicsオブジェクトの作成
    g = Graphics.FromImage(PictureBox1.Image)

    Call DrawRoutine(g)

    g.Dispose()

End Sub

編集 削除
魔界の仮面弁士  2011-01-05 11:51:37  No: 147284  IP: [192.*.*.*]

> なぜフォームロードより先になることが不思議で投稿いたしました。
その前にコンストラクタが実行される事になります。通常は、
Visual Studio デザイナによって自動生成された InitializeComponent が
実行されますので、その点も考慮しておいてください。

編集 削除