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イベントが実行されることは、確認しております。
すみません。また、バージョンを書くのを忘れました。
VB6.0 です。
よろしくお願いします。
文法エラー(はマズないと思うが)やコンパイルエラーは起こっていないのか?
それならイベントはちゃんと発生されていると思うのだが?
とりあえず、再現可能なコードが( ゜д゜)ホスィ…
MethodAとIsLoginイベントが宣言されているモジュールは何なんでしょう?
フォームモジュールとかじゃないですよね。
こんな感じで。
●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
今回の問題のポイントは2つあって、
(1)イベントを発生できるのはクラスモジュールだけ
(2)クラスモジュール内でタイマーを使う際に、New Timer でインスタンス
作成が出来ない(コンパイルエラーになる)ので、インスタンスを他の
場所で生成して使う必要がある
ということで、クラスモジュールで使うタイマーはFormに張り付いた物を借りています。
> (1)イベントを発生できるのはクラスモジュールだけ
これ間違いです。
フォームとドキュメントでももRaiseEventは出来るんですね、失礼。