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

F0RMはいちいち初期化しないとだめですか?

環境/言語:[VB.NET]
分類:[.NET]

2004/02/18(Wed) 21:22:08 編集(投稿者)
2004/02/18(Wed) 21:22:03 編集(投稿者)

この説明が分かりにくいかもしれませんが、どなたか教えてください。


Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
Dim form1 As New form1
form1.Show()
End Sub

↑のようにするとform1が表示されても初期化されてしまいます。
先に行ったform1の処理を残したいため、初期化を避けたいのですが 2行目を[Dim form1 As form1]とすると、

'System.NullReferenceException' のハンドルされていない例外が Project1.exe で発生しました。
追加情報 : オブジェクト参照がオブジェクト インスタンスに設定されていません。

と言われてしまいます。どうすればよいのでしょうか?どなたか教えてください。
はっきりこの[New]の意味も分かっていません。初期化してくれるのだと思っていますが…。こんなレベルで申し訳ありませんが宜しくお願い致します。
■No2576に返信(ぴろさんの記事)
> 2004/02/18(Wed) 21:22:08 編集(投稿者)
> 2004/02/18(Wed) 21:22:03 編集(投稿者)
>
> この説明が分かりにくいかもしれませんが、どなたか教えてください。
>
>
> Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
> Dim form1 As New form1
> form1.Show()
> End Sub
>
> ↑のようにするとform1が表示されても初期化されてしまいます。
> 先に行ったform1の処理を残したいため、初期化を避けたいのですが 2行目を[Dim form1 As form1]とすると、
> 「
> 'System.NullReferenceException' のハンドルされていない例外が Project1.exe で発生しました。
> 追加情報 : オブジェクト参照がオブジェクト インスタンスに設定されていません。
> 」
> と言われてしまいます。どうすればよいのでしょうか?どなたか教えてください。
> はっきりこの[New]の意味も分かっていません。初期化してくれるのだと思っていますが…。こんなレベルで申し訳ありませんが宜しくお願い致します。

先に作業を行ったform1クラスのインスタンスがある場合、それをまた
form1.Show()
すれば先に行った作業のデータは残っているので問題ないでしょう。
複数のメソッドからform1インスタンスを使用する場合はクラスのメンバとして宣言する必要があります。
たとえば次のようにしてください。(C#ですがご勘弁を・・・)

public class Sample
{
Form1 form1 = new Form1();

public void Method_A()
{
form1.Show();
//何らかの処理をして
form1.Close();
}

public void Methos_B()
{
form1.Show();//この時点でMethos_Aが先に呼び出されていてform1インスタンスにデータが格納されている場合そのまま残っています
}
}

ちなみに"New"というのは、オブジェクトを生成するキーワードです。オブジェクトはIntegerなどの値型ではなく参照型なので使用する前に明示的に作成しておく必要があるのです。

Dim form1 As Form1 = New Form1

というのはForm1クラス型の変数を宣言して、それにForm1クラスのオブジェクトを入れることを意味します。ここでform1はForm1クラスのインスタンスであるといわれるようになります。
> 先に作業を行ったform1クラスのインスタンスがある場合、それをまた
> form1.Show()
> すれば先に行った作業のデータは残っているので問題ないでしょう。

Closeしてしまうと新規にインスタンスを作成しないと再度Showはできませんので、
何度も表示しないといけないのであれば、CloseせずにHideするように作りこむ必要があるでしょう。

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