トップ回答者
Form1以外のクラスで、textBox1を使って表示したい。

質問
-
C#で 任意のクラスでtextBox1を使って表示したいのですが、下記プログラムで
Form1 0/MyForm 0/Form1 1/MyForm 1/... (/は改行の代用表現です)を期待しましたが、
結果は Form1 0/Form1 1/... でした。
何が悪いのが、ご指導ください。お願いします。
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}private void button1_Click(object sender, EventArgs e)
{
MyForm myfrm = new MyForm();
for (int i = 0; i < 5; i++)
{
textBox1.AppendText("Form1 " + i.ToString() + "\r\n");
myfrm.Display(i.ToString() + "\r\n");
}
}private void button2_Click(object sender, EventArgs e)
{
textBox1.Clear();
}
}public class MyForm : Form1
{
public void Display(string s)
{
textBox1.AppendText("MyForm " + s);
}
}
回答
-
すみません。ご質問内容を完全に理解しておりませんでした。うまく行かない理由は既に外池さんが解説されている通りで、継承やインスタンスに関する理解が不足しています。
まず、public class MyForm : Form1と継承されていますが、継承とは継承元のクラスの定義を利用して新しいクラスを定義することです。つまり、MyFormとForm1は完全に別のクラスです。したがって、MyForm myfrm = new MyForm();
とした場合、myfrmのインスタンスはForm1のインスタンスとは別物になります。MyFormとForm1は継承関係にありますが、インスタンスの関係でみれば全くの他人同士です。例えば、Form1 frm1 = new Form1();
Form1 frm2 = new Form1();
Form1 frm3 = new Form1();以上のfrm1, frm2, frm3は全て同じForm1クラスから生成したインスタンスですが、お互いがお互いのことを知らず、無関係な他人同士です。継承どころではない同じクラスからインスタンスを生成してもこのようになります。つまり、クラスの定義(同じクラスだろうが、継承関係にあるクラスだろうが)と、そこから生成されるインスタンスはそれぞれが独立して無関係なのです。話を元に戻せば、
MyForm myfrm = new MyForm();
は、Form1の機能をアドインしたインスタンスを作成いているのであり、Form1のインスタンスとは完全に別物です。
よって、今回のTextBoxに表示されない件を解決するには、 myfrmにForm1のインスタンスを渡し、そのインスタンスにあるTextBoxにDisplayすればよいことになります。
myfrm.Display(this, i.ToString() + "\r\n"); //thisは自分のインスタンスを示します。つまり、Form1のインスタンスです。
として、
public void Display(Form1 form, string s)
{
form.textBox1.AppendText("MyForm " + s);
}あるいは、Form1のテキストボックスのインスタンスを渡しても良いでしょう。
myfrm.Display(textBox1, i.ToString() + "\r\n");
として、
public void Display(TextBox textBox, string s)
{
textBox.AppendText("MyForm " + s);
}さて、以上をご理解いただければ、Form1とMyFormとの間に継承関係が必要ないこともご理解いただけるのではないかと思います。
★良い回答には回答済みマークを付けよう! わんくま同盟 MVP - Visual C# http://d.hatena.ne.jp/trapemiya/- 回答としてマーク I.OK 2011年2月27日 5:13
すべての返信
-
外池と申します。
大変失礼ながら・・・、どのような動作をさせようとしているのか、まず日本語での説明を詳しくお願いします。
1)画面にフォームをいくつ表示させようとしているのか? ひとつ? ふたつ?
2)どのように名前をつけるかは別にして、TextBoxをいくつ表示しようとしているのか? ひとつのフォームにひとつのTextBox? ひとつのフォームに2つのTextBox?
C#のプログラミングを始めて間もないのだと拝察しますが、お示し頂いたプログラムをざっと見ただけでは、何をしたいのかがわかりません。(お示し頂いたプログラムだと、確かに仰るとおりの動作になるでしょう)
A) Form1クラスのオブジェクトがひとつ作られることは、わかります。そこに、textBox1が載っていて、そこに仰っているとおりの文字が現われることは、確かです。
B) 一方で、Form1を継承したMyFormクラスのオブジェクトが作られていますが、作られるだけで表示されるに至っていません。このオブジェクトは上述のA)のオブジェクトとは別物であることはご理解されてますか? 「継承」というのは、どのような動作をするかの「性質」を引き継いでいるのであって、同一のオブジェクトという意味ではありません。表示されていないので、このオブジェクトが載っているtextBox1に対して文字列をAppendTextしても画面に変化は現われません。
(ホームページを再開しました) -
すみません。ご質問内容を完全に理解しておりませんでした。うまく行かない理由は既に外池さんが解説されている通りで、継承やインスタンスに関する理解が不足しています。
まず、public class MyForm : Form1と継承されていますが、継承とは継承元のクラスの定義を利用して新しいクラスを定義することです。つまり、MyFormとForm1は完全に別のクラスです。したがって、MyForm myfrm = new MyForm();
とした場合、myfrmのインスタンスはForm1のインスタンスとは別物になります。MyFormとForm1は継承関係にありますが、インスタンスの関係でみれば全くの他人同士です。例えば、Form1 frm1 = new Form1();
Form1 frm2 = new Form1();
Form1 frm3 = new Form1();以上のfrm1, frm2, frm3は全て同じForm1クラスから生成したインスタンスですが、お互いがお互いのことを知らず、無関係な他人同士です。継承どころではない同じクラスからインスタンスを生成してもこのようになります。つまり、クラスの定義(同じクラスだろうが、継承関係にあるクラスだろうが)と、そこから生成されるインスタンスはそれぞれが独立して無関係なのです。話を元に戻せば、
MyForm myfrm = new MyForm();
は、Form1の機能をアドインしたインスタンスを作成いているのであり、Form1のインスタンスとは完全に別物です。
よって、今回のTextBoxに表示されない件を解決するには、 myfrmにForm1のインスタンスを渡し、そのインスタンスにあるTextBoxにDisplayすればよいことになります。
myfrm.Display(this, i.ToString() + "\r\n"); //thisは自分のインスタンスを示します。つまり、Form1のインスタンスです。
として、
public void Display(Form1 form, string s)
{
form.textBox1.AppendText("MyForm " + s);
}あるいは、Form1のテキストボックスのインスタンスを渡しても良いでしょう。
myfrm.Display(textBox1, i.ToString() + "\r\n");
として、
public void Display(TextBox textBox, string s)
{
textBox.AppendText("MyForm " + s);
}さて、以上をご理解いただければ、Form1とMyFormとの間に継承関係が必要ないこともご理解いただけるのではないかと思います。
★良い回答には回答済みマークを付けよう! わんくま同盟 MVP - Visual C# http://d.hatena.ne.jp/trapemiya/- 回答としてマーク I.OK 2011年2月27日 5:13