クラスでイベントを作ってフォームで発生させるには

解決


わからん  2008-12-15 22:10:21  No: 141087

こんにちは
やっと  クラスの意味がわかってきたものですが
クラスの処理をさせた結果で  イベントを発生させたいのですが
やり方がなんだかわかりません
クラス設定して
フォームでクラス作って
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


わからん  2008-12-15 22:11:40  No: 141088

すいません
使っている環境は
OS XP home sp3
Microsoft Visual Basic 2008 Express Edition
です


魔界の仮面弁士  2008-12-16 01:10:08  No: 141089

標準的な「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。


わからん  2008-12-16 19:01:08  No: 141090

パーフェクト!!!!!!!
感動しました
ありがとうございます
完璧に動きました

ByVal sender As Object, ByVal e As EventArgs
の  sender  とか  e  は  何なんでしょうか
ちょくちょく見かけるのですが
できれば  簡単な例があると  うれしいのですが・・・


魔界の仮面弁士  2008-12-16 19:29:44  No: 141091

…あれ? それについては、先の回答で、
> 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 などが
用意されています。


わからん  2008-12-19 22:18:52  No: 141092

ありがとうございました

面白い使い方ができるのには  感心しましたが、
それをどう使うかは  これからのようです

今後ともよろしくお願いします


ふしぎだ  2008-12-19 23:33:20  No: 141093

>…あれ? それについては、先の回答で、
>> sender はイベント発生元、e はイベントの内容です
>と回答したと思うのですけれども…。

に対する謝罪の表明がないね。
どういうつもりだろ?


わからん  2008-12-20 18:57:59  No: 141094

すいません


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加