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

子画面の表示方法

  • 題名: 子画面の表示方法
  • 著者: ぱんだこぱんだ
  • 日時: 2011/08/09 13:51:50
  • ID: 28864
  • この記事の返信元:
    • (なし)
  • この記事への返信:
  • ツリーを表示
環境/言語:[環境(Windows XP)、Visual  Studio2008、使用言語(C#)、.NET Frameworkのバージョン(2.0)]
分類:[.NET]

画面1にボタンを用意して別の子画面を表示するプログラムで
ボタンを押してForm2を表示した場合に、1回目は正常に画面を開くことができるのですが
2回目からは例外が発生します。
例外内容:{"破棄されたオブジェクトにアクセスできません。\r\nオブジェクト名 'Form2' です。"}
Form2を毎回newしてから画面をShowすれば、正常に動作しました。

Form3の場合はインスタンスを毎回画面終了時にクリアすれば、正常に動作しました。

ここで質問ですが、始めに1回だけnewしたりインスタンスを設定しただけで動作するには
どのようにしたら良いか教えてください。よろしくお願いします。

**************************************************
<画面1>
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using System.IO;

namespace WindowsApplication3
{
public partial class Form1 : Form
{
private Form2 form2;

public Form1()
{
InitializeComponent();
form2 = new Form2();
}

private void button3_Click(object sender, EventArgs e)
{
try
{
// form2 = new Form2();
form2.Show();
}
catch (Exception ex)
{
}
}

private void button4_Click(object sender, EventArgs e)
{
try
{
Form3 form3 = Form3.GetInstance();
form3.Show();
}
catch (Exception ex)
{
}
}
}
}
**************************************************
<画面2>
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;

namespace WindowsApplication3
{
public partial class Form2 : Form
{
public Form2()
{
InitializeComponent();
}

private void button1_Click(object sender, EventArgs e)
{
Close();
}
}
}
**************************************************
<画面3>
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;

namespace WindowsApplication3
{
public partial class Form3 : Form
{
private static Form3 InstanceForm3 = new Form3();

public Form3()
{
InitializeComponent();
}

// インスタンス取得処理
public static Form3 GetInstance()
{
if (InstanceForm3 == null)
{
InstanceForm3 = new Form3();
}
return InstanceForm3;
}

// 画面が破棄される時に呼び出される処理
protected override void OnClosed(EventArgs e)
{
// インスタンスをクリアする。
InstanceForm3 = null;

base.OnClosed(e);
}

private void button1_Click(object sender, EventArgs e)
{
Close();
}
}
}
■No28864に返信(ぱんだこぱんださんの記事)

> ここで質問ですが、始めに1回だけnewしたりインスタンスを設定しただけで動作するには
> どのようにしたら良いか教えてください。よろしくお願いします。
Closeではなく、Hideにすればいいです。最後にはCloseかDisposeをしましょう。
  • 題名: Re[2]: 子画面の表示方法
  • 著者: ぱんだこぱんだ
  • 日時: 2011/08/10 12:12:41
  • ID: 28869
  • この記事の返信元:
  • この記事への返信:
    • (なし)
  • ツリーを表示
> Closeではなく、Hideにすればいいです。最後にはCloseかDisposeをしましょ
う。

自分でも調べてみたら
フォームのShowとShowDialogでは
Close処理の内容が異なるということで
インスタンスを再利用できたり、できなかったりするんですね。

CloseではなくHideにすれば、インスタンスを再利用できました。
ありがとうございました。
解決済み!

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