- - PR -
VB.NET によるイベント ハンドラのについて
1|2|3|4
次のページへ»
| 投稿者 | 投稿内容 | ||||||||
|---|---|---|---|---|---|---|---|---|---|
|
投稿日時: 2004-02-10 21:45
初めまして。
作成したクラスのEventをデリゲートして値を変更したいのですが イベント ハンドラの動きが上手くいきません。 ↓↓↓以下プログラミング↓↓↓ 注:タイマーは実装してあります Private Sub Form_Load TestTime.Interval = 1 TestTime.Enabled = True TestTime.Start() End Sub Private Sub Button1_Click() '作成したクラスにイベントを実装しました Dim clsTest As New clsSample 'RaiseEventでイベントを実装 AddHandler clsTest.evtEvent, AddressOf Sample1 'ここでclsTestクラスがnothingされます。 clsTest.Dispose() End Sub Private Sub Sample1() TestTime.Interval = 100 End Sub Private Sub Timer1_Tick() Debug.WriteLine("タイマーイベント発生して!") End Sub 動いていたTimer1_Tickが、このclsTest.Dispose()が終了した時点で 動かなくなってしまいます。 clsTestがDisposeで解放されてしまい、Sample1との繋がりが原因 と思われるのですが、回避方法は無いものでしょうか? 長文になりましたが、何卒ヨロシク御願いします。 | ||||||||
|
投稿日時: 2004-02-10 21:58
なっくさんが提示されたソースではタイマーオブジェクトとButton1_Click()内でnewしているclsSample型のインスタンスとの関係が読み取れません。
あるいは、実際関係がないのに何か勘違いをされているのかもしれませんが・・・。 ソースの必要ないと思われる部分を取り除いて書き込みされていますよね、おそらく。 取り除く部分を間違っていると思います。 | ||||||||
|
投稿日時: 2004-02-12 11:16
返信ありがとうございます。
>取り除く部分を間違っていると思います。 確かに上記だけでは正常に動いてしまいました。 申し訳ないです。問題はclsSampleにあるようです。 clsSampleでプロセス制御して実行終了時にSample1関数で タイマーを変更する処理です。 Sample1が実行されたあとTimer1_Tickが止まってしまうようです。 ちなみに、Sample1のTestTime.Interval = 100 をコメントアウトした状態では問題なくTimer1_Tickが動いています。 Button1_Clickで必要ない部分を削除しました。 ↓↓↓以下プログラミング↓↓↓ Private Sub Button1_Click() '作成したクラスにイベントを実装しました Dim clsTest As New clsSample 'RaiseEventでイベントを実装 AddHandler clsTest.evtEvent, AddressOf Sample1 clsTest.Action() End Sub Class clsSample Public Event evtEvent() Protected SampleProcess As New Process Public Sub Action() '起動するファイルを設定 SampleProcess.StartInfo.FileName = "C:Test.txt" '新しいプロセスを実行 SampleProcess.Start() End Sub Public Sub New() 'プロセス終了時にExitedイベントを発生させる SampleProcess.EnableRaisingEvents = True 'イベントハンドラの追加 AddHandler SampleProcess.Exited, AddressOf processExited End Sub 'process終了処理 Protected Sub processExited(ByVal sender As Object, _ ByVal e As EventArgs) '終了イベント発生 RaiseEvent evtEvent() End Sub End Class | ||||||||
|
投稿日時: 2004-02-12 11:51
ちょっと見ただけでは、結局なにをしたいのかが今ひとつ
ぴんときません(なんとなくは想像は付きますが。。) 今の実装方法が、あなたがやりたいことに適しているかどうか わかりませんし、もしかしたら他に方法があるかもしれません。 問題がないのならば、 ・今やりたいことはこれ ・で、とりあえずこのように実装してみようとした ・しかしだめだった という感じの情報を流したほうが、レスが付きやすいと思いますよ | ||||||||
|
投稿日時: 2004-02-12 13:12
まずは実際のコードから問題を再現する必要最小限のコードを取り出して その本物を提示された方がよいと思います。 このTimer1_Tickプロシージャは提示のコードを見る限りではどこからも呼ばれません。 イベントとしても発生しません。これは実際のコード(からの抜粋)じゃないですよね? Timer1_Tickプロシージャは見た感じはTimer1コントロールの Tickイベント用のイベントプロシージャを意図しているのだと思いますが、 引数にsenderやeもありませんし、Handlesもありません。 (AddHandlerでのイベントとの関連付けがあるわけでもありません) その後の「投稿日時: 2004-02-12 11:16」で投稿されている追加のコードを 見ても、元投稿のすべての不明点が解決していないので、やはり問題点がわかりません。 前のコードに対して、次の投稿で追加のコードを提示するのではなく、 問題を再現できる必要最小限のコードを1度で提示して下さい。 #Button1_ClickプロシージャもおそらくはsenderやeやHandlesを省略されているようですが、 #そういう中途半端な省略もやめましょう。 | ||||||||
|
投稿日時: 2004-02-12 13:17
返信ありがとうございます
すいません、確かに仰るとうりです。 最初から読んでると何をやりたいか書いてないですね^^; 纏めてみます。 ・今やりたいこと クラス内にて 1,ファイル実行 2,実行中に裏で処理をさせたい(ファイル実行中の間Loop処理) 3,実行終了報告をForm側に返したい。(同時に2で処理をさせた物を終了) (2はサンプルソースには書いてません) ・で、とりあえずこのように実装してみようとした クラスでプロセスを作成。 プロセス終了時にイベントを発生させる 発生させたイベントをForm側で受け取る ・しかしだめだった 何故か、動いていたタイマーイベントが止まってしまいました。
はい、下記ソースで現象は確認できました。 注:Form1にタイマーコントロール追加 名前 Timer1 ↓↓↓以下プログラミング↓↓↓ Public Class Form1 Inherits System.Windows.Forms.Form 'Windows フォーム デザイナで生成されたコード は省略 Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load With Timer1 .Interval = 1 .Enabled = True .Start() End With End Sub Private Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.Tick Debug.WriteLine("タイマーイベント発生中!") End Sub Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click '作成したクラスにイベントを実装しました Dim clsTest As New clsSample 'RaiseEventでイベントを実装 AddHandler clsTest.evtEvent, AddressOf Sample1 clsTest.Action() End Sub Private Sub Sample1() Timer1.Interval = 100 Debug.WriteLine("Sample1実行!!!!!ここでタイマーが止まる。") End Sub End Class Class clsSample Public Event evtEvent() Protected SampleProcess As New Process Public Sub Action() '起動するファイルを設定 SampleProcess.StartInfo.FileName = "C:Test.txt" '新しいプロセスを実行 SampleProcess.Start() End Sub Public Sub New() 'プロセス終了時にExitedイベントを発生させる SampleProcess.EnableRaisingEvents = True 'イベントハンドラの追加 AddHandler SampleProcess.Exited, AddressOf processExited End Sub 'process終了処理 Protected Sub processExited(ByVal sender As Object, _ ByVal e As EventArgs) '終了イベント発生 RaiseEvent evtEvent() End Sub End Class 回避方法、原因も分かる方いましたら 今後の勉強の為に教えていただきたいです。 長文になりましたが、何卒ヨロシクお願いします。 [ メッセージ編集済み 編集者: なっく 編集日時 2004-02-12 13:29 ] [ メッセージ編集済み 編集者: なっく 編集日時 2004-02-12 13:40 ] | ||||||||
|
投稿日時: 2004-02-12 14:19
問題が再現する/しないの前に、これってコンパイル通りました?私のところでは、VB.NETでは、メソッドの自動変数にイベントハンドラを追加できないのですが。。。イベントハンドラを追加しようとすると、クラス変数として、WidthEvents宣言をしないと追加できないのですが、それって私のやり方がまずい? | ||||||||
|
投稿日時: 2004-02-12 14:29
こんにちわ。
http://www.microsoft.com/japan/msdn/library/default.asp?url=/japan/msdn/library/ja/vblr7/html/vastmAddHandlerStatement.asp VB6ですと、WithEvents(WidthEventsではないですよw)宣言の方法しかありませんが、 .NETはいくつかやり方があるようですね。 [追加] おっと、こちらの方が参考になりますか。 http://www.microsoft.com/japan/msdn/library/default.asp?url=/japan/msdn/library/ja/vbcn7/html/vaconUnderstandingEventHandlers.asp [/追加] [ メッセージ編集済み 編集者: りばぁ 編集日時 2004-02-12 14:30 ] | ||||||||
1|2|3|4
次のページへ»
