- PR -

MDI子フォームの終了を取得する方法は?

投稿者投稿内容
KKK
大ベテラン
会議室デビュー日: 2003/10/10
投稿数: 119
投稿日時: 2004-02-12 11:48
すいません。

ある条件を言い忘れてました。
こちらは、MDI親フォームをEXE形式ファイルとして、
MDI子フォームをDLL形式で作成しています。
おそらくこの影響で子フォームのClosedイベントが発生しないのでしょうか?
Jubei
ぬし
会議室デビュー日: 2002/03/02
投稿数: 830
お住まい・勤務地: 関西
投稿日時: 2004-02-12 14:30
諸農です。

引用:

こちらは、MDI親フォームをEXE形式ファイルとして、
MDI子フォームをDLL形式で作成しています。
おそらくこの影響で子フォームのClosedイベントが発生しないのでしょうか?



同一のソリューション内に親フォームのプロジェクト、
子フォームのプロジェクトを作成して試してみました。
もちろん子フォームのプロジェクトは.dll形式にビル
ドされています。
参照設定はプロジェクトで行っています。

結果、イベントは発生しました。

まさかとは思いますが、子フォームの生成コードで
MdiParentに親の参照をセットしていないって事はない
でしょうか?

できれば、再現できる最小限のコードなどを提示してい
ただきたいのですが。


_________________
諸農和岳
Powered by Turbo Delphi & Microsoft Visual Studio 2005

十兵衛@わんくま同盟
http://blogs.wankuma.com/jubei/
KKK
大ベテラン
会議室デビュー日: 2003/10/10
投稿数: 119
投稿日時: 2004-02-12 16:55
こちらは違うソリューションで別々に親(EXE)と子(DLL)を作っています。
(もしかしてこれが原因??)

一応、MdiParentは設定してあります...(>> 諸農さん)
以下にコードを書きます。
(大したことはしてませんが...)

(親フォーム)
Dim clsStart As Form1.clsStart
clsStart = New Form1.clsStart
clsStart.Open(Me)

(子フォーム)clsStartモジュール
Public Function Open(ByRef ParentForm As Form)
Dim Form As From1
Form = New Form1
Form.MdiParent = ParentForm
Form.Show()
End Function

Private Sub Form1_Closing(ByVal sender As Object, ByVal e As System.ComponentModel.CancelEventArgs) Handles MyBase.Closing
MessageBox.Show("子です")
End Sub
Jubei
ぬし
会議室デビュー日: 2002/03/02
投稿数: 830
お住まい・勤務地: 関西
投稿日時: 2004-02-12 21:09
諸農です。

引用:

こちらは違うソリューションで別々に親(EXE)と子(DLL)を作っています。
(もしかしてこれが原因??)



それはないと思います。

引用:

一応、MdiParentは設定してあります...(>> 諸農さん)
以下にコードを書きます。
(大したことはしてませんが...)

コード:
(親フォーム)
Dim clsStart As Form1.clsStart
clsStart = New Form1.clsStart
clsStart.Open(Me)

(子フォーム)clsStartモジュール
Public Function Open(ByRef ParentForm As Form)
 Dim Form As From1
 Form = New Form1
 Form.MdiParent = ParentForm
 Form.Show()
End Function

Private Sub Form1_Closing(ByVal sender As Object, ByVal e As System.ComponentModel.CancelEventArgs) Handles MyBase.Closing
 MessageBox.Show("子です")
End Sub





確認です。
1.clsStartと言うクラスは親側のソリューションの中のプロジェクトで
  定義されているのですか?
  上記の内容だと子フォーム側で定義されているような感触を受けますが、
  それだと、親フォームからの呼び出しがよくわかりません。
  というか、親フォームのクラス名がForm1だと混同してしまいそうです。

2.親フォームも子フォームもForm1型ですか?
  もしもそうだとすると、エイリアスの解決で実は親フォームが生成され
  ているって事はないですか?
  #私の場合、混同を避けるために敢えて子フォームのクラス名を変更しています。

3.間接的に存在するclsStartクラスを使わずに、単純なプロジェクトで
  試しても同様の結果になりますか?

こちらで、親フォーム側にclsStartクラスを定義して行った結果、また、
子フォーム側にclsStartクラスを定義して行った結果の双方ともに、
Closing/Closedイベントは発生しました。
#但し、同一ソリューション内でのプロジェクト分けですが。

ちなみに、ご提示がなかったのですが、clsStartクラスの定義は以下のようにしました。

コード:
public class clsStart
{
    public void open(ref System.Windows.Forms.Form AForm)
    {
        CForm1 f = new CForm1();
        f.MdiParent = AForm;
        f.Show();
    }
}



CFormは子フォームとして利用するフォームクラス名です。
open()メソッドでフォームを引き取っていますが、ref(参照渡し)の場合、
呼び出し側で自分を参照するthisをそのまま渡すことができないので
いったん変数に格納してから渡しています。
#オブジェクト参照なので参照渡しする意味があるとは思えませんが。
#また、ref渡しをしなくてもClosing/Closedイベントは期待通りに発生しています。

_________________
諸農和岳
Powered by Turbo Delphi & Microsoft Visual Studio 2005

十兵衛@わんくま同盟
http://blogs.wankuma.com/jubei/

スキルアップ/キャリアアップ(JOB@IT)