• ベストアンサー

タイマーで動かすselect caseのタイミング

今、プログラムを勉強しているものです。 ボタンをクリックするとTimer1が指定したインターバルで動き始め、Timer_Tickにあるselect caseがループし始めるということをしています。 しかし、どうしてもタイマーを動かしてからselect caseに行くまでにインターバルが一回入ってしまうのです。これをどうにかタイマーが動いたときにすぐselect caseを動かすようにはならないのでしょうか?

質問者が選んだベストアンサー

  • ベストアンサー
  • osamuy
  • ベストアンサー率42% (1231/2878)
回答No.1

Timer_Tickの処理をサブルーチン化して、Timer_Tickはそれを呼び出すだけにしとく。 で、Timer.startする前に、サブルーチンを1回呼び出しとくとか。

全文を見る
すると、全ての回答が全文表示されます。

その他の回答 (1)

回答No.2

>しかし、どうしてもタイマーを動かしてからselect caseに行くまでに >インターバルが一回入ってしまうのです。 あの?。もう少し聞きたいんだ。 タイマーを動かしてからselect caseに行くまでにの意味なんだけど、 最初タイマーインタバルをセットして次にタイマーイネーブルをTRUEにして 起動する。そうするとタイマーが起動し、指定ミリ秒後にTimer_Tickが呼び出される。 Timer_Tickの中のステートメントが順番に実行され select case の所のステートメントに ステップが進んでいくまでにインターバルが一回入るってことは?。 Timer_Tickの中の先頭のステートメントからselect case の所のステートメントまでの 処理時間が長くって、もう一回インターバルが発生して、Timer_Tick が実行されるとの 意味でいいのですか?。 この考え方でいいの?。教えて。それによって回答が・・・・・。

kuroyume21
質問者

お礼

