[リストへもどる]   [VBレスキュー(花ちゃん)]
一括表示

投稿時間:2005/05/18(Wed) 16:09
投稿者名:tomo
Eメール:
URL :
タイトル:
フォームを一度に全て閉じる方法(モーダルフォームが混在する場合)
 始めまして tomo と申します。

 表題の件で、悩んでおります。
1つのプロジェクトでフォームを幾つか同時に表示しています。
実行エラー等で続行できない場合、異常終了画面を表示して表示中の
全フォームを閉じたいのですが、フォームの表示方法がモードレス表示と
モーダル表示とで混在しています。

 ヘルプbO29の方法で実行すると、
『実行時エラー '402'

 一番手前(前面)のモーダル フォームを先に閉じてください。』
というメッセージボックスが表示されます。

 全フォームの閉じる時に、個々のフォームがモードレスとモーダルのどちらで
表示されているか判断したいのですが、方法がわかりません。


■ソース環境
 Project1
 Form1(親画面)
 Form2(子画面)
 Form3(異常終了画面)

■現状
 1.Form1からForm2をモーダル表示。
 2.Form2の実行中にエラーが発生。(Form3がモーダル表示される)
 3.Form3を閉じると上記実行エラーが発生。

■開発環境
 OS  : WindowsXP SP2
 IDE : VB6 SP5

どなたかご存知の方、教えてください。よろしくお願いします。

投稿時間:2005/05/18(Wed) 16:22
投稿者名:
Eメール:
URL :
タイトル:
Re: フォームを一度に全て閉じる方法(モーダルフォームが混在する場合)

Dim objForm As Form

        For Each objForm In Forms
            If Not objForm Is Me Then ’このMeとは親フォームを意味します。
                    ’この部分を書き換えて下さい
                Unload objForm 'フォームが開いていたら閉じる
            End If
        Next objForm

これですべてのフォームが閉じると思います。

投稿時間:2005/05/18(Wed) 17:31
投稿者名:tomo
Eメール:
URL :
タイトル:
Re^2: フォームを一度に全て閉じる方法(モーダルフォームが混在する場合)
お早いご返答ありがとうございます。

 参考コードをForm3(異常終了)の閉じるボタン「Command1_Click」の中に
記述して早速試してみましたが、同じメッセージが表示されてうまくいきませんでした^^;

<コード抜粋>
Private Sub Command1_Click()

    Dim objForm As Form
    
    For Each objForm In Forms
        If Not objForm Is Me Then
            Unload objForm
        End If
    Next objForm
    
    Unload Me

End Sub

API等でフォームがモードレスかモーダルか解る方法とかないのでしょうか。

投稿時間:2005/05/18(Wed) 22:36
投稿者名:のびた
Eメール:
URL :
タイトル:
Re^3: フォームを一度に全て閉じる方法(モーダルフォームが混在する場合)
> API等でフォームがモードレスかモーダルか解る方法とかないのでしょうか。

なにか難しく考えすぎていませんか?
フォームを表示しているのは自分のプログラムなんだから
呼び出したところで自分を閉じてやればいいだけでは?

例えばForm1,Form2,Form3にそれぞれCommand1を貼り付けてやって以下のコードを書きます

'Form1のコード
Private Sub Command1_Click()
  Form2.Show vbModal
  If Form2.intErr Then
    Unload Me
  End If
End Sub

'Form2のコード
Option Explicit
Public intErr As Integer
Private Sub Command1_Click()
  Form3.Show vbModal
  If Form3.intErr Then
    intErr = -1
    Unload Me
  End If
End Sub

'Form3のコード
Option Explicit
Public intErr As Integer
Private Sub Command1_Click()
  intErr = -1
  Unload Me
End Sub

投稿時間:2005/05/18(Wed) 23:02
投稿者名:K.J.K.
Eメール:akiya@koalanet.ne.jp
URL :
タイトル:
Re: フォームを一度に全て閉じる方法(モーダルフォームが混在する場合)
全てVisibleプロパティがTrueであって、かつLoadイベント
プロシージャ中で呼び出されるのでなく、APIやActiveX DLLでの
モーダルダイアログは用いていないのであれば、

    Dim oForm As Form
    Do While (0& < Forms.Count)
    For Each oForm In Forms
        If oForm.Enabled Then
            Call Unload(oForm)
        End If
    Next
    Loop

辺りで十分では。まぁ、状況に応じてエラー処理などを付加する
必要があるでしょう。例えば、API関数などでモーダルダイアログを
表示する可能性がある場合など、には少し工夫をしてください。

投稿時間:2005/05/19(Thu) 15:24
投稿者名:tomo
Eメール:
URL :
タイトル:
解決しました。
ゆ様、のびた様、K.J.K.様
返信ありがとうございました。

K.J.K.様の方法で解決する事ができました!
ありがとうございましたm(_ _)m