こんにちは
やっと クラスの意味がわかってきたものですが
クラスの処理をさせた結果で イベントを発生させたいのですが
やり方がなんだかわかりません
クラス設定して
フォームでクラス作って
test1()を呼び出して
フォームの
endtest()
を呼び出したいのですが・・
わかりません よろしくお願いします
クラス
Public Class test
Public Sub test1()
Dim i
For i = 1 To 1000
Next
RaiseEvent endtest()
End Sub
Public Event endtest As EventHandler
End Class
フォームを
Public Class Form1
Dim test0 As test
Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
test0 = New test
AddHandler test0.endtest, _
AddressOf endtest
test0.test1()
End Sub
Private Sub endtest()
Beep()
End Sub
End Class
すいません
使っている環境は
OS XP home sp3
Microsoft Visual Basic 2008 Express Edition
です
標準的な「EventHandler」タイプのイベントにしたいのであれば、
今のコード(クラス側とフォーム側の両方)に、若干の修正が必要です。
まず、クラス側ですが、
> Public Event endtest As EventHandler
これは
Public Event Sub endtest(ByVal sender As Object, ByVal e As EventArgs)
と同義になります。すなわち 2 つの引数が必要であり、この場合の RaiseEvent は
RaiseEvent endtest(Me, EventArgs.Empty)
という指定になります(sender はイベント発生元、e はイベントの内容です)。
そして、それを受けとるフォーム側では、
> Private Sub endtest()
ではなく、先の引数を追加した
Private Sub test0_endtest(ByVal sender As Object, ByVal e As EventArgs)
とします。ボタンの Click イベントなどと同じイベント引数ですね。
# フォーム側のプロシージャ名は、"endtest" でも "test0_endtest" でも
# それ以外の名前でも構いません。
なお、フォーム側の変数を
Private WithEvents test0 As test
とする手法もあります。この場合は AddHandler を使う代わりに
Private Sub test0_endtest(ByVal sender As Object, ByVal e As EventArgs) Handles test0.endtest
のようにして、Handles 句を利用することになります。
-----------
あるいは、フォーム側の定義を変更したくない(引数の無いイベントを作りたい)なら、
クラス側のイベント定義を
Public Event Sub endtest()
にしてやれば OK です。あるいは
Public Event endtest As MethodInvoker
でも OK。
パーフェクト!!!!!!!
感動しました
ありがとうございます
完璧に動きました
ByVal sender As Object, ByVal e As EventArgs
の sender とか e は 何なんでしょうか
ちょくちょく見かけるのですが
できれば 簡単な例があると うれしいのですが・・・
…あれ? それについては、先の回答で、
> sender はイベント発生元、e はイベントの内容です
と回答したと思うのですけれども…。
> 簡単な例があると
たとえば、Sub 〜 Handles Button1.Click, Button2.Click のように、
複数のボタンClickイベントをひとつに纏めていた場合に、
Dim B As Button = DirectCast(sender, Button)
のようにして、実際にどのボタンが押されたのかを取得できます。
そして e の方は、イベントの詳細情報が入っています。
(これは、EventArgs 型を継承したクラスです)
素の EventArgs (Load イベントや Click イベント等で使われます)では、
特に得るべき物はありませんが、イベントによっては追加のプロパティがあります。
たとえば FormClosing イベントの FormClosingEventArgs では、
e.CloseReason から、フォームの終了理由を得られますし、
e.Cancel に True をセットする事で、フォームの終了をキャンセルできます。
また、マウス系イベント(MouseDown 等)の MouseEventArgs の場合は、
マウスの座標を表す e.Location、押されたボタンを示す e.Button などが
用意されています。
ありがとうございました
面白い使い方ができるのには 感心しましたが、
それをどう使うかは これからのようです
今後ともよろしくお願いします
>…あれ? それについては、先の回答で、
>> sender はイベント発生元、e はイベントの内容です
>と回答したと思うのですけれども…。
に対する謝罪の表明がないね。
どういうつもりだろ?
すいません
編集 削除