イベントハンドラーの追加について

タグの編集
投稿者 イヨ  (社会人) 投稿日時 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
と書いたらエラーがでてきてしまいました。

こういうときはどうしたらよいのでしょうか?
宜しくお願いいたします。

投稿者 (削除されました)  () 投稿日時 2020/9/28 10:31:27
(削除されました)
投稿者 (削除されました)  () 投稿日時 2020/9/28 10:50:22
(削除されました)
投稿者 魔界の仮面弁士  (社会人) 投稿日時 2020/9/28 10:58:11
> Private Sub PictureBox1_Paint(sender As Object, e As PaintEventArgs) Handles PictureBox2.Paint

「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/30 08:54:11
魔界の仮面弁士様
お世話になっております
ご返信ありがとうございます。

>「PictureBox2 の Paint イベント」に対して
>「PictureBox1_Paint」という名前を使うのは混乱の元なので、見直すべきかと思います。
今回私は初めてアプリを作っていて覚える事で手一杯でそこまで気が回らなかったです
言ってくれたので気づけました!


>TrackBar の「Scroll イベント」もしくは「ValueChanged イベント」内から
>PictureBox1.Invalidate()
>と書いてみてください。そうすればスクロール後に PictureBox1 の Paint イベントが発生します。

できました!ありがとうございます。

>また、Scroll イベントと ValueChanged イベントの使い分け方ですが、
これちょうど疑問に思っていたところです。実際動かしてみたら違いが判りました。

>座標指定のコードなので、i や ii という変数名の代わりに、
>x や y という変数名を用いると、後から見た時に分かりやすいかと思います。
たしかに....!自分の中でとりあえず変数はiとか使っとけばいいかなと思うところがありました。。
ほかの文もなおしてみます

>それと、このような処理では Do~Loop ではなく For~Next を使った方がスマートかと思います。
かっこいいです!
自分もかhこいい使い分けができるようにがんばります