モーダルフォーム(Msgbox)表示時に通常のフォームを表示させようとするとエラーになってしまうのですが、よい解決方法を教えてください。
ちなみに通常のフォームはTimer割り込みでどうしても表示させたいのですが
ちょっと状況が分かり難いです。
モーダルフォームを表示してる時に通常フォームを表示すること自体の意味も分からないし。
モーダルフォームから新しいフォームを表示する時もモーダルにするとか、
もしくは最初のモーダルフォームをモードレスにしておくとか。
わかりにくい表現ですみません。
もう一度ご説明します。
Timer割り込みを使って通常の処理以外の時にメッセージフォーム(モーダレス)を出そうとしたところ、Msgbox(モーダル)で他の処理をしているタイミングでTimer割り込みが入ってエラーがでてしまいました。通常こんな使い方自体問題があるとおもうのですが。
現在、考えているのは、MsgBoxが出ていることをプログラム上で認識する方法はないか調べています。よい方法があれば教えてください。
MsgBoxを使っているときは他の処理は行われないのでMsgBoxを調べる必要は無いと思いますが??
自作のメッセージフォームならFormsコレクションを調べれば分かります。
また、メッセージフォームが出ているときはTimerのEnabeledをFalseにしてみては如何でしょうか?
もしくはメッセージフォームをモードレスで表示してはどうでしょうか?
MsgBoxの表示中でも、Timerイベントは発生しますので、注意してください。
(開発環境では発生しませんが)
さて、『MsgBox関数を表示させているかどうか』の判定方法ですが、
一つの案として、「MsgBox関数自体をカスタマイズする」という
手法があります。
例えば、後述のコードを標準モジュールに書いておけば、
Timerイベント側では、
Private Sub Timer1_Timer()
If gbolIsMsgBoxVisible = True Then
'メッセージボックス表示中
Else
'メッセージボックスは表示されていない
End If
End Sub
のようにして判定することができます。
Public gbolIsMsgBoxVisible As Boolean
Public Function MsgBox(ByVal Prompt As String, _
Optional ByVal Buttons As VbMsgBoxStyle = vbOKOnly, _
Optional ByVal Title As Variant, _
Optional ByVal HelpFile As Variant, _
Optional ByVal Context As Variant) As VbMsgBoxResult
If IsMissing(Title) Then
Title = App.Title
End If
gbolIsMsgBoxVisible = True
If IsMissing(HelpFile) Or IsMissing(Context) Then
MsgBox = VBA.MsgBox(Prompt, Buttons, Title)
Else
MsgBox = VBA.MsgBox(Prompt, Buttons, Title, HelpFile, Context)
End If
gbolIsMsgBoxVisible = False
End Function
>魔界の仮面弁士さん
> MsgBoxの表示中でも、Timerイベントは発生しますので、注意してください。
> (開発環境では発生しませんが)
なるほど、これは知りませんでした。
試しにExeを作ってみたところ確かにTimerイベントは発生していますね。
ご指摘有り難うございます、勉強になりました。
私も初めて知りました。
タメになりますねぇ。
タイマー割り込み時のform表示時、下記方法でエラー回避しました。
On Error Resume Next
ツイート | ![]() |