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

フォーム間の配列取得

環境/言語:[WindowsXP Microsoft Visual Studio 2005  C#]
分類:[.NET]

はじめまして。初心者プログラマーです。

大学の研究でC#を使って数値流体解析を行っています。
Form1で計算した値を、Form2でグラフ化して表示しようと思うのですが、配列を取得方法がよく分かりません。

別のフォームのデータを取得、設定する
http://dobon.net/vb/dotnet/form/accessanotherformdata.html

を参考にいろいろ試しているのですが、各要素の値が取得できません。


本当に申し訳ないのですが、どなたか教えていただけないでしょうか。
■No23047に返信(魔界の弱小騎士さんの記事)

どの箇所で行き詰っているのか教えていただけますか?配列データを公開するためのプロパティの定義の仕方が分からないということでしょうか?それとも、Form1のインスタンスをForm2から取得する方法が分からないということでしょうか?

具体的にどのようなコードを書かれたのかを教えていただければ、非常に助かります。
返信ありがとうございます。配列データを公開するためのプロパティの定義がたぶん合ってないのだと思います。

Form2でForm1のインスタンスを取得するコードが、

private Form1 form1Instance;

private double[] o = new double[100];

private void button1_Click(object sender, EventArgs e)
{
this.form1Instance = new Form1();
//o = this.form1Instance.gyouretsu;
//o[5] = this.form1Instance.gyouretsu[5];
 
 o = this.form1Instance.k;
}


フォーム1は
public double[] gyouretsu = new double[100];

public double[] k
{
get
{
return gyouretsu;
}
set
{
gyouretsu = value;
}
}


すいませんが、お願いします。
魔界の弱小騎士さん

ここにあるソースでは、
From1のgyouretsu[]に対し値が設定されていませんので、
取得できていないように思われるだけではないでしょうか?

From1側で値を設定してから、
参照されてはいかがでしょう。
最初は難しいですよね。自分がそうでした。
正直良いつくりではないですが、 魔界の弱小騎士のソースの形を崩さないようにして、サンプルを作成してみました。各フォームにはボタンを1つ置いてます。

■■■■Form1■■■■
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}

public double[] gyouretsu = new double[100];

public double[] k
{
get
{
return gyouretsu;
}
set
{
gyouretsu = value;
}
}

private void button1_Click(object sender, EventArgs e)
{
Form2 form2 = new Form2();

//デバッグのために暫定的な値をセット
this.gyouretsu[0] = 2.0D;

//作成したForm2のインスタンスのプロパティに自分自身(Form1自身)
//を渡す。こうしておくことで、Form2の中でForm1を操作できる。
form2.Form1 = this;

//Form2の表示
form2.ShowDialog();
}

}

■■■■Form2■■■■
public partial class Form2 : Form
{
public Form2()
{
InitializeComponent();
}

private double[] o = new double[100];
private Form1 form1Instance;

private void button1_Click(object sender, EventArgs e)
{
//これが呼び出されるときは、すでにform1Instanceの中にはこの
//Form2の呼び元であるForm1自身が入っているので、Form1が公開しているkというプロパティを
//通して、Form1のgyouretsu変数にアクセスできる。
o = this.form1Instance.k;
}

//Form2が、自分自身の持っているform1InstanceというForm1型の変数に対して
//Form1がForm1自身のインスタンスをセットするためのプロパティ。
//セットされるタイミングは、Form1がForm2のインスタンスを作成してから、
//表示するまでの間にform2.Form1 = this;という記述でセットしている。
public Form1 Form1
{
set
{
this.form1Instance = value;
}
}
}


大事なのは、何らかの手段を利用して、Form2にForm1で作成した配列を伝えることです。上記のサンプルではForm2にForm1が自分自身をまるごとプロパティを通じて渡していますが、利用したいのが配列だけであれば、Form2側で配列のプロパティを公開してあげて、Form1がそこにセットしてあげるだけでもいいです。


魔界の弱小騎士さんのソースで一箇所確実にまずいといえるのは、この記述です。

this.form1Instance = new Form1();

これはForm2の中でForm1の"まだ誰も知らない新しい"インスタンスを作っています。このインスタンスと、魔界の弱小騎士さんがgyouretsuという変数に値をセットしたForm1のインスタンスは違うものになります。
きいよさん
お忙しい中、チェックしてくれてありがとうございます。
値は入れてましたが、長くなるのでそのソースは省いてUPしてしまいました。
また弱小騎士のご指導お願いします。
  • 題名: Re[6]: フォーム間の配列取得
  • 著者: 魔界の弱小騎士
  • 日時: 2008/09/26 0:27:32
  • ID: 23060
  • この記事の返信元:
  • この記事への返信:
    • (なし)
  • ツリーを表示
紅の豚さん
助かります。今日ゼミだったのですが、理論的にもプログラム的にも進んでおらず、帰り道弱気になっていました。今こうやって顔も知らない紅の豚さんに親切に教えて貰えてすごく感謝しています。(泣)

家のパソコンはC#が動かないのでとりあえずプリントアウトして、じっくり学ばせて頂きます。本当ありがとうございます。また回りましたら、解決済みにさせて頂きます。

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