コマンドをクリックするとTimerがスタートするようにさせるには?

解決


初心者E・K  2005-10-27 14:06:11  No: 126993  IP: [192.*.*.*]

早速質問なんですがコマンドをクリックするとAが実行されてその1秒後にBが実行されその1秒後にCが実行されそれを繰り返すことは可能でしょうか?
Timerを使えばうまくできそうな気がしたのですがうまくいきません。
どなたか分かる方いらっしゃれば教えてください。
↓こんな感じです。
Private Sub command1_click()

For
サブルーチンA
1秒後
サブルーチンB
1秒後
サブルーチンC
next

End Sub

編集 削除
特攻隊長まるるう  2005-10-27 14:24:02  No: 126994  IP: [192.*.*.*]

一番初歩的な方法はタイマー3個用意して順番に使うとか。

モジュールレベルの変数をカウンタとして用意して、
サブルーチンが終わるごとにカウントアップして、
そのカウントに応じて呼び出すサブルーチンを変えれば
タイマー1個で済むね。

サブルーチン間の1秒で何もしないなら Sleep 使って
みるとか。

編集 削除
初心者E・K  2005-10-27 14:41:48  No: 126995  IP: [192.*.*.*]

返信ありがとうございます。
カウントに応じて呼び出すサブルーチンを変えるにはif文などを使えばできるでしょうか?
あとタイマーの使い方なんですが、参考書読んでもよく分かりませんでした。
タイマー1個より3個のほうが簡単なんでしょうか?

編集 削除
特攻隊長まるるう  2005-10-27 15:07:32  No: 126996  IP: [192.*.*.*]

>カウントに応じて呼び出すサブルーチンを変えるにはif文などを使えばできるでしょうか?
そうですね。If 文でも Select 文でもできます。

>あとタイマーの使い方なんですが、参考書読んでもよく分かりませんでした。
参考書読む前にヘルプを読むようにして下さい。
Timer コントロールを Form に貼り付けたら、そのまま Timer
コントロールが選択されている状態で[F1]キーを押します。
タイマー(Timer)コントロールのヘルプに飛んだら[イベント]
と書かれたリンクをクリックします。Timerイベントのヘルプ
に飛んだら[使用例]のリンクをクリックすればサンプルが
載ってます。

>タイマー1個より3個のほうが簡単なんでしょうか?
作る人によるでしょう。
タイマー1がサブルーチンAを呼んでタイマー2起動
タイマー2がサブルーチンBを呼んでタイマー3起動
タイマー3がサブルーチンC
ってやれば頭を使わなくてもできてしまうって事です。
しかし、プログラムでは同じ様な処理はサブルーチンに
して使いまわす方が分かり易くなる事も多いですよね?
その程度なら頭を使った方が良いんじゃないでしょうか?

編集 削除
初心者E・K  2005-10-27 15:31:08  No: 126997  IP: [192.*.*.*]

分かりました。ヘルプ使うようにします。
何回もも質問で申し訳ないんですが、タイマー使って実行するとタイマーガすでに起動しているので、クリックする前にA、B、Cと呼ばれてしまうんですがどうすればいいでしょうか?

編集 削除
魔界の仮面弁士  2005-10-27 15:51:05  No: 126998  IP: [192.*.*.*]

> タイマーガすでに起動しているので、クリックする前にA、B、Cと呼ばれてしまうんですが
Enabled プロパティで、Timer を適宜オン/オフしてみてください。

編集 削除
特攻隊長まるるう  2005-10-27 15:58:25  No: 126999  IP: [192.*.*.*]

>タイマー使って実行するとタイマーガすでに起動しているので
ん?…ならタイマーを起動せずにボタンが押されてから起動したら?
魔界の仮面弁士さんの書かれた通り Enabled プロパティでの
制御も有効です。

ヘルプのサンプルをそのまま使ったのかな?
[VB6.0]
>Private Sub Form_Load ()
>   Timer1.Interval = 1000      ' 発生間隔を設定します。
>End Sub

Interval の文字をダブルクリックして選択状態にし[F1]キー押します。
Interval プロパティのヘルプを読みます。
>milliseconds の設定値は次のとおりです。
>0 (既定値) タイマー コントロールを使用できないようにします。
>1 〜 65,535  Timer イベントの 〜〜

'0 にすれば起動しないと書かれていました。
Private Sub Form_Load()
   Timer1.Interval = 0      ' 発生間隔を設定します。
End Sub

'1 秒後にイベントが起こります。
Private Sub Command1_Click()
   Timer1.Interval = 1000      ' 発生間隔を設定します。
End Sub

'イベントが起こったら止めましょう。
Private Sub Timer1_Timer()
    Timer1.Interval = 0
    Call サブルーチンA
End Sub

編集 削除
初心者E・K  2005-10-27 16:01:10  No: 127000  IP: [192.*.*.*]

Private Sub Command1_Click()
Timer1.Enabled = True

Private Sub Timer1_Timer()
Timer1.Enabled = False

でやりました。結果は実行したらタイマーは起動しなくて、コマンドをクリックするとタイマー起動しましたが一回だけ繰り返して二回、三回と続きませんでした。

編集 削除
特攻隊長まるるう  2005-10-27 16:04:20  No: 127001  IP: [192.*.*.*]

>一回だけ繰り返して二回、三回と続きませんでした。
サブルーチンの処理が終わったらまたタイマー起動するんでしょ???
Private Sub Timer1_Timer()
    Timer1.Enabled = False
    Call サブルーチンA
    Timer1.Enabled = True
