none
Form1以外のクラスで、textBox1を使って表示したい。 RRS feed

  • 質問

  • 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);
            }
        }

    2011年2月26日 9:52

回答

  • すみません。ご質問内容を完全に理解しておりませんでした。うまく行かない理由は既に外池さんが解説されている通りで、継承やインスタンスに関する理解が不足しています。
    まず、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
    2011年2月27日 2:36
    モデレータ

すべての返信

  • 外池と申します。

    大変失礼ながら・・・、どのような動作をさせようとしているのか、まず日本語での説明を詳しくお願いします。

    1)画面にフォームをいくつ表示させようとしているのか? ひとつ? ふたつ? 

    2)どのように名前をつけるかは別にして、TextBoxをいくつ表示しようとしているのか? ひとつのフォームにひとつのTextBox? ひとつのフォームに2つのTextBox?

    C#のプログラミングを始めて間もないのだと拝察しますが、お示し頂いたプログラムをざっと見ただけでは、何をしたいのかがわかりません。(お示し頂いたプログラムだと、確かに仰るとおりの動作になるでしょう)

    A) Form1クラスのオブジェクトがひとつ作られることは、わかります。そこに、textBox1が載っていて、そこに仰っているとおりの文字が現われることは、確かです。

    B) 一方で、Form1を継承したMyFormクラスのオブジェクトが作られていますが、作られるだけで表示されるに至っていません。このオブジェクトは上述のA)のオブジェクトとは別物であることはご理解されてますか? 「継承」というのは、どのような動作をするかの「性質」を引き継いでいるのであって、同一のオブジェクトという意味ではありません。表示されていないので、このオブジェクトが載っているtextBox1に対して文字列をAppendTextしても画面に変化は現われません。


    (ホームページを再開しました)
    2011年2月26日 11:11
  • ご質問のタイトルとご質問内容が合っていないように思いますので適切な回答ではないかもしれませんが、textBox1のMultiLineプロパティをtrueにすれば解決しませんか?

     


    ★良い回答には回答済みマークを付けよう! わんくま同盟 MVP - Visual C# http://d.hatena.ne.jp/trapemiya/
    2011年2月26日 11:13
    モデレータ
  • 邪推かもしれませんが、Form1のtextBox1と、MyFormのtextBox1が、同一のインスタンスになることを期待しているのではないかと・・・。

    ここから先は、まったく私の独断による推測ですが、とにかく、テキストを表示をする部品をひとつ用意して、そこへ、プログラムのあちこちから、動作状況やデータを投げて表示させたいのではないかなぁ・・・、と思います。


    (ホームページを再開しました)
    2011年2月26日 11:19
  • 残念ながらtextBox1のMultiLineプロパティをtrueにしてもうまくいきませんでした。

    2011年2月26日 22:46
  • 外池 様

    私が期待していることは、Form1は1つでTextBoxも1つで、いろいろなクラスから1つのTextBoxに、とりあえずは表示したいだけです。

    AさんBさんCさんみんなで1つのホワイトボードを使うイメージです。

    どこをどのように修正すればよろしいでしょうか。

    I.OK

     

     

    2011年2月26日 23:01
  • すみません。ご質問内容を完全に理解しておりませんでした。うまく行かない理由は既に外池さんが解説されている通りで、継承やインスタンスに関する理解が不足しています。
    まず、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
    2011年2月27日 2:36
    モデレータ
  • trapemiya 様

    仰る通り、継承やインスタンスに関する理解が不足しているように思います。
    それとインスタンスの渡し方ですか...

    ご指導の通り実行したら、期待通りの結果が得られました。
    ありがとうございました。

    I.OK

    2011年2月27日 5:14