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

解決


Pooh  2010-12-28 20:50:37  No: 147278

グラフの描画をしていますが、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-29 07:43:05  No: 147279

> 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


上岡勇人  2011-01-01 00:06:44  No: 147280

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

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


ろくでな〜し  2011-01-01 03:24:59  No: 147281

はいはいごくろうさん


ろくでな〜し  2011-01-01 03:29:32  No: 147282

管理人さん

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


Pooh  2011-01-05 17:59:05  No: 147283

魔界の仮面弁士  様

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

描画は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 20:51:37  No: 147284

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


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加