• ベストアンサー

Timerイベントについて

同一フォーム上にTimer(Interval=1000)とCommandButtonを貼り付けCommandButtonをクリックするとMsgboxを表示するプログラムを作成しましたが、Msgboxを表示している間Timerイベントは動いていないようで、Msgboxを閉じると動き出すようようです。 これは仕様なのでしょうか。回避策または代替プログラムはあるでしょうか? よろしくお願いします。

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

  • ベストアンサー
  • anmochi
  • ベストアンサー率65% (1332/2045)
回答No.1

 仕様かバグかといわれたら、仕様だ。  Visual Basic 6だろうと、VB.NETだろうとC#だろうと、普通にプログラムを作るとそれは「シングルスレッドアプリケーション」になる。  シングルスレッドを簡単に説明すると、そのプログラム中で動作をしているポイントが1つしかないという事だ。  もっと簡単に言えば、TimerイベントやCommandButton_Clickイベントは同時に一つしか呼ばれない。つまり、あるイベントが実行されている間、他のイベントが到達しても待機状態になっているわけだ。  「じゃあマルチスレッドにしないといけないの?」  MsgBoxで止まっている場合はその通り。この時、プログラムからは(Win32APIを駆使しない限り)別の処理を実行できない。プログラムが、完全に「MsgBox終了待ち」で止まっている。これを回避するには、メッセージボックスのようなフォームを自前で作り、それを表示するようにしないといけない。  余談だが、MsgBoxで止まっている訳ではない場合、VB6も、VB.NETも、C#も、シングルスレッドの状態で複数イベントを同時に実行する機能を備えている。DoEventsというものだ。これに関してはネットなどで使い方を調べると良いだろう。前述の通り、MsgBoxで止まっている場合はこのDoEventsは使えない。

その他の回答 (1)

  • OsieteG00
  • ベストアンサー率35% (777/2173)
回答No.2

Msgboxはモーダル(制御を離さない)なので仕様です。 どうしても似たようなことをしたければ、ユーザフォームで定義してcreateすれば可能かも。

