■ 現在のこのページの役立ち度:
表示されない場合こちらのリンクからもご覧になれます。
■ このページの役立ち度を評価する:
役立ち度を評価してください。
(1(左):あまり役立たない - 5(右):大変役立った):
■ ページの共有:
[ サイト内検索 ]
カスタム検索
#16342-0Do Loopの条件が実行されませんはち2000-11-16(木) 22:05
     #16345-0RE#16342:Do Loopの条件が実行されませんゆう(U)2000-11-16(木) 23:13
     #16346-0RE#16342:Do Loopの条件が実行されませんよねKEN2000-11-16(木) 23:36
     #16348-0RE#16346:Do Loopの条件が実行されませんはち2000-11-17(金) 00:45
#16342-0
Do Loopの条件が実行されません
Private Sub sai_Click(Index As Integer)
Timer1 = True
Timer2 = True
End Sub

Private Sub Timer1_Timer()
Timer2 = False
End Sub

Private Sub Timer2_Timer()
Do Until Timer2 = False
For a = 0 To 6
sai(7).Picture = sai(a).Picture
If sai(7).Picture = sai(a).Picture Then
sai(7).Picture = sai(a).Picture
End If
Next
Loop

と書いて実行をすると、延々とPictureが表示されつづけ
プログラムを強制終了するしか止める事が出来なくなります。
どうもTimer1が働いていないようなのですが、
原因のわかる方、助言をいただけないでしょうか?
(ちなみにTimer1のIntervalは10000です)
#16345-0
RE#16342:Do Loopの条件が実行されません
> Private Sub Timer2_Timer()
> Do Until Timer2 = False
> For a = 0 To 6
> sai(7).Picture = sai(a).Picture
> If sai(7).Picture = sai(a).Picture Then
> sai(7).Picture = sai(a).Picture
> End If
> Next
> Loop
インデントってご存知ですか?
コードは読みやすさも考えて書く方が良いです
※特に他人に提示する場合は・・・

> どうもTimer1が働いていないようなのですが、
> 原因のわかる方、助言をいただけないでしょうか?
> (ちなみにTimer1のIntervalは10000です)
Timer1が割り込む余裕が無いためです。

割り込み不可のループになっているため、Timer2のイベントから
抜け出せない状態になっています。
※ヘルプ参照「DoEvents 関数・・・」
 「DoEvents」には弊害もありますのでご注意を・・・

Timer2のインターバルがどの様な値かわかりませんが・・・
Timer2のイベントでは、Do Loopは使用せずに、Timerイベントを
繰り返させることで、Do Loopの代わりにした方が良いのでは・・・

その場合も、Timer1のインターバルを短くし10000ミリ秒を
経過しているかを確認するようにしないと、タイミング良(悪)く
Timer1のイベント発生時に、Timer2のイベントが既に実行中の
場合、さらに10000ミリ秒後に後回しにされてしまいます。
※結果「いつまでたっても終わらない」って事も考えられます
#16346-0
RE#16342:Do Loopの条件が実行されません
> Private Sub sai_Click(Index As Integer)
> Timer1 = True
> Timer2 = True
> End Sub
個人的意見ですが、既定のプロパティは省略しないようにした方がいいと思います。
Timer1.Enabled = True
の方がこの一文だけで何をしているかはっきりわかりますから。

> Private Sub Timer1_Timer()
> Timer2 = False
> End Sub
> 
> Private Sub Timer2_Timer()
> Do Until Timer2 = False
> For a = 0 To 6
> sai(7).Picture = sai(a).Picture
> If sai(7).Picture = sai(a).Picture Then
> sai(7).Picture = sai(a).Picture
> End If
> Next
> Loop
Timerコントロールをせっかく使っているのに、
その中でプロシージャ外に起因するデータの変化を条件にしてしまうループを
作ると当然、無限ループにはまります。
Do〜Loopの間にDoEventsを入れればとりあえずは希望通りの動きになると思いますが、
その前にこのDo〜Loopはあんまり意味ないと思いますのでとっぱらっちゃいましょう。

要はTimer2を10秒後に終了させたいだけだと思うので、(関数名からしてさいころのアニメーションですね)
以下のような感じで十分でしょう。これだとタイマーコントロールは一個でできます。

Private start_time As Date ' フォームレベルの変数

Private Sub Form_Load()
   start_time = Now     ' 現在時刻をえる
   Timer2.Enabled = True
End Sub

Private Sub Timer2_Timer()
   For a = 0 To 6
      sai(7).Picture = sai(a).Picture
      If sai(7).Picture = sai(a).Picture Then
         sai(7).Picture = sai(a).Picture
      End If
   Next

   If DateDiff("s", start_time, Now) >= 10 Then ' 10秒たったら、Timer2を使用不可にする
       Timer2.Enabled = False
   End If

End Sub

DateDiff関数を調べてみて下さい。

以下は、本題とは関係ありませんが・・・・

> と書いて実行をすると、延々とPictureが表示されつづけ
後、上のsai(7).Picture = sai(a).Pictureからの3行って、
結局ずっとsai(7)にsai(a)を代入しているだけなので、
if〜End ifは意味ないと思いますが(^^;

また、もし結果がランダムに出て欲しいなら、
このままでは必ずsai(6)がでて不都合だと思います。

> プログラムを強制終了するしか止める事が出来なくなります。
Ctrl+Pause(Break)で無限ループにはまっても中断できます。

変数aが宣言されていないようですけど、変数はきちんと宣言するようにした方がいいですよ。
#16348-0
RE#16346:Do Loopの条件が実行されません
ゆう(U)さん、よねKENさん
すばやいレス&多くのアドバイスありがとうございます。
まだ知らない用語が多く、理解するのに時間がかかりそうですが、
お二人の意見を参考にがんばってみたいと思います。

インデントの件は、大変読みにくい文章を見て頂き
恐縮です。以後気をつけます。
このページと関連する記事:
#13181-0時計が遅れてくる。2000-12-05(火) 09:14
#838-0一秒ごとにラインが伸びるプログラム1999-08-16(月) 17:45
#199-2Sleepについて2001-10-18(木) 13:16
#17890-0Timerを使ったTime表示2001-09-19(水) 15:50
#17170-0時間置きにデータを取りこむ2001-08-07(火) 09:53
#14940-0日付をまたいだTimer関数の使用2001-03-08(木) 14:42
#16560-0指定した時間までの経過時間を出す方法2001-06-08(金) 13:59
#11114-0Do..Loopステートメント中のイベントについて1999-12-07(火) 17:03
#39907-0Timerを確実に動かす2001-03-07(水) 00:23
#441-1タイマーコントロール以外の時間の取得方法2002-08-23(金) 23:34
お探しの情報は見つかりましたか?お困りの問題は解決しましたか?
サイト内検索, 似た記事検索で見つからなくてもあきらめずに掲示板で質問してみましょう。
VB初心者友の会があなたのお役に立てれば幸いです。また、本ページの投稿者の方々にこの場を借りて感謝致します。
本ページは過去ログを集めて自動構成しています。よろしければこのページに関するフィードバックをお願いします。
(※ 構成の誤り、広告等の不適切な記事、リンク切れ、読めないページの報告など)