Showで開いたFormへの参照が消えるタイミングを教えてください
- 題名: Showで開いたFormへの参照が消えるタイミングを教えてください
- 著者: なおじ
- 日時: 2012/02/20 22:26:30
- ID: 29898
- この記事の返信元:
- この記事への返信:
- ツリーを表示
- 題名: Re[1]: Showで開いたFormへの参照が消えるタイミングを教えてください
- 著者: Azulean
- 日時: 2012/02/20 22:59:17
- ID: 29899
- この記事の返信元:
- この記事への返信:
- ツリーを表示
- 題名: Re[2]: Showで開いたFormへの参照が消えるタイミングを教えてください
- 著者: なおじ
- 日時: 2012/02/20 23:35:44
- ID: 29901
- この記事の返信元:
- この記事への返信:
- ツリーを表示
分類:[.NET]
FormのShowメソッドで表示したフォームを、×ボタンで閉じても、
インスタンスが残っているようです。Showで開いたフォームは、×
ボタンで無くなるとおもっていたのですが、これはなぜでしょうか?
試したソースは以下となります。
Form1にボタンを二つ(button1とbutton2)を配置し、button1から
からForm2をShowで表示します。Form2を表示する際、Form2側にForm1
のbutton1クリックのイベントを監視できるようにしています。
Form2では、Form1で発生したイベントに対し、メッセージボックスを
表示します。また、Disposedイベントにハンドラをつけて、ここでも
メッセージ表示するようにしています。
ここで、Form1からbutton1をクリックしてForm2のインスタンスを1つ
作成してShowにて表示して、すぐにForm2のウィンドウを閉じます。
閉じると、Disposedイベントが発生して、「Disposed!」と表示されま
す。
ここでForm1のbutton2をクリックすると、閉じたはずで、Disposedイベ
ントも発生したForm2のイベントハンドラが働いたようで、「ある!」
とメッセージ表示されます。
DisposeされたはずのForm2から、メッセージが出てきてしまう理由が
いまいちわかりません。単純に、イベントハンドラの形でForm1への
参照が残っていたからなのでしょうか?
○Program.cs
static class Program
{
/// <summary>
/// アプリケーションのメイン エントリ ポイントです。
/// </summary>
[STAThread]
static void Main()
{
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
Application.Run(new Form1());
}
}
○Form1 ボタンを2つ配置する。
public partial class Form1 : Form
{
// イベント
public event EventHandler<EventArgs> ClickEvent = delegate { };
public Form1()
{
InitializeComponent();
}
private void button1_Click(object sender, EventArgs e)
{
Form2 frm = new Form2();
frm.SetEvent(this);
frm.Show();
}
private void button2_Click(object sender, EventArgs e)
{
this.ClickEvent(this, new EventArgs());
}
}
○Form2
public partial class Form2 : Form
{
public Form2()
{
InitializeComponent();
this.Disposed += new EventHandler(Form2_Disposed);
}
void Form2_Disposed(object sender, EventArgs e)
{
MessageBox.Show("Disposed!");
}
public void SetEvent(Form1 frm)
{
frm.ClickEvent += new EventHandler<EventArgs>(frm_ClickEvent);
}
void frm_ClickEvent(object sender, EventArgs e)
{
MessageBox.Show("ある!");
}
}