こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

Form1で宣言したインスタンスをForm2で使う

開発環境はMicrofoft visual stdio 2005 で開発言語はC#を使い、Windousアプリケーションでプログラミングしているのですが、あるフォームで宣言したインスタンスを別のフォームで使う方法がわかりません。具体的にソースコードで説明すると
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;

namespace tesuto
{
  public partial class Form1 : Form
  {
    class Car
    {
      public int a;
    }

    public void Form1_Load(object sender, EventArgs e)
    {
      Car bike = new Car();//ここで宣言したインスタンスを
      bike.a = 10;
      Form2 fm2 = new Form2(this);
      fm2.Show();
    }
  }

  public partial class Form2 : Form
  {
    public void Form2_Load(object sender, EventArgs e)
    {
      int b;

      b = bike.a;//ここでこのように使いたい
    }
  }
}
ということです。
前も似たような質問をさせていただき、たくさんの回答をいただいたにも関わらず自分のプログラム能力が低く、理解できませんでした><。なのでよければ、回答は言葉だけではなくこの上のソースコードを基にして(コピペ貼り付けなどで)、すこしでいいですのでソースコードを書いていただけませんでしょうか。
また、プログラミングを初めてまだ間もないので、すこし初心者向けでお願いします。
質問する側なのに色々要求をして申し訳ないのですが、もし御面倒でなければ御回答をお待ちしております。
よろしくおねがいします。 

投稿日時 - 2008-05-29 12:58:26

QNo.4059464

すぐに回答ほしいです

質問者が選んだベストアンサー

bikeのインスタンスが ローカル変数なのでForm_Loadイベントの中でしか生存しません
つまり Form_Loadイベントが終了した時点で消滅します

次に Carクラスのアクセス指定子が記述されていないので CarクラスはprivateになりForm1クラスからしかアクセス出来ません

やるとすれば Carクラスのアクセス指定子をpublicにします
bikeインスタンスを フォームのpublicフィールドとして定義します

  public partial class Form1 : Form
  {
    // publicを追加
    public class Car
    {
      public int a;
    }

    // フォームのフィールドとして宣言
    public Car bike = new Car();
    public void Form1_Load(object sender, EventArgs e)
    {
      // ここで宣言したのでは他からアクセス出来ない
      // Car bike = new Car();//ここで宣言したインスタンスを
      bike.a = 10;
      // Form2の newをオーバーライドしていないと
      // Form2(this)はコンパイルエラーになる
      // Form2 fm2 = new Form2(this);
      // fm2.Show();
      Form2 fm2 = New Form2();
      fm2.Show( this );
      // ShowでOwnerを指定する
    }
  }

  public partial class Form2 : Form
  {
    public void Form2_Load(object sender, EventArgs e)
    {
      int b;

      // インスタンスbikeはForm2クラスに存在しないので
      // 下記のような記述は不可
      // b = bike.a;//ここでこのように使いたい

      // Ownerプロパティをキャストして Form1のインスタンスを取得
      Form1 fm1 = (Form1)(this.Owner);
      if ( fm1 != null ) {
        // Form1のインスタンス経由でアクセスする
        b = fm1.bike.a;
      }
    }
  }

投稿日時 - 2008-05-30 09:43:32

お礼

ほんとだ!できました!
これができなくて本当に困っていたんです><。
親切でわかりやすい回答をありがうございました。

投稿日時 - 2008-05-30 13:20:43

このQ&Aは役に立ちましたか?

0人が「このQ&Aが役に立った」と投票しています

回答(1)

あなたにオススメの質問