Visual Basic 中学校 掲示板
投稿内容
タグのない投稿を抽出
統計
RSS
Visual Basic 中学校
>
投稿一覧
>
イベントハンドラーの追加について
Windowsフォーム
イベント
グラフィック
タグの編集...
投稿者
イヨ
 (社会人)   投稿日時
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こいい使い分けができるようにがんばります