関連するQ&A

  • TIMERについて

    VB6.0 SP5での質問です フォーム一つのみをもつ、 単純なプログラムがあるとします。 (1)フォームにはTimerオブジェクトが貼り付けてあり 1秒ごとに、イベントが起きるようにします。 (2)それと同じ構造のプログラムをもうひとつ作ります。 (1)のフォームから(2)のプログラムを読み出す ボタンを追加します。 EXEファイルを作成します。 (1)の(2)を読み出すボタンを押して(2)を起動した時に、 (1)で動いているTimerは一体どうなるのでしょうか? (2)のEXEが開いているうちも、動きつづけるのでしょうか? 一つのプロジェクトの中に2つのフォームがあった場合 だと、2つ目のフォームを開いていても、 1つめのフォームrのTimerは動いているようでした。 別EXEの場合はどうなるのでしょうか? どなたか至急教えてください。お願いします。

  • .NetのTimerについて

    Timerを使用して5秒までに応答電文がこなかったらエラーメッセージを出すプログラムを作成しています。 .Netは初心者なものでTimerの使い方がよくわかりません。 クラスからTimerを動かすことはできないのでしょうか? 作成しているプログラムはFormがいらないので、TimerだけFormにおいて非表示で使おうかなと思っています。 どうしたらよいでしょうか? また、この場合だとTimerではない方がいいですか?

  • 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が動いている最中に、移ってるのでしょうか?

  • 【VB6】Timerコントロールは何個まで配置できるか

    お世話になります。 VB6において、ひとつのアプリケーション中で使用できるTimerコントロールの数は、一般に何個くらいが限界でしょうか。 多数のTimerを使用することで、メソッドの呼び出しが極端に遅延するなどの影響は有り得るでしょうか。 現在作成中のアプリでは、既に15個ほどのTimerコントロールを使っています。 ここにフォームを1枚追加し、更にTimerを10個増やそうとしています。 いずれも、Interval=1000で動作させます。 Windows2000での実行が前提です。 環境やOSによって条件等異なると思いますが、どうぞお教えください。

  • comboboxのクリックイベントについて

    VB6です comboboxを設置してクリックイベントに処理を書いたら、フォームロード時に必ず1回クリックイベントが発生します。 当初はフラグを立ててこの現象を回避していたのですが、コードを書くうちに、この最初のクリックイベントが面倒で仕方ありません。 comboboxを設置するとフォームロード時に必ずクリックイベントが発生するのはVB6の仕様なのでしょうか。 それともほかに回避の仕方があるのでしょうか。

  • 今発生しているイベントのコントロール名を取得

    エクセルです 例えば、シートにコマンドボタンを一つ設置して、クリックイベントで Private Sub CommandButton1_Click() MsgBox "CommandButton1が押されました" End Sub こうしたら、コマンドボタン1を押した時に、 "CommandButton1が押されました"が表示されますが、 CommandButton1の部分を変数みたいなのにすることはできますか? MsgBox Me.Name & "が押されました" だとシート名が取得されるし MsgBox Me.Control.Name & "が押されました" や MsgBox Me.ActionControl.Name & "が押されました" だとエラーになります。

  • コマンドボタンのEnterイベント後に、フォーカスを移動したい。

    コマンドボタンのEnterイベント後に、フォーカスを移動したい。 フォームに「TextBox1」(TabIndex=0)「TextBox2」(TabIndex=1)「CommandButton1」(TabIndex=2)の3つのコントロールがある場合。 CommandButton1がクリックされた場合も、TextBox2からCommandButton1に、タブキーまたはエンターキーで、フォーカスが移った場合にも、同じ処理を行い、処理結果によってTextBox1やTextBox2にフォーカスを移したいと考えています。 以下のようなサンプルを作成しました。 Private Sub CommandButton1_Enter() CommandButton1_Click End Sub Private Sub CommandButton1_Click() MsgBox ("OK") TextBox2.SetFocus End Sub この場合、CommandButton1_Enterのイベントが起こった場合、CommandButton1_Click()のTextBox2.SetFocusは効きません。 (正確には、CommandButton1_Enterイベントが終わった時点で無効でしょうか。) Enterイベントは、フォーカスが移動する前に発生するため、このイベントが終わった後に、そもそもの動作に戻り、フォーカス移動が発生してしまうからなのだと思っております。 要は、コマンドボタンにタブキーやエンターキーでフォーカスしても、コマンドボタンをクリックしたのと同じ処理を行い、所定の位置にフォーカスを持っていきたいのですが、どのように行えば良いか、わからない状況です。 よろしくお願いいたします。

  • MFC Timerについて

    MFCのTimerの利用方法をいろいろ調べたのですが。 理解できずに困っています。 MFCのダイアログベースで作成し、ボタンを押したら Timer(1秒ごと)でエディットボックスに表示させるというものです。 ・ベースのウィンドウにボタンとエディットボックスを作成しました。 ・次に ボタンをダブルクリックし以下のように書きました。 void CtestDlg::OnBnClickedButton() {     int x=0; char buf[10000]; x++; sprintf(buf,"%d",x); (labelの変数名)_edit.SetWindowText(buf); } ・SetTimer(1, 1000, NULL);を用いて ボタンがクリックされたら1秒ごとにxの値をエディットボックスに表示させるようにしたいのですが。 OnTimer(UINT nIDEvent) Close()やKillTimer(1);をもちいらなければならないことはわかったのですが。 作業手順がわかりません。 詳しい 作業手順をおしえてください。 プログラム完成まで 教えていただけるととてもうれしいです。 プログラマーの方よろしくお願いします。

  • vb6.0でプログラム間のイベント受送信処理

    初めまして、VB6.0プログラミング初心者です。 CreateEvent、SetEventを利用して、プログラム間でのイベント受送信処理をしようとしています。 また、受ける側でTimer関数を利用してイベントを監視し、イベントを受け取った際にMSG表示するようにもしたいのです。 いろいろ調べて、ActiveDLLを使用してみたりしたのですが、うまくいきませんし、 API関数の定数やどうやってプログラム間でイベントを受送信するのかがわかりませんでした。 ご教授よろしくお願いいたします。

  • VBScriptで、(もう・・・初歩も初歩)

    HTMLでVBScriptをはじめて書いています。 説明書(ちょっと古いのですが)では、 Timerイベントというのがあるのですが、 <object>タグでTimerを置いても、 何もおきません。 <onject name="Timer" classid="clsid:~"> <param name="interval" value=1000> </object> で、スクリプトは Sub Timer_Timer ~~たとえばMsgBox "8時だよ!全員集合!"~~ End Sub なんですが・・・。 ちなみに、オブジェクトの width と height に値を与えても、 画像領域にバッテンが表示されるだけですので、 オブジェクト自体がないのでしょうか? Timer.oxc とか何かが必要なんでしょうか? 間抜けな質問だったらごめんなさい。

専門家に質問してみよう