モーダルフォーム

解決


かなつ  2003-06-09 16:08:15  No: 78201  IP: [192.*.*.*]

モーダルフォーム(Msgbox)表示時に通常のフォームを表示させようとするとエラーになってしまうのですが、よい解決方法を教えてください。
ちなみに通常のフォームはTimer割り込みでどうしても表示させたいのですが

編集 削除
nanashi  2003-06-09 16:17:24  No: 78202  IP: [192.*.*.*]

ちょっと状況が分かり難いです。
モーダルフォームを表示してる時に通常フォームを表示すること自体の意味も分からないし。

モーダルフォームから新しいフォームを表示する時もモーダルにするとか、
もしくは最初のモーダルフォームをモードレスにしておくとか。

編集 削除
かなつ  2003-06-10 09:05:14  No: 78203  IP: [192.*.*.*]

わかりにくい表現ですみません。
もう一度ご説明します。
Timer割り込みを使って通常の処理以外の時にメッセージフォーム(モーダレス)を出そうとしたところ、Msgbox(モーダル)で他の処理をしているタイミングでTimer割り込みが入ってエラーがでてしまいました。通常こんな使い方自体問題があるとおもうのですが。
現在、考えているのは、MsgBoxが出ていることをプログラム上で認識する方法はないか調べています。よい方法があれば教えてください。

編集 削除
nanashi  2003-06-10 10:17:19  No: 78204  IP: [192.*.*.*]

MsgBoxを使っているときは他の処理は行われないのでMsgBoxを調べる必要は無いと思いますが??

自作のメッセージフォームならFormsコレクションを調べれば分かります。
また、メッセージフォームが出ているときはTimerのEnabeledをFalseにしてみては如何でしょうか?
もしくはメッセージフォームをモードレスで表示してはどうでしょうか?

編集 削除
魔界の仮面弁士  2003-06-10 11:36:59  No: 78205  IP: [192.*.*.*]

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

編集 削除
nanashi  2003-06-10 15:40:31  No: 78206  IP: [192.*.*.*]

>魔界の仮面弁士さん

> MsgBoxの表示中でも、Timerイベントは発生しますので、注意してください。
> (開発環境では発生しませんが)

なるほど、これは知りませんでした。
試しにExeを作ってみたところ確かにTimerイベントは発生していますね。
ご指摘有り難うございます、勉強になりました。

編集 削除
とろ  2003-06-10 15:45:54  No: 78207  IP: [192.*.*.*]

私も初めて知りました。

タメになりますねぇ。

編集 削除
かなつ  2003-06-12 14:38:04  No: 78208  IP: [192.*.*.*]

タイマー割り込み時のform表示時、下記方法でエラー回避しました。

   On Error Resume Next

編集 削除