タイマーイベントから定義したイベントが呼べない。


Ekasi  2005-01-20 17:00:12  No: 87927  IP: [192.*.*.*]

Timerイベントで
定義したイベントをRaiseEventによって発行しても
イベントが発生しないのですが、どなたか
イベントを発生させる方法をご存知ないでしょうか?

Public Sub MethodA 
    ' 仮想スレッドを始動する。
    Timer1.Interval = 1
    Timer1.Enabled = True
End Sub

Private Sub Timer1_Timer()
    ' リンク失敗イベントを発生させる。
    RaiseEvent IsLogin
    
    ' タイマーを止める。
    Timer1.Enabled = False
    
End Sub

ちなみにTimerイベントが実行されることは、確認しております。

編集 削除
Ekasi  2005-01-20 17:30:08  No: 87928  IP: [192.*.*.*]

すみません。また、バージョンを書くのを忘れました。

VB6.0 です。

よろしくお願いします。

編集 削除
ガッ  2005-01-20 17:51:16  No: 87929  IP: [192.*.*.*]

文法エラー(はマズないと思うが)やコンパイルエラーは起こっていないのか?
それならイベントはちゃんと発生されていると思うのだが?

とりあえず、再現可能なコードが(  ゜д゜)ホスィ…

編集 削除
abu  2005-01-20 18:25:17  No: 87930  IP: [192.*.*.*]

MethodAとIsLoginイベントが宣言されているモジュールは何なんでしょう?
フォームモジュールとかじゃないですよね。

編集 削除
ひろ  2005-01-20 21:17:36  No: 87931  IP: [192.*.*.*]

こんな感じで。
●Form1  タイマーコントロール Timer1 を貼り付けておく

Option Explicit
Private WithEvents cls1 As Class1
Private Sub cls1_ExecFinish()
    Debug.Print "finish"
End Sub

Private Sub Command1_Click()
    If cls1.startRequest(5) = 0 Then
        Debug.Print "start"
    Else
        Debug.Print "cancel"
    End If
End Sub

Private Sub Form_Load()
    Set cls1 = New Class1
    Call cls1.setTimer(Timer1)
End Sub

●Class1

Option Explicit

Private WithEvents myTimer As Timer
Private methodBusy As Boolean
Private execStatus As Integer
Private endTime As Date
Private TimerFlag As Boolean
Public Event ExecFinish()

'TimerがNew で生成できないのでフォームに張り付いた物を流用させてもらう
Public Sub setTimer(newTimer As Timer)
    Set myTimer = newTimer
End Sub

Public Function startRequest(ByVal waitSec As Double) As Integer
   
   If myTimer Is Nothing Then
       startRequest = -2    'タイマーが準備できていない
   ElseIf methodBusy Then
       startRequest = -1    '現在実行中
   Else
       methodBusy = True
       execStatus = 0
       endTime = DateAdd("s", waitSec, Now) '終了予定時間
       TimerFlag = False
       myTimer.Interval = 100
       myTimer.Enabled = True
       startRequest = 0
   End If
End Function

Private Sub Class_Initialize()
    methodBusy = False
    TimerFlag = False
    Set myTimer = Nothing
End Sub

Private Sub myTimer_Timer()
   If TimerFlag Then Exit Sub
   myTimer.Enabled = False
   TimerFlag = True
   Call TaskMain
   If methodBusy Then
       'まだやるべき事が残っているのでタイマーを再度有効にする。
       TimerFlag = False
       myTimer.Enabled = True
   Else
       '処理終了
       RaiseEvent ExecFinish
        'タイマーは止めたままにする
   End If
End Sub

Private Sub TaskMain()
    Debug.Print "taskMain"
    If methodBusy Then
        '指定時間を過ぎたら終了
        methodBusy = (Now < endTime)
    End If
End Sub

編集 削除
ひろ  2005-01-20 21:26:01  No: 87932  IP: [192.*.*.*]

今回の問題のポイントは2つあって、
(1)イベントを発生できるのはクラスモジュールだけ
(2)クラスモジュール内でタイマーを使う際に、New Timer でインスタンス
      作成が出来ない(コンパイルエラーになる)ので、インスタンスを他の
      場所で生成して使う必要がある

ということで、クラスモジュールで使うタイマーはFormに張り付いた物を借りています。

編集 削除
ひろ  2005-01-20 21:28:44  No: 87933  IP: [192.*.*.*]

> (1)イベントを発生できるのはクラスモジュールだけ
これ間違いです。
フォームとドキュメントでももRaiseEventは出来るんですね、失礼。

編集 削除