次のコードは、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
Private Sub Command1_Click()
MsgBox "123"
Timer1.Interval = 0
End Sub
IDEと実行環境での違いだと思いますが
>Private Sub Command1_Click()
> MsgBox "123"
> Timer1.Interval = 0
>End Sub
これは納得できません、せめて
Timer1.Interval = 0
MsgBox "123"
にするべきかと。
で
Timer1.Enabled = False
MsgBox "123"
の方が適切かと。
> これはどうしてなのでしょうか?
仕様(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
ご回答していただいた皆様、ありがとうございます。
おかげさまで解決いたしました。
> もし、全ての MsgBox 関数の呼び出し部に、そうしたタイマー停止コードを
> 設けるのが面倒という事であれば、MsgBox の代替コードを用意してやれば、
> 呼び出し側の処理に手を加える必要はありません。
VBの元々の関数(MsgBox関数)と同じ名前の関数を作れるなんて知りませんでした!!
魔界の仮面弁士さん、サンプルコードまで書いて詳しく説明して下さってありがとうございました。
ツイート | ![]() |