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

解決


初心者E・K  2005-10-27 23:06:11  No: 126993

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

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

End Sub


特攻隊長まるるう  2005-10-27 23:24:02  No: 126994

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

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

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


初心者E・K  2005-10-27 23:41:48  No: 126995

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


特攻隊長まるるう  2005-10-28 00:07:32  No: 126996

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

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

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


初心者E・K  2005-10-28 00:31:08  No: 126997

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


魔界の仮面弁士  2005-10-28 00:51:05  No: 126998

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


特攻隊長まるるう  2005-10-28 00:58:25  No: 126999

>タイマー使って実行するとタイマーガすでに起動しているので
ん?…ならタイマーを起動せずにボタンが押されてから起動したら?
魔界の仮面弁士さんの書かれた通り 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-28 01:01:10  No: 127000

Private Sub Command1_Click()
Timer1.Enabled = True

Private Sub Timer1_Timer()
Timer1.Enabled = False

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


特攻隊長まるるう  2005-10-28 01:04:20  No: 127001

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


初心者E・K  2005-10-28 01:11:23  No: 127002

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


結局  2005-10-28 02:51:18  No: 127003

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


初心者E・K  2005-10-28 03:07:56  No: 127004

特攻隊長まるるうさんの言うとおり
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-28 03:24:14  No: 127005

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

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


初心者E・K  2005-10-28 03:33:38  No: 127006

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

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


特攻隊長まるるう  2005-10-28 03:36:50  No: 127007

>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-28 03:42:13  No: 127008

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


初心者E・K  2005-10-28 03:49:17  No: 127009

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


通ってみた  2005-10-28 09:05:45  No: 127010

変数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 22:18:12  No: 127011

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


※返信する前に利用規約をご確認ください。




  


  このエントリーをはてなブックマークに追加