タイマーのついたプログラムを中断するには?


素人志向  2004-01-22 15:06:35  No: 111546  IP: [192.*.*.*]

タイマー機能を使っているんですが、
このように

Private Sub cmd_Click()
    If Timer1.Enabled = True Then
        Timer1.Enabled = False
    End If
    ・
    ・
    ・
End Sub

コマンドボタンをクリックして、タイマー内の処理を中断しているんですが、
タイマー内のプログラムを最後まで終わらせてからコマンドボタン内の処理を
するにはどうしたらいいのでしょうか?

編集 削除
ぽち  2004-01-22 15:43:42  No: 111547  IP: [192.*.*.*]

Private Sub Command1_Click()
    処理C
End Sub
Private Sub Timer1_Timer()
    処理A
    DoEvents
    処理B
End Sub

こういうことですか?
例えば、処理Aを実行中にボタンを押した場合に
・処理A -> 処理C -> 処理B
の順番で処理がされているものを
・処理A -> 処理B -> 処理C
の順番で処理を行いたいと?

編集 削除
素人志向  2004-01-22 15:46:16  No: 111548  IP: [192.*.*.*]

ぽちさんレスありがとうございます。
そのとうりです。書き方がへたくそですみません。

編集 削除
ぽち  2004-01-22 17:18:13  No: 111549  IP: [192.*.*.*]

# 私的には、タイマーコントロールを良く使いますが、
# このような事で困ったことはありません。

Label1, Timer1, Command1 をフォーム上に配置し、
下のコードを貼り付けて実行してみて下さい。
ラベルのキャプションが変更されはじめたら(処理Aが動き始めたら)、
ボタンを押してみて下さい。

下のコードの場合、デバッグウィンドウに
処理A
処理C
処理B
と表示されると思います。

ABCの順にする一番簡単な方法は、
Timer イベント内に DoEvents を記述しないことです。
どうしても、 DoEvents を入れなければならない場合、
フラグを使用するなど、結構面倒くさくなってしまうと思います。

Option Explicit
Private Sub Command1_Click()
  Debug.Print "処理C"
End Sub
Private Sub Form_Load()
  Timer1.Interval = 1000
  Timer1.Enabled = True
End Sub
Private Sub Timer1_Timer()
  Dim i As Integer
  Debug.Print "処理A"
  For i = 0 To 8000
    Label1.Caption = "処理A   " & i
    Label1.Refresh
  Next i
  DoEvents
  Debug.Print "処理B"
  For i = 0 To 8000
    Label1.Caption = "処理B   " & i
    Label1.Refresh
  Next i
  Timer1.Enabled = False
End Sub

編集 削除