実行ファイルにするとタイマーが止まらない

解決


もり  2008-12-31 20:56:33  No: 101439

次のコードは、IDEで実行した場合はコマンドボタンをクリックすると、メッセージボックスが表示されて音が鳴り止みますが、実行ファイルにして実行した場合は、メッセージボックスが表示されている間もずっと音が鳴り続けます。
これはどうしてなのでしょうか?
鳴り止むようにするにはどうしたらいいでしょうか?

何卒ご教授のほどよろしくお願い致します。

Private Sub Form_Load()
    Timer1.Interval = 1000
End Sub

Private Sub Command1_Click()
    MsgBox "123"
End Sub

Private Sub Timer1_Timer()
    Beep
End Sub


鉄仮面  2008-12-31 22:45:11  No: 101440

Private Sub Command1_Click()
    MsgBox "123"
    Timer1.Interval = 0
End Sub


正月  2009-01-03 05:58:43  No: 101441

IDEと実行環境での違いだと思いますが

>Private Sub Command1_Click()
>    MsgBox "123"
>    Timer1.Interval = 0
>End Sub
これは納得できません、せめて
    Timer1.Interval = 0
    MsgBox "123"
にするべきかと。

    Timer1.Enabled = False
    MsgBox "123"
の方が適切かと。


魔界の仮面弁士  2009-01-03 21:06:14  No: 101442

> これはどうしてなのでしょうか?
仕様(by design)という事になっています。
http://support.microsoft.com/kb/178078/ja
http://support.microsoft.com/kb/178078/en-us

なので、そうした動作の違いを避けるために(開発時にも止まらないよう)、
MessageBox API を使った回避手法が、しばしば利用されています。

Private Declare Function MessageBox Lib "user32" Alias "MessageBoxA" _
   (ByVal hwnd As Long, _
    ByVal lpText As String, _
    Optional ByVal lpCaption As String = "", _
    Optional ByVal wType As Long = vbOKOnly) As Long
Private Const MB_CANCELTRYCONTINUE As Long = &H6

Private Sub Command1_Click()
   MessageBox hwnd, "てすと"
End Sub

Private Sub Command2_Click()
  MsgBox "てすと"
End Sub

> 鳴り止むようにするにはどうしたらいいでしょうか?
しかし今回はその逆で、「メッセージ表示中は停止したい」という
だけですから、単純にタイマー自体を停止してしまえばよいですね。
(これについては、正月さんらが既に回答をつけておられます)

もし、全ての MsgBox 関数の呼び出し部に、そうしたタイマー停止コードを
設けるのが面倒という事であれば、MsgBox の代替コードを用意してやれば、
呼び出し側の処理に手を加える必要はありません。

Private Sub Command1_Click()
  MsgBox "てすと"
End Sub

'** タイマー依存なので、標準モジュールではなくフォームモジュールに記述
Friend Function MsgBox( _
  ByVal Prompt As Variant, _
  Optional ByVal Buttons As VbMsgBoxStyle = vbOKOnly, _
  Optional ByVal Title As Variant, _
  Optional ByVal HelpFile As Variant, _
  Optional ByVal Context As Variant) As VbMsgBoxResult
  
    Dim e As Boolean
    e = Me.Timer1.Enabled
    Me.Timer1.Enabled = False
    MsgBox = VBA.Interaction.MsgBox(Prompt, Buttons, Title, HelpFile, Context)
    Me.Timer1.Enabled = e
End Function


もり  2009-01-04 01:02:32  No: 101443

ご回答していただいた皆様、ありがとうございます。
おかげさまで解決いたしました。

> もし、全ての MsgBox 関数の呼び出し部に、そうしたタイマー停止コードを
> 設けるのが面倒という事であれば、MsgBox の代替コードを用意してやれば、
> 呼び出し側の処理に手を加える必要はありません。

VBの元々の関数(MsgBox関数)と同じ名前の関数を作れるなんて知りませんでした!!

魔界の仮面弁士さん、サンプルコードまで書いて詳しく説明して下さってありがとうございました。


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

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






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