早速質問なんですがコマンドをクリックするとAが実行されてその1秒後にBが実行されその1秒後にCが実行されそれを繰り返すことは可能でしょうか?
Timerを使えばうまくできそうな気がしたのですがうまくいきません。
どなたか分かる方いらっしゃれば教えてください。
↓こんな感じです。
Private Sub command1_click()
For
サブルーチンA
1秒後
サブルーチンB
1秒後
サブルーチンC
next
End Sub
一番初歩的な方法はタイマー3個用意して順番に使うとか。
モジュールレベルの変数をカウンタとして用意して、
サブルーチンが終わるごとにカウントアップして、
そのカウントに応じて呼び出すサブルーチンを変えれば
タイマー1個で済むね。
サブルーチン間の1秒で何もしないなら Sleep 使って
みるとか。
返信ありがとうございます。
カウントに応じて呼び出すサブルーチンを変えるにはif文などを使えばできるでしょうか?
あとタイマーの使い方なんですが、参考書読んでもよく分かりませんでした。
タイマー1個より3個のほうが簡単なんでしょうか?
>カウントに応じて呼び出すサブルーチンを変えるにはif文などを使えばできるでしょうか?
そうですね。If 文でも Select 文でもできます。
>あとタイマーの使い方なんですが、参考書読んでもよく分かりませんでした。
参考書読む前にヘルプを読むようにして下さい。
Timer コントロールを Form に貼り付けたら、そのまま Timer
コントロールが選択されている状態で[F1]キーを押します。
タイマー(Timer)コントロールのヘルプに飛んだら[イベント]
と書かれたリンクをクリックします。Timerイベントのヘルプ
に飛んだら[使用例]のリンクをクリックすればサンプルが
載ってます。
>タイマー1個より3個のほうが簡単なんでしょうか?
作る人によるでしょう。
タイマー1がサブルーチンAを呼んでタイマー2起動
タイマー2がサブルーチンBを呼んでタイマー3起動
タイマー3がサブルーチンC
ってやれば頭を使わなくてもできてしまうって事です。
しかし、プログラムでは同じ様な処理はサブルーチンに
して使いまわす方が分かり易くなる事も多いですよね?
その程度なら頭を使った方が良いんじゃないでしょうか?
分かりました。ヘルプ使うようにします。
何回もも質問で申し訳ないんですが、タイマー使って実行するとタイマーガすでに起動しているので、クリックする前にA、B、Cと呼ばれてしまうんですがどうすればいいでしょうか?
> タイマーガすでに起動しているので、クリックする前にA、B、Cと呼ばれてしまうんですが
Enabled プロパティで、Timer を適宜オン/オフしてみてください。
>タイマー使って実行するとタイマーガすでに起動しているので
ん?…ならタイマーを起動せずにボタンが押されてから起動したら?
魔界の仮面弁士さんの書かれた通り 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
Private Sub Command1_Click()
Timer1.Enabled = True
Private Sub Timer1_Timer()
Timer1.Enabled = False
でやりました。結果は実行したらタイマーは起動しなくて、コマンドをクリックするとタイマー起動しましたが一回だけ繰り返して二回、三回と続きませんでした。
>一回だけ繰り返して二回、三回と続きませんでした。
サブルーチンの処理が終わったらまたタイマー起動するんでしょ???
Private Sub Timer1_Timer()
Timer1.Enabled = False
Call サブルーチンA
Timer1.Enabled = True
End Sub
特攻隊長まるるうさん、魔界の仮面弁士さん
いろいろ教えてくれて本当にありがとうございます。
お二人の方法でまずやってみます。
結果がでたらまた返信しますね。
>分かりました。ヘルプ使うようにします。
全然分かってない様子
特攻隊長まるるうさんの言うとおり
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 = ではまずいですよね?
どううまくいかなかったのか書いた方がよいですね。
コードから推測するに Timer イベントが発生する度に必ず
サブルーチンAが呼ばれてしまう感じを受けますが、「うまく
いかない」とはこの事ですか?
そうであれば、Timer コントロールの Interval プロパティの意味を
取り違えているようなので、再度 MSDN で確認してみてください。
説明がいたらず申し訳ありませんでした。
Geo=TK3さんの言うとおり
上記のプログラムでやるとTimer イベントが発生する度にサブルーチンAが呼ばれてしまい、サブルーチンB、Cに続かないという事です。
それと2005/10/27(木) 15:31:08に返信した後にヘルプの確認したのですが、
MSDNのコレクションがありません、MSDNを再インストールしてください。となってヘルプが使えませんでした。
>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
If 文で実現するなら
[やさしい Visual Basic 講座]
http://www.g.dendai.ac.jp/lecture/vbasic/vb11.html
ElseIf とか使ってみて下さい。
特攻隊長まるるうさん、何から何まで教えてくださり、本当にありがとうございます。特攻隊長まるるうさんのプログラム参考にさせていただきます。
そして、やさしい Visual Basic 講座でもっと勉強してきます。
変数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
簡単に書くならこんなかんじでいいのでは?
特攻隊長まるるうさんの回答例で解決することができました。
本当にありがとうございました。
あと通ってみたさんのいうようにif文でもできるように頑張ります。
その他にも教えてくださった皆さんありがとうございました。