DOBON.NET DOBON.NETプログラミング掲示板過去ログ

異なるフォームで同一のオブジェクトを参照したい

分類:[全般]

再度,皆さまのお力をお借りしたく登場しました.
CINEMAパラダイスです.

今回は前回の質問の延長上とも言えるのですが,
異なるフォームで同一のオブジェクトを参照したいと思っています.

サンプルコードを示しておきます.

----------- Variable.cs ------------
class Variable
{
public int teacher; //先生の数
public int student; //生徒の数

public Variable()
{
teacher = 0;
student = 0;
}
}
----------------------------------------------------

----------- Form1.cs(入力フォーム) ------------
namespace 学校
{
public class Form1 : System.Windows.Forms.Form
{
(中略)

private void Form1_Load(object sender, System.EventArgs e)
{
Variable var = new Variable();

//テキストボックスの値はファイル読み込みにより入力されている.
var.teacher = textBox1.Text;
var.student = textBox2.Text;
(中略)
}
}
}
------------------------------------------------------

----------- Form2.cs(操作用フォーム) ------------
namespace 学校
{
public class Form2 : System.Windows.Forms.Form
{
(中略)

private void Form2_Load(object sender, System.EventArgs e)
{
int spt;

Variable var = new Variable();
        ↑
      (Form1で生成したインスタンスとは違うオブジェクトを参照)
      (記述方法がわかりません)

spt = var.student/var.teacher;
(中略)
}
}
}
------------------------------------------------------


同一フォームでなら,同一のオブジェクトを参照させることができるのですが,
異なるフォームで同一のオブジェクトを参照させるインスタンスを生成できずに
困っています.

皆さま,どうぞよろしくお願いします.
> ----------- Form1.cs(入力フォーム) ------------
> namespace 学校
> {
> public class Form1 : System.Windows.Forms.Form
> {
private Variable var;
のようにprivateスコープでvarを宣言します。

> (中略)
>
> private void Form1_Load(object sender, System.EventArgs e)
> {
> Variable var = new Variable();
この1行は
var = new Variable();
に変更します。

>
> //テキストボックスの値はファイル読み込みにより入力されている.
> var.teacher = textBox1.Text;
> var.student = textBox2.Text;
> (中略)
> }
> }

Form1のどこかでForm2を表示しているコードがあると思いますが、
Form2 form2 = new Form2();
form2.Variable = var;
form2.Show()
のようにしてform2のVariableプロパティにvarを設定してやります。

> }
> ------------------------------------------------------
>
> ----------- Form2.cs(操作用フォーム) ------------
> namespace 学校
> {
> public class Form2 : System.Windows.Forms.Form
> {
> (中略)

publicなVariable型のプロパティを用意します。
仮にそのまんまの名前でVariableプロパティとします。

> private void Form2_Load(object sender, System.EventArgs e)
> {
> int spt;
>
> Variable var = new Variable();
>         ↑
>       (Form1で生成したインスタンスとは違うオブジェクトを参照)
>       (記述方法がわかりません)

form2をShowする前にプロパティVariableにform1のvarを設定してあるとして、
このインスタンスは不要です。

> spt = var.student/var.teacher;

spt = this.Variable.student / this.Variable.teacher;
のように自分のプロパティの値を使います。
よねKENさんへ

今回もわかりやすい説明をして頂いて,ありがとうございます.
ただ,私の知識があまりにもないことから,
よねKENさんの解説でわからない部分があります.

>>----------- Form2.cs(操作用フォーム) ------------
>>namespace 学校
>>{
>> public class Form2 : System.Windows.Forms.Form
>> {
>> (中略)
>
> publicなVariable型のプロパティを用意します。
> 仮にそのまんまの名前でVariableプロパティとします。
     ↑
この部分で,publicなVariable型のプロパティを用意すると明記してあるのですが,
私の知識ではどのようにして良いのやら,わかりません.申し訳ありません・・・.
最初,インスタンスを生成するような形で良いのかな?と思い,
public Variable Variable;
と書いたのですが,やはり違うようですね(^^;
他にも,public Windows.・・・などなど試したのですが
どうにもこうにも上手くいかないです.

こちらの勉強不足でお手間をとらせてしまうので非常に心苦しいのですが,
この部分に関して,もう少し詳しくご説明をお願いできないでしょうか?
よろしくお願いします.
> >>----------- Form2.cs(操作用フォーム) ------------
> >>namespace 学校
> >>{
> >> public class Form2 : System.Windows.Forms.Form
> >> {
> >> (中略)
>>
>>publicなVariable型のプロパティを用意します。
>>仮にそのまんまの名前でVariableプロパティとします。
>      ↑
> この部分で,publicなVariable型のプロパティを用意すると明記してあるのですが,
> 私の知識ではどのようにして良いのやら,わかりません.申し訳ありません・・・.

C#でのプロパティの定義方法は下記のURLをご覧下さい。(長いので途中で改行してます)
http://www.microsoft.com/japan/msdn/library/default.asp?
url=/japan/msdn/library/ja/cpguide/html/cpconpropertiesoverview.asp

> 最初,インスタンスを生成するような形で良いのかな?と思い,
> public Variable Variable;
> と書いたのですが,やはり違うようですね(^^;

この場合、publicなフィールドになり、プロパティではありませんが、
プロパティを定義した場合と同様の動作になるはずなので、
動作上は問題ないはずですが、うまくいきませんでした?
よねKENさんへ

早速のお返事ありがとうございます.

> C#でのプロパティの定義方法は下記のURLをご覧下さい。(長いので途中で改行してます)
> http://www.microsoft.com/japan/msdn/library/default.asp?
> url=/japan/msdn/library/ja/cpguide/html/cpconpropertiesoverview.asp

URLを教えてくださり感謝します.早速,勉強します.

>>最初,インスタンスを生成するような形で良いのかな?と思い,
>>public Variable Variable;
>>と書いたのですが,やはり違うようですね(^^;
>
> この場合、publicなフィールドになり、プロパティではありませんが、
> プロパティを定義した場合と同様の動作になるはずなので、
> 動作上は問題ないはずですが、うまくいきませんでした?

私が書いたような形で実行すると,以下のようなエラーがでました.
--------------------------------------------------------
ユーザー補助に一貫性がありません.
フィールドの型'学校.Variable'のユーザー補助は
フィールド'学校.Form2.Variable'よりも低く設定されています.
--------------------------------------------------------

残念ながら,私にはこのエラーを直す方法を見出せそうにありません.
色々と試してみたのですが,どうしても直らないです.


ところで,私が構築しているプログラムではフォームが4つあり,
まずForm1で,Variable.csでコンストラクタされている変数の値を更新し
Form1で更新した値を用いてForm2上で操作を行い,更に値を更新し,
Form2で更新した値を用いてForm3上で操作を行い,値を更新する.
といったようにプログラムを構築したいと考えています.

そこで考えたのが,同一オブジェクトを参照し,
データの更新に対応できるように考えたわけなんですが・・・.
(この考え方自体がおかしいのかもしれません)

話しがだいぶ逸れてしまいましたが,
プロパティを定義した方法で行わなければ,
今後,行き詰まるのではないかなと思いますが,どうなんでしょうか?
エラーメッセージで原因がわかりました。

> >>最初,インスタンスを生成するような形で良いのかな?と思い,
> >>public Variable Variable;
> >>と書いたのですが,やはり違うようですね(^^;

対処方法としては、2通り考えられます。

(その1)
Form2.csの下記の部分を
public Variable Variable;

internal Variable Variable;
のように変更する。

(その2)
Form2.csの
public Variable Variable;
の部分はそのままにして、Variable.csファイルの下記の部分を修正する。
class Variable {

public class Variable {

> 私が書いたような形で実行すると,以下のようなエラーがでました.
> --------------------------------------------------------
> ユーザー補助に一貫性がありません.
> フィールドの型'学校.Variable'のユーザー補助は
> フィールド'学校.Form2.Variable'よりも低く設定されています.
> --------------------------------------------------------

このエラーメッセージは英語版から日本語版に翻訳するときの誤訳が含まれています。

「ユーザ補助」となっているところは英語では「Accessiblity」で、
正しい訳はそのまま「アクセシビリティ」です。
#Accessiblityには「ユーザ補助」の意味もあるのですが、
#この文中で使われている意味でのAccessiblityの訳はアクセシビリティそのままが正しいです。

で、アクセシビリティというのはpublic、private、internalなどのアクセス修飾子によって、
メンバ(メソッド、フィールド、プロパティなど)に対して、どのクラスからアクセスできるかを制御するものです。

アクセシビリティはオブジェクト指向において最重要概念の一つなので、
この機会に習得されるのがよいと思います。

文章中に専門用語が多いので少しわかりにくいかもしれませんが、
下記のURL以下の節に一通り目を通してみてください。(長いので改行してあります)
http://www.microsoft.com/japan/msdn/library/default.asp?
url=/japan/msdn/library/ja/csspec/html/vclrfcsharpspec_3_5.asp
よねKENさんへ

昨日はほとんどPCの前に座ることが出来ず,お礼が大変遅くなりました.

色々と詳しく教えてくださって,本当にありがとうございます.
前回も,今回も簡潔明快に教えてくださったことにとても感謝しています.

私はもっとC♯の勉強に励みたいと思います.
あまりにも未熟すぎますので(;´Д`A ```
ありがとうございました.
解決済み!

DOBON.NET | プログラミング道 | プログラミング掲示板