- 題名: インスタンスへのポインタ
- 日時: 2012/04/03 9:54:10
- ID: 30204
- この記事の返信元:
- (なし)
- この記事への返信:
- [30205] Re[1]: インスタンスへのポインタ2012/04/03 10:32:05
- [30213] Re[1]: インスタンスへのポインタ2012/04/03 22:33:02
- ツリーを表示
■No30217に返信(siroさんの記事)
> 元親(Form1)、今親(Form2)ともインスタンス"A" への参照は保持している
> ようなのですが、親は一人でなければいけない理由とは
> 何なのでしょうか・・・
この場合、Form1.A と Form2.A は同一インスタンスへの参照を指します。
参照先のコントロールは一つなので、親も当然一つです。
同じインスタンスなのに、変数の宣言場所によって、
A.Parent や A.FindForm() の結果が変化してしまっては不自然ですよね。
Form1 と Form2 の両方で所有したいなら、shu さんが回答されたように、
インスタンスも 2 つ用意する必要があります。
あるいは、一つのインスタンスを 2 つのフォームで交互に使いまわすなら、
Azulean さんが書かれたように、所有権の移設が必要です。
>>もしも、一つのコントロールを親を変えて使い回したいなら、Close や Dispose する前に Controls.Remove を使って取り外してください。
> 了解しました。
たとえば下記では、Form2 に Controls.Add されている textBox1 を
Form1.textBox1 という変数にもセットしています。
TextBox textBox1 = null;
private void button1_Click(object sender, EventArgs e)
{
using (Form2 form2 = new Form2())
{
this.textBox1 = (TextBox)form2.Controls.Find("textBox1", true)[0];
this.textBox1.TextChanged += delegate { this.Text = this.textBox1.Text; };
form2.ShowDialog();
}
// this.Controls.Add(this.textBox1); // これはできない
this.textBox1 = null;
}
最後の Controls.Add の行を実行すると、ObjectDisposedException が発生します。
これは ShowDialog した form2 が閉じられたときに、その上にある textBox1 も
一緒に破棄されてしまうからです。
Form2 終了時に、textBox が破棄されないようにしたいのであれば、
using (Form2 form2 = new Form2())
{
this.textBox1 = (TextBox)form2.Controls.Find("textBox1", true)[0];
this.textBox1.TextChanged += delegate { this.Text = this.textBox1.Text; };
form2.FormClosing += delegate { form2.Controls.Remove(this.textBox1); };
form2.ShowDialog();
}
のように、終了前に Remove で取り外す必要がありますし、あるいは、
Form2 終了時に、textBox の所有権を Form1 に移したいのであれば、
using (Form2 form2 = new Form2())
{
this.textBox1 = (TextBox)form2.Controls.Find("textBox1", true)[0];
this.textBox1.TextChanged += delegate { this.Text = this.textBox1.Text; };
form2.FormClosed += delegate { Controls.Add(this.textBox1); };
form2.ShowDialog();
}
のように、コンテナの変更(Controls の 再Add)が必要となります。
>>> B Form1からForm2のインスタンスを生成し、この際に参照渡し(ref)にて
>>> Form2に"A"インスタンスを渡す
インスタンスを渡すだけなら、値渡しで十分ではないでしょうか。
fm = new Form2(this.A); // 「public Form1(Panel a)」を呼び出す。
分類:[.NET]
お世話になります。
refでの引数渡しの仕様について教えて下さい。
以下のような操作をしました。
@ Form1にてPanel継承クラスの"A"インスタンス生成
A Form1.Contorls.Add(A)
B Form1からForm2のインスタンスを生成し、この際に参照渡し(ref)にて
Form2に"A"インスタンスを渡す
C Form2.Control.Add(A)
D Form2.Close()
BorCの辺りで、Form1に表示されていた"A"インスタンスは表示が消えて
CにてForm2に"A"インスタンスが表示されます。
Dで"A"へのポインタはForm1からもForm2からも消失するようです。
質問1
B、Cの時点ではForm1, Form2とも"A"インスタンスへのホ゜インタを持っていると
認識しておりましたが、"A"インスタンスの表示がForm1上から消えるのは
何故でしょうか?(Contorlクラスの排他制御仕様?)
質問2
Form2からの"A"インスタンスへのポインタはForm2.Close()の時点で
消滅しても良いのですが、
Form1のホ゜インタは失いたくありません。可能でしょうか?
以上宜しく御願いします。