DOBON.NET DOBON.NETプログラミング掲示板過去ログ

MDIの子ウィンドウに対するメッセージ

環境/言語:[Win2000]
分類:[VB6以前]

MDIで親ウィンドウで発生した要求に対する処理を、
アクティブな子ウィンドウ側で実行したいのですが、
親から子ウィンドウの関数を呼ぶ方法、または
子ウィンドウに対してメッセージを送信し、子ウィンドウ側で
そのイベントを受ける方法がわかりません。

どなたか、ご教授お願いします。
じゃんぬねっと です。

■No8590に返信(ODさんの記事)
> MDIで親ウィンドウで発生した要求に対する処理を、
> アクティブな子ウィンドウ側で実行したいのですが、
> 親から子ウィンドウの関数を呼ぶ方法、または
> 子ウィンドウに対してメッセージを送信し、子ウィンドウ側で
> そのイベントを受ける方法がわかりません。
> どなたか、ご教授お願いします。

正攻法としては、現在アクティブな MDI 子フォームを取得して
http://f57.aaa.livedoor.jp/~jeanne/tips/mdiform/03-activemdichild.html#vb6

その子フォームの Type を取得して、Select で分岐させて、
その MDI 子フォームのインスタンスを通して、メッセージを表示するメソッドを呼ぶ。
インスタンス化してなきゃ、直接メソッドを呼ぶ。



   /*******************************************
     * @Remarks    じゃんぬねっと
     * @Homepage  http://f57.aaa.livedoor.jp/~jeanne/
     * @Blog        http://www.ailight.jp/blog/jeanne/
     *******************************************/
じゃんぬねっとさんありがとうございます。

ActiveFormのCapsionでそのフォームの種類を
判断し、各子ウィンドウのメソッドを呼ぶように
対応できそうです。
解決済み!
じゃんぬねっと です。

■No8592に返信(ODさんの記事)
> ActiveFormのCapsionでそのフォームの種類を
> 判断し、各子ウィンドウのメソッドを呼ぶように
> 対応できそうです。

それは、保守性を考えると宜しくない仕様かと思われます。
ちゃんと Type を見るようにした方が安全です。
まあ、実装者の自由で、私がどうこう口出しできるものではありませんが...

Source:-----------------------------------------------------
【basMain (標準モジュール)】

' エントリ ポイント
Public Sub Main()
    ' フォームの新しいインスタンスを生成する
    Dim hFormMain As MDIForm1
    Set hFormMain = New MDIForm1

    ' フォームの表示
    Call hFormMain.Show(vbModeless)
End Sub

------------------------------------------------------------
【Form1 〜 Form3 (MDI 子フォーム 3 つ)】

' メッセージを受け取るメソッド
Public Sub ShowMessage(ByVal nPrompt As String)
    Call MsgBox(nPrompt)
End Sub

------------------------------------------------------------
【MDIForm1 (MDI 親フォーム)】

' プライベート メンバ (MDI 親フォームはこの 3 つの MDI 子フォームを持つ)
Private mForm1 As Form1
Private mForm2 As Form2
Private mForm3 As Form3

' Load() イベント
Private Sub MDIForm_Load()
    ' ロード時に MDI 子フォームの新しいインスタンスを生成する
    Set mForm1 = New Form1
    Set mForm2 = New Form2
    Set mForm3 = New Form3

    ' MDI 子フォームをすべて表示
    Call mForm1.Show(vbModeless)
    Call mForm2.Show(vbModeless)
    Call mForm3.Show(vbModeless)
End Sub

' メッセージを送信
Private Sub Picture1_Click()
    Select Case TypeName(Me.ActiveForm)
        Case "Form1"
            Call mForm1.ShowMessage("ここは Form1 ですか?")
        Case "Form2"
            Call mForm2.ShowMessage("ここは Form2 ですか?")
        Case "Form3"
            Call mForm3.ShowMessage("ここは Form3 ですか?")
    End Select
End Sub

------------------------------------------------------------
解決済み!
じゃんぬねっとさんありがとうございます。

確かにTypeNameを使用したほうが良いですね。
Captionの場合は、もしタイトルバー変更があった場合に
プログラム修正になってしまいます。

TypeNameを使用したForm名の分岐に修正してみます。
解決済み!

DOBON.NET | プログラミング道 | プログラミング掲示板