End Sub

編集 削除
初心者E・K  2005-10-27 16:11:23  No: 127002  IP: [192.*.*.*]

特攻隊長まるるうさん、魔界の仮面弁士さん
いろいろ教えてくれて本当にありがとうございます。
お二人の方法でまずやってみます。
結果がでたらまた返信しますね。

編集 削除
結局  2005-10-27 17:51:18  No: 127003  IP: [192.*.*.*]

>分かりました。ヘルプ使うようにします。
全然分かってない様子

編集 削除
初心者E・K  2005-10-27 18:07:56  No: 127004  IP: [192.*.*.*]

特攻隊長まるるうさんの言うとおり
Private Sub Form_Load()
   Timer1.Interval = 0
End Sub

Private Sub Command1_Click()
   Timer1.Interval = 1000
End Sub
でクリックしてからタイマーが起動するようにできました。ありがとうございます。

そして、ifを使って1秒ごとにA、B、Cが呼び出されるようにやりました↓
Private Sub Timer1_Timer()

If Timer1.Interval = 1000 Then
Call サブルーチンA
End If

If Timer1.Interval = 2000 Then
Call サブルーチンB
End If

If Timer1.Interval = 3000 Then
Call サブルーチンC
End If

End Sub

結果はうまくいきませんでした。
やはりTimer1.Interval = ではまずいですよね?

編集 削除
Geo=TK3  2005-10-27 18:24:14  No: 127005  IP: [192.*.*.*]

どううまくいかなかったのか書いた方がよいですね。
コードから推測するに Timer イベントが発生する度に必ず
サブルーチンAが呼ばれてしまう感じを受けますが、「うまく
いかない」とはこの事ですか?

そうであれば、Timer コントロールの Interval プロパティの意味を
取り違えているようなので、再度 MSDN で確認してみてください。

編集 削除
初心者E・K  2005-10-27 18:33:38  No: 127006  IP: [192.*.*.*]

説明がいたらず申し訳ありませんでした。
Geo=TK3さんの言うとおり
上記のプログラムでやるとTimer イベントが発生する度にサブルーチンAが呼ばれてしまい、サブルーチンB、Cに続かないという事です。

それと2005/10/27(木) 15:31:08に返信した後にヘルプの確認したのですが、
MSDNのコレクションがありません、MSDNを再インストールしてください。となってヘルプが使えませんでした。

編集 削除
特攻隊長まるるう  2005-10-27 18:36:50  No: 127007  IP: [192.*.*.*]

>Timer コントロールの Interval プロパティの意味を
>取り違えているようなので
でしょうね。イベントの起こる間隔を指定するもので
時間と共に増えていくものでは無いですからね。
もう少し粘っても良いんですが、もう帰っちゃうので(汗)
1つの回答を載せておきます。
[Vb6.0]
Option Explicit
Private mSubFlag As Integer 'モジュールレベル変数
Private Sub Form_Load()
    mSubFlag = 0
    Timer1.Interval = 0
End Sub
Private Sub Command1_Click()
    mSubFlag = 1
    Timer1.Interval = 1000
End Sub
Private Sub Timer1_Timer()
    Timer1.Interval = 0
    Select Case mSubFlag
        Case 1
            Call サブルーチンA
            mSubFlag = 2
        Case 2
            Call サブルーチンB
            mSubFlag = 3
        Case 3
            Call サブルーチンC
            mSubFlag = 0
        Case Else
            Exit Sub 'タイマー起動しないまま抜ける
    End Select
    Timer1.Interval = 1000 'ここでタイマーが改めて起動。0から1000msまで数え始めます
End Sub
Private Sub サブルーチンA()
    MsgBox "サブルーチンA" 'この時タイマーは止まってます
    'OKボタンを押さないでずーっと居たら次の処理は実行されません
End Sub
Private Sub サブルーチンB()
    MsgBox "サブルーチンB"
End Sub
Private Sub サブルーチンC()
    MsgBox "サブルーチンC"
End Sub

編集 削除
特攻隊長まるるう  2005-10-27 18:42:13  No: 127008  IP: [192.*.*.*]

If 文で実現するなら
[やさしい Visual Basic 講座]
http://www.g.dendai.ac.jp/lecture/vbasic/vb11.html
ElseIf とか使ってみて下さい。

編集 削除
初心者E・K  2005-10-27 18:49:17  No: 127009  IP: [192.*.*.*]

特攻隊長まるるうさん、何から何まで教えてくださり、本当にありがとうございます。特攻隊長まるるうさんのプログラム参考にさせていただきます。
そして、やさしい Visual Basic 講座でもっと勉強してきます。

編集 削除
通ってみた  2005-10-28 00:05:45  No: 127010  IP: [192.*.*.*]

変数aを全体宣言しておき、Interval=1000のTimerにて・・・

a = a + 1

If a = 1 Then
    Call 1つめのサブルーチン
End If

If a = 2 Then
    Call 2つめのサブルーチン
End If

If a = 3 Then
    Call 3つめのサブルーチン
End If

簡単に書くならこんなかんじでいいのでは?

編集 削除
初心者E・K  2005-10-28 13:18:12  No: 127011  IP: [192.*.*.*]

特攻隊長まるるうさんの回答例で解決することができました。
本当にありがとうございました。
あと通ってみたさんのいうようにif文でもできるように頑張ります。
その他にも教えてくださった皆さんありがとうございました。

編集 削除