C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[3]: 複数Class間のイベントの捕捉について


(過去ログ 126 を表示中)

[トピック内 4 記事 (1 - 4 表示)]  << 0 >>

■74898 / inTopicNo.1)  複数Class間のイベントの捕捉について
  
□投稿者/ あい (1回)-(2015/02/07(Sat) 07:25:39)

分類:[VB.NET/VB2005 以降] 

開発環境:Windows 7
使用言語:Visual Studio 2013 (VB.NET)

初めての投稿です。

以下のように2つのClass間にてイベント発生を検知したいと考えています。
Form1からEvent1のDoEventを実行した場合はメッセージ"test"が表示されます。
ところが、Event1内でDoEventが実行された際はForm1でメッセージ"test"が表示されません。

Event1内からRaiseEventが実行された際にForm1にてイベントを捕捉するにはどうすれば良いのでしょうか?
なお、前提条件としてEvent1はForm1だけでなく他のClassからでも呼べるように設定したいと考えています。


プログラム初心者で説明が拙いですが、どなたかご教授願います。


Public Class Form1
    Dim WithEvents tEvent As New Event1
    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
        tEvent.DoEvent()
    End Sub
    Private Sub InstanceEvent(ByVal sender As Object, ByVal e As System.EventArgs) Handles tEvent.TestEvent
            MsgBox("test")
    End Sub
End Class

Public Class Event1
    Public Event TestEvent(ByVal sender As Object, ByVal e As EventArgs)
    Public Sub DoEvent()
        RaiseEvent TestEvent(Me, New EventArgs)
    End Sub
End Class

引用返信 編集キー/
■74899 / inTopicNo.2)  Re[1]: 複数Class間のイベントの捕捉について
□投稿者/ Azulean (433回)-(2015/02/07(Sat) 11:37:56)
2015/02/07(Sat) 11:38:52 編集(投稿者)

No74898 (あい さん) に返信
> Form1からEvent1のDoEventを実行した場合はメッセージ"test"が表示されます。
> ところが、Event1内でDoEventが実行された際はForm1でメッセージ"test"が表示されません。
>
> Event1内からRaiseEventが実行された際にForm1にてイベントを捕捉するにはどうすれば良いのでしょうか?
> なお、前提条件としてEvent1はForm1だけでなく他のClassからでも呼べるように設定したいと考えています。

他のクラスでも tEvent を As New Event1 として作っていませんか?

Event1 はクラスであり、そのクラスのインスタンスは複数作ることができます。
DoEvent メソッドや TestEvent イベントはインスタンスごとの存在なので、Form1 が知っているインスタンスと他のクラスが知っているインスタンスが異なるのであれば、連動することはありません。
同じインスタンスを共有できるようにすることが必要になります。


クラスやオブジェクト・インスタンスの概念を学んでいただいた方がよいのですが、どうしても今すぐこの場を切り抜けたいのであれば、Shared も手でしょうね。
ただし、Shared を多用すると後で痛い目を見ます。そのことは覚えておいてください。
http://www.atmarkit.co.jp/fdotnet/vb6tonet/vb6tonet10/vb6tonet10_02.html
引用返信 編集キー/
■74905 / inTopicNo.3)  Re[2]: 複数Class間のイベントの捕捉について
□投稿者/ あい (2回)-(2015/02/09(Mon) 00:07:52)
No74899 (Azulean さん) に返信

Azulean さん、ご回答ありがとうございます。

> クラスやオブジェクト・インスタンスの概念を学んでいただいた方がよいのですが、どうしても今すぐこの場を切り抜けたいのであれば、Shared も手でしょうね。
> ただし、Shared を多用すると後で痛い目を見ます。そのことは覚えておいてください。
> http://www.atmarkit.co.jp/fdotnet/vb6tonet/vb6tonet10/vb6tonet10_02.html
その場しのぎでの対応は取りたくありませんので、1から勉強します!

下記のような場合でButton2.click時にメッセージが発生しないのですが、不要な書き方をしていますでしょうか・・・?

Public Class Form1
Dim NEvent as New Event1
Dim WithEvents tEvent As New Event1
Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
NEvent.A()
End Sub
Private Sub Form1_FormClosing(ByVal sender As Object, ByVal e As System.Windows.Forms.FormClosingEventArgs) Handles Me.FormClosing
NEvent.B()
End Sub
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
tEvent.DoEvent()
End Sub
Private Sub InstanceEvent(ByVal sender As Object, ByVal e As System.EventArgs) Handles tEvent.TestEvent
MsgBox("test")
End Sub
End Class

Public Class Event1
Public Event TestEvent(ByVal sender As Object, ByVal e As EventArgs)
Public Sub DoEvent()
RaiseEvent TestEvent(Me, New EventArgs)
End Sub
Public Sub A()
AddHandler Button2.Click, AddressOf DoEvent
End Sub
Public Sub B()
'
End Sub
Public Sub C()
'
End Sub
End Class


> 2015/02/07(Sat) 11:38:52 編集(投稿者)
>
> ■No74898 (あい さん) に返信
>>Form1からEvent1のDoEventを実行した場合はメッセージ"test"が表示されます。
>>ところが、Event1内でDoEventが実行された際はForm1でメッセージ"test"が表示されません。
>>
>>Event1内からRaiseEventが実行された際にForm1にてイベントを捕捉するにはどうすれば良いのでしょうか?
>>なお、前提条件としてEvent1はForm1だけでなく他のClassからでも呼べるように設定したいと考えています。
>
> 他のクラスでも tEvent を As New Event1 として作っていませんか?
>
> Event1 はクラスであり、そのクラスのインスタンスは複数作ることができます。
> DoEvent メソッドや TestEvent イベントはインスタンスごとの存在なので、Form1 が知っているインスタンスと他のクラスが知っているインスタンスが異なるのであれば、連動することはありません。
> 同じインスタンスを共有できるようにすることが必要になります。
>
>
> クラスやオブジェクト・インスタンスの概念を学んでいただいた方がよいのですが、どうしても今すぐこの場を切り抜けたいのであれば、Shared も手でしょうね。
> ただし、Shared を多用すると後で痛い目を見ます。そのことは覚えておいてください。
> http://www.atmarkit.co.jp/fdotnet/vb6tonet/vb6tonet10/vb6tonet10_02.html
引用返信 編集キー/
■74906 / inTopicNo.4)  Re[3]: 複数Class間のイベントの捕捉について
□投稿者/ ななしん (1回)-(2015/02/09(Mon) 10:07:07)
ソースを見る限り、Button2を押した時は、NEventのTestEventが発生しています。
Form1では
Private Sub InstanceEvent(ByVal sender As Object, ByVal e As System.EventArgs) Handles tEvent.TestEvent
で、tEventのTestEventを受け取る宣言はしていますが、NEventのTestEventに関する記述がない為に、
処理が走りません。

Loadイベント等でNEvent.AではなくtEvent.A等tEventのみを操作するか、NEventのイベントを受け取るよう宣言するか
してください。

引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -