マルチフォーム アプリケーションがあり、各フォームからMyClass()の 1 つのインスタンスにアクセスできるようにする必要があります。どこに置けばいいですか?
form1 に対して公開してから、他のフォームForm1.MyClassInstanceでユーザーに公開するか、最善の方法は何ですか?
共有したいオブジェクトを静的フィールドとして宣言できます。
public partial class Form1 : Form
{
public static object MyObject;
//...
}
...または静的プロパティとして宣言します。
public partial class Form1 : Form
{
private static object obj;
public static object MyObject
{
get { return obj; } // read-only
}
//...
}
...そして、次のようにアクセスします(他のクラスで):
object obj = Form1.MyObject;
ただし、Form1 のインスタンスが複数ある場合、MyObject は Form1 のすべてのインスタンスで同じになります。
もう 1 つの方法は、Form.Show()を呼び出してForm.Ownerプロパティを設定することです。
public partial class Form1 : Form
{
public object MyObject; // no static required
public Form1()
{
InitializeComponent();
Form2 f2 = new Form2();
f2.Show(this); // this sets the Form.Owner property on f2
}
//...
}
...そして、次のように (Form2 で) アクセスします。
Form1 f1 = (Form1)this.Owner;
object o = f1.MyObject;
ここでの利点は、静的と宣言されていなくても、Form1 のすべてのパブリック メンバーにアクセスできるようになったことです。ただし、Form1 を最小化/閉じると、Form2 も最小化/閉じられます。
static または Form.Owner を使用したくない場合は、Form1 インスタンスへの参照をパラメーターとして渡すこともできます。たとえば、Form2 では、Form1 をパラメーターとして受け取るコンストラクターを記述できます。
public partial class Form2 : Form
{
public Form2(Form1 f1)
{
InitializeComponent();
object o = f1.MyObject; // access MyObject like this
}
//...
}
...そして、次のように Form2 をインスタンス化します (Form1 で):
Form2 f2 = new Form2(this);