イベントハンドラーの追加について への返答
投稿で使用できる特殊コードの説明。(別タブで開きます。)
以下の返答は逆順(新しい順)に並んでいます。
投稿者 魔界の仮面弁士  (社会人)
投稿日時
2020/9/28 10:58:11
> Private Sub PictureBox1_Paint(sender As Object, e As PaintEventArgs) Handles PictureBox2.Paint
「PictureBox2 の Paint イベント」に対して
「PictureBox1_Paint」という名前を使うのは混乱の元なので、見直すべきかと思います。
引数定義さえ正しければ、イベント ハンドラーの名前は自由に付けられるので、
下記のように、一切関係のない名前にしても動作には影響ありませんが、
後で見た時に分かりにくいコードになってしまいますよね。
> この線を書くコードを TrackBar1.Scrollしたときに呼び出したいです。
TrackBar の「Scroll イベント」もしくは「ValueChanged イベント」内から
PictureBox1.Invalidate()
と書いてみてください。そうすればスクロール後に PictureBox1 の Paint イベントが発生します。
もちろん、
PictureBox2.Invalidate()
ならば、PictureBox2 の Paint イベントが発生します。
また、Scroll イベントと ValueChanged イベントの使い分け方ですが、
のように、プログラムから Value を変更した場合は、TrackBar の Scroll イベントが発生しません。
一方 ValueChanged であれば、プログラムから Value を変更した場合にもマウスやキーボードでスクロールした場合にも呼び出されるという違いがあります。
> '縦線
> Dim i As Integer = TrackBar1.Value
> Do While i < 600
座標指定のコードなので、i や ii という変数名の代わりに、
x や y という変数名を用いると、後から見た時に分かりやすいかと思います。
それと、このような処理では Do~Loop ではなく For~Next を使った方がスマートかと思います。
「PictureBox2 の Paint イベント」に対して
「PictureBox1_Paint」という名前を使うのは混乱の元なので、見直すべきかと思います。
引数定義さえ正しければ、イベント ハンドラーの名前は自由に付けられるので、
下記のように、一切関係のない名前にしても動作には影響ありませんが、
後で見た時に分かりにくいコードになってしまいますよね。
Private Sub イヨ(sender As Object, e As PaintEventArgs) Handles PictureBox1.Paint
End Sub
Private Sub TextBox1_Changed(sender As Object, e As PaintEventArgs) Handles PictureBox1.Paint
End Sub
> この線を書くコードを TrackBar1.Scrollしたときに呼び出したいです。
TrackBar の「Scroll イベント」もしくは「ValueChanged イベント」内から
PictureBox1.Invalidate()
と書いてみてください。そうすればスクロール後に PictureBox1 の Paint イベントが発生します。
もちろん、
PictureBox2.Invalidate()
ならば、PictureBox2 の Paint イベントが発生します。
また、Scroll イベントと ValueChanged イベントの使い分け方ですが、
Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
TrackBar1.Value += 10
End Sub
のように、プログラムから Value を変更した場合は、TrackBar の Scroll イベントが発生しません。
一方 ValueChanged であれば、プログラムから Value を変更した場合にもマウスやキーボードでスクロールした場合にも呼び出されるという違いがあります。
> '縦線
> Dim i As Integer = TrackBar1.Value
> Do While i < 600
座標指定のコードなので、i や ii という変数名の代わりに、
x や y という変数名を用いると、後から見た時に分かりやすいかと思います。
それと、このような処理では Do~Loop ではなく For~Next を使った方がスマートかと思います。
'縦線
For x = TrackBar1.Value To 600 - 1 Step 60
e.Graphics.DrawLine(Pens.Gray, x, 0, x, 400)
Next
'横線
For y = TrackBar1.Value To 399 Step 40
e.Graphics.DrawLine(Pens.Gray, 0, y, 600, y)
Next
投稿者 (削除されました)  ()
投稿日時
2020/9/28 10:50:22
(削除されました)
投稿者 (削除されました)  ()
投稿日時
2020/9/28 10:31:27
(削除されました)
投稿者 イヨ  (社会人)
投稿日時
2020/9/28 09:19:03
いつもお世話になっております
イベントハンドラーの追加について質問です。
Private Sub PictureBox1_Paint(sender As Object, e As PaintEventArgs) Handles PictureBox2.Paint
'縦線
Dim i As Integer = TrackBar1.Value
Do While i < 600
e.Graphics.DrawLine(Pens.Gray, i, 0, i, 400)
i = i + 60
Loop
'横線
Dim ii As Integer = TrackBar1.Value
Do While ii < 400
e.Graphics.DrawLine(Pens.Gray, 0, ii, 600, ii)
ii = ii + 40
Loop
End Sub
この線を書くコードを TrackBar1.Scrollしたときに呼び出したいです。
わたしは AddHandler TrackBar1.ValueChanged, AddressOf PictureBox1_Paint
と書いたらエラーがでてきてしまいました。
こういうときはどうしたらよいのでしょうか?
宜しくお願いいたします。
イベントハンドラーの追加について質問です。
Private Sub PictureBox1_Paint(sender As Object, e As PaintEventArgs) Handles PictureBox2.Paint
'縦線
Dim i As Integer = TrackBar1.Value
Do While i < 600
e.Graphics.DrawLine(Pens.Gray, i, 0, i, 400)
i = i + 60
Loop
'横線
Dim ii As Integer = TrackBar1.Value
Do While ii < 400
e.Graphics.DrawLine(Pens.Gray, 0, ii, 600, ii)
ii = ii + 40
Loop
End Sub
この線を書くコードを TrackBar1.Scrollしたときに呼び出したいです。
わたしは AddHandler TrackBar1.ValueChanged, AddressOf PictureBox1_Paint
と書いたらエラーがでてきてしまいました。
こういうときはどうしたらよいのでしょうか?
宜しくお願いいたします。
お世話になっております
ご返信ありがとうございます。
>「PictureBox2 の Paint イベント」に対して
>「PictureBox1_Paint」という名前を使うのは混乱の元なので、見直すべきかと思います。
今回私は初めてアプリを作っていて覚える事で手一杯でそこまで気が回らなかったです
言ってくれたので気づけました!
>TrackBar の「Scroll イベント」もしくは「ValueChanged イベント」内から
>PictureBox1.Invalidate()
>と書いてみてください。そうすればスクロール後に PictureBox1 の Paint イベントが発生します。
できました!ありがとうございます。
>また、Scroll イベントと ValueChanged イベントの使い分け方ですが、
これちょうど疑問に思っていたところです。実際動かしてみたら違いが判りました。
>座標指定のコードなので、i や ii という変数名の代わりに、
>x や y という変数名を用いると、後から見た時に分かりやすいかと思います。
たしかに....!自分の中でとりあえず変数はiとか使っとけばいいかなと思うところがありました。。
ほかの文もなおしてみます
>それと、このような処理では Do~Loop ではなく For~Next を使った方がスマートかと思います。
かっこいいです!
自分もかhこいい使い分けができるようにがんばります