グラフの描画をしていますが、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となってしまいます。
解決法を宜しくお願いいたします。
> 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
If文を使うとか、山ほどアイデアはあるんじゃないの?
exitを使用するとかさ。
VB極意の本を推奨します。
はいはいごくろうさん
編集 削除管理人さん
おかしなレスは削除しましょうよ
魔界の仮面弁士 様
ご意見ありがとうございます。
暫らくぶりに、窓の世界に戻ってまいりました。
描画は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
> なぜフォームロードより先になることが不思議で投稿いたしました。
その前にコンストラクタが実行される事になります。通常は、
Visual Studio デザイナによって自動生成された InitializeComponent が
実行されますので、その点も考慮しておいてください。