結果的にちゃんとできたのでご心配かけてすいませんでした。 質問を締め切るのを忘れてました。 わからなかった状況を説明しますと、 Private Sub Button1_Click・・・     Timer1.Enabled = True Timer1.Interval = 1000 Timer1.Start() end sub   Private Sub Timer1_Tick・・・     select case     ・     ・ end sub と書いてまして、 ボタンのend subからTimerのPrivateに行くまでにインターバル一回分が挟まって、select caseに行ってくれないなということで困ってしまって質問しました。 そしてTimer1_startの前の行にTimer1_Tickのサブルーチン化したものを入れまして、問題を解決することができました。 ほんとにご迷惑かけてすいませんでした。 ありがとうございました。

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • タイマーがうまくできません

    VisualBasicにてタイマーを作ろうと思っています。(キッチンタイマーみたいなもの) プロパティの初期値としては「Timer2.Interval = 100」 別に作成したボタンで「Timer2.Enabled = True」にするプログラムをした上で Private Sub Timer2_Tick(。。。省略  hyaku = Int((hyaku - 0.1) * 10) / 10  If hyaku >= 0 Then    Label5.Text = hyaku  Else    Timer2.Enabled = False  End if End Sub というプログラムを作成しました。 しかしプログラムを実行させると通常の約2倍の速さで秒数を刻んでいきます。 だからといって上の hyaku = Int((hyaku - 0.1) * 10) / 10 を hyaku = hyaku - 0.1 にすると小数点1位未満の数字も表示されてしまいます。 もしプログラムにミスがあるなら指摘をお願いします。 またExcelの関数にある「Round」みたいなものがあれば教えてください。 よろしくお願いします。

  • タイマーの使い方

    VB初心者です(6.0を使っています) タイマーの使い方がよく分かっていません。 ボタンを押してからの経過時間をラベルに表示させたいと思っているのですが、 ----------------------------------------------- Private Sub Command1_Click()   Timer1.Interval = 1000   処理1   処理2    ・    ・    ・   Timer1.Interval = 0 End Sub Private Sub Timer1_Timer()   Label1.Caption = [経過時間] End Sub ----------------------------------------------- という感じに書いていると、[処理1]~をしている間はラベルが表示されなくて、 最後の[処理]が終わった直後の[経過時間]のみが表示されます。 こういう形ではタイマーは使用できないのでしょうか? 他のWebサイトなども調べてみたのですが、解決できませんでした。 どなたか教えていただけませんでしょうか?

  • タイマーがうまく動かない

    VB6.0(SP5)で、バッチファイルを実行後、5秒待つようにしたいのですが、うまく動きません。 Dim ping_count As Long Private Sub Command1_Click() Shell ("executeping.bat") Timer1.Interval = 1000 Timer1.Enabled = True Do Text1.Text = "ただいま実行中" Timer1_Timer Loop Until ping_count = 5 Text1.Text = "終了" Timer1.Enabled = False End Sub Private Sub Timer1_Timer() ping_count = ping_count + 1 Text1.Text = "ただいま実行中" End Sub デバックで動かすと、ちゃんとループを5回繰り返してテキストボックスに「終了」と表示するのですが、実行するといきなり「終了」を表示してしまいます。 ループの中のTimer1_Timerをコメントにすると、デバックでは延々ループを続け、実行するとフリーズしてしまいます。 そもそもタイマーの使い方が間違っているのでしょうか? 教えてください。よろしくお願いします。

  • VB 6.0でtimerをとselect caseを使ったプログラムで質問です。

    また質問です。 VBであらかじめ書いてあった三つの円を信号機のように青は2.5秒、黄色は0.5秒、赤は3秒で青→黄→赤→青 …と三十秒間動かしたいのですが、caseの後ろには何をいれればいいかわからず Private Sub Timer1_Timer() Timer.Tag = Timer1.Tag + 0.5 progressbar1.Value = progressbar1.Value + 0.5 Select Case Timer1.Tag Case Shape5.FillColor = vbGreen Shape5.FillStyle = 0 Case Shape6.FillColor = vbYellow Shape6.FillStyle = 0 Case Shape7.FillColor = vbRed Shape7.FillStyle = 0 end select End Sub としたのですがまったく動きません。タイマーを設定したのに時間の表示もでません。あと、progressbarというのもでてこないんです。 どうかお詳しい方お願いします。 m(_ _)m

  • ひとつのボタンでタイマーを動かしたり止めたりしたいのですが

    ひとつのボタンでタイマーを動かしたり止めたりしたいのですが こんにちは 趣味でjavascriptをしているものです 以下のサイトから、テトリスのコードをダウンロードしたのですが、 http://java.aimary.com/ このjavascriptの動くhtml内に  gameInterval(ゲーム内のタイマー変数)を 使って、ポーズボタンのようなものを追加したいと思ったのですが、 以下のコードのようにすると、いったん停止したとおもったら、 再びタイマーが呼び出され、何度も押すと、タイムインターバルが 短くなっていきました。 //headに追加 function clear_timer() { var obj = document.getElementById("timer_control"); clearInterval( gameInterval ); obj.detachEvent('onclick', clear_timer); obj.attachEvent('onclick', set_timer ); } function set_timer() { var obj = document.getElementById("timer_control"); obj.detachEvent('onclick', set_timer ); obj.detachEvent('onclick', clear_timer ); gameInterval = window.setInterval("Handle_Interval()", (maxspeed-speed+1)*60); obj.attachEvent( 'onclick', clear_timer ); } //bodyに追加 <div style='position:absolute; left:520px; top:100px;'> <form name='Form1'> <input type="button" id="timer_control" value="pause" onclick="JavaScript:clear_timer();"> </form> </div> おそれいりますが、どなたか、正しい記述の仕方を 教えていただけないでしょうか? よろしくおねがいします。

  • 続・タイマーとShowdialog(VB2010)

    タイマーコントロールについて の続きになります。 一つ方法を考えました。いくつか問題ありですが・・。 ApplicationEvent.vbの部分を Namespace My Partial Friend Class MyApplication Protected Overrides Function OnInitialize( _ ByVal commandLineArgs As _ System.Collections.ObjectModel.ReadOnlyCollection(Of String) _ ) As Boolean 'スプラッシュウィンドウを表示する最短時間を0.5秒にする Me.MinimumSplashScreenDisplayTime = 500 Return MyBase.OnInitialize(commandLineArgs) End Function      'スプラッシュスクリーンのタイマーコントロール設定 Friend Sub Splash() With SplashScreen1.Timer1 .Enabled = True .Interval = 500 End With SplashScreen1.Timer1.Start() End Sub ' この書き方あってますか?とりあえずは反映されてるようですけれど・・・ End Class End Namespace SplashScreen1の部分を Public Class SplashScreen1 Friend Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click     ' クリックで閉じる DialogResult = DialogResult.OK Me.Close() End Sub Friend Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.Tick ' タイマーコントロール発動時、瞬時に停止させる。スクリーンは消えないように。 Me.Timer1.Enabled = False Me.ShowDialog() End Sub End Class と、してみましたが・・・問題が発生するのです。 この時、スクリーンフォームがMe.ShowDialog()と書いてあるにもかかわらず、 メインフォームとともに操作可能・・つまりモードレスであるShowで表示されるのです。上記のコードを実行してもらえれば分かると思いますが・・。 また、メインフォームが前方に、スクリーンフォームが後方に行ってしまいます。これはどのようにすれば良いでしょうか? Me.TopMost = True としても駄目でした。 BringToFrontを使っても同じでした。

  • Tickイベントについての質問

    1秒間のループ回数を得るために下記のようなコードを記述したのですが、Tickイベントが発生せずループから抜けません。以前はVB6(Timer1_Timerイベント)を使用していたのですが、何の問題もなく使用出来ていました。誰か分る方、ご教授下さい。もちろんInterval=1000です。 '1sec間に繰り返されるループ回数 Private mlng1SecTimeCount As Long '1sec経過フラグ Private msht1SecFlg As Short '(省略) Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load 'ディレイタイム設定 DELAY_TIME_SETTING() End Sub Private Sub DELAY_TIME_SETTING() 'ディレイタイム設定 '解説:1sec間に実行されるループ回数の算出。 'ループ回数格納用変数 Dim lngLoopCount As Long 'タイマー1起動 Timer1.Enabled = True Do Until msht1SecFlg = 1 lngLoopCount += 1 Loop 'タイマー1停止 Timer1.Enabled = False 'データ保存 mlng1SecTimeCount = lngLoopCount End Sub Private Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.Tick '解説:1sec経過後にインクリメント。 'インクリメント msht1SecFlg += 1 End Sub 以上よろしくお願い致します。

  • Do文の中にタイマーを・・・

    VBは初心者ではないのですが、作っているものがとても複雑なものなので教えていただきたいと思い書き込みました。 現在製作中のプログラムにDo文をセットし、Do~Loopの間にタイマーを動かすプログラムを作りたいと思います。 普通にタイマーを起動する場合は Timer1.Enabled = True でよいと思うのですが、タイマーの中にDo文の条件になるように変数を変えていくプログラムが入っているのです。 だからといって、Call文を使うとタイマー内の処理が1回しか行われないので無理です。 なので、「○○ミリ秒後に次の行のプログラムを実行」みたいな構文はないものでしょうか? または、タイマーを起動させ、タイマーが終了したらDo文の中に戻るようなプログラムはありませんか? 難しい質問とはわかっていますがよろしくお願いします。

  • VB2008でフォームに文字列をスクロールさせたい

    VB2008でフォーム上に右~左にフェイドイン、フェイドアウトする 物を作ろうとしてるのですが、どうしてもわからないので書き込みしました。 フォーム1にテキストボックスとボタンがあり、 ボタンを押す事によりテキストボックスの文字列をフォーム2の画面上に 表示し、右~左(HTMLLで言うとキーマー)に動くようにしたいのですが 右からって事は一番右の値が+だと思うのですがフォーム2は大きさを自由に 変更できるので大きさをさらに大きくした場合途中で消えてしまいます。 あと、タイマーでするとタイマーが終わるまで実行できないので 文字が流れてる間もボタンを押す事にyの値を変えて、 複数実行させたいのです。 以下が試しに書いてみたプログラムです。 Private Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.Tick Dim objG As Graphics objG = Form2.CreateGraphics() objG.Clear(Form2.BackColor) objG.DrawString(Text1.Text, Label1.Font, New SolidBrush(Label1.ForeColor), iLight, 50 + Form2.Width) iLight += -1 If iLight < -50 Then Timer1.Stop() End If objG.Dispose() End Sub Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click Timer1.Interval = 1 Timer1.Start() End Sub すみませんがよろしくお願いします。

  • Timer_Tickについて

    Timerイベントについてですが、Interval = 1 に設定し、例えば下記のようなプログラムを動かした場合、 /*-------------------------------------------*/ Private Sub Form_Load(~~)~~     Timer1.Start()     Original() '自作プロシージャ End Sub Private Sub Timer1_Tick(~~)~~     num += 1 'Publicで宣言してある     if num > 100 then Timer1.Stop() End Sub /*-------------------------------------------*/ Original()の処理に移るのは、numが100より大きくなってTimer1がStopしてからでしょうか? それとも、Timer1が動いている最中に、移ってるのでしょうか?