解決済みの質問
こんにちわ。
C#で以下のようなことを実現しようとしています。
フォームA
・コンボボックスを選択⇒SelectedIndex値を変数Pへ
・フォームBを開く
フォームB
・変数Pを読み込み処理
1.ここで、フォームAでSelectedIndexの値は変数Pに入っているのですが、
その値をフォームBで呼び出す方法がわかりません。
以下のコードでは、「System.Windows.Forms.FormにPの定義がありません」となってしまいます。
2.変数Pはpublicで宣言しているのですが、
それだけで全てのフォームから呼び出せる変数となるわけではないのでしょうか?
ちなみに以下のようなコードにしてあります。
*********フォームA*********
public int P;
private void btn1_click(object sender, System.EventArgs e)
{
P = comboBox.SelectedIndex;
F_B f1 = new F_B();
f1.ShowDialog();
}
*********フォームB*********
private void F_B_Load(object sender, System.EventArgs e)
{
switch (Owner.P)
{
case 0:
・・・・
case 1:
・・・・
}
}
どなたかアドバイスをお願いいたします。
投稿日時 - 2004-10-21 15:01:26
整理しましょ。ここで話題なってるのは、次の2通りです。
1.親子関係を利用して他フォームの値を取得する。(Ownerプロパティ)
2.親フォームの参照を子フォームに渡すことにより、他フォームの値を取得する。(これは私が書いているものです。私が違う方式を書いて混乱されたかもしれません。ごめんなさい)
この他、インターフェースを利用しても実現できますが(一番汎用性が高いがコード量も一番多い)、おいおい勉強していきましょう。
とりあえず、以下のページがわかりやすいと思います。
キャストとは型を変換して、変換した型固有の操作を可能にするものです。う~ん、わかりやすく言うと、人間というオブジェクトがあった時(実は女性とします)、男性にキャストしようとすると失敗します。実は女性だからです。で、女性にキャストすると成功します。実は女性だからです。女性にキャストできたので、女性が持っている固有の特徴が利用できるようになります。女性.子供を生む みたいな。
続いてインスタンス。クラスを記述するとは設計図を描いているようなものです。例えば車のクラスを記述することは、車の設計図を書いているに他なりません。車の設計図を書いたからって、ドライブできませんよね。設計図から実際に車を作る必要があります。こうして実際に作った車がインスタンスです。
設計図(クラス)があれば車(インスタンス)はいくらでも作れます。
Car car1 = new Car();
Car car2 = new Car();
Car car3 = new Car();
. .
. .
. .
オブジェクト指向でプログラミングするとは、設計図(クラス)を用意しておき、必要な時に実体化(インスタンス)させて働かすようなイメージです。
参考URL:http://dobon.net/vb/dotnet/form/accessanotherformdata.html
投稿日時 - 2004-10-22 10:43:41
お礼
お礼をせず、放置してしまい申し訳ありません。
プログラムから離れなければならず、
しばらくの間、何も試すことができませんでした。
結局、プロパティをset・getすることで、データを渡す方法により、解決いたしました。
参考URLもありがとうございました。
クラス、インスタンスを本で読み、図解されているようなことからは、なんとなく理解できた気になっていましたが、
実際にコードを書いてみようとすると、何も理解できていなかったという事実がわかりました。
ご指摘、ありがとうございました。
投稿日時 - 2004-12-23 15:41:01
3人が「このQ&Aが役に立った」と投票しています
#3:
>> switch ( ((フォームA)Owner).P ) {
> この部分を実行させていただきましたところ、
> ビルドの部分で問題は起きませんでした。
> ところが、実行させてみると、値がnullのようで、例外エラーが出まして、
> 「オブジェクト参照がオブジェクト インスタンスに設定されていません。」とエラーになってしまいました。
A から B を開くとき、
F_B f1 = new F_B();
f1.ShowDialog(this);
このthisを忘れていませんか?
投稿日時 - 2004-10-22 08:05:00
お礼
お礼をせず、放置してしまい申し訳ありません。
プログラムから離れなければならず、
しばらくの間、何も試すことができませんでした。
結局、プロパティをset・getすることで、データを渡す方法により、解決いたしました。
ご指摘、ありがとうございました。
投稿日時 - 2004-12-23 15:38:11
あっ、キャストが話題になってたんで、キャストのコード書きましたが、簡単にはこうでもいいですよ。
フォームA(F_A)で、
F_B f1 = new F_B(this);
フォームB(F_B)では、
F_A fa;
コンストラクタで
public F_B(F_A f)
{
fa = f;
}
あとは、
switch (fa.P)
{
case 0:
・・・・
case 1:
・・・・
投稿日時 - 2004-10-21 23:19:17
お礼
ありがとうございます。
こちらのコードを僕なりに実行してみました。
まず、フォームAの「new F_B(this);」の部分で、引数を指定できるメソッド'F_A'のオーバーロードはありません。と怒られました。
そこで、「this」は取りました。
次にフォームBにコードを記述しようと思い、
InitializeComponent();の下に「F_A fa;」を、
その下「}」の直下にコンストラクタ部分を記述し実行しますと、
「型または名前空間に'fa'が見つかりませんでした。・・・」・・・
と全ての'fa'に関してのエラーが3種類出ました。
faというのはフォーム型の変数なんですよね?
それをコンストラクタで、F_Aだとわからせて・・・
その中の変数Pを使うというコードなのですよね。きっと。
うーーむ。何から解決して良いのかわけわからなくなってきました。
投稿日時 - 2004-10-22 01:04:47
簡単に実現するなら、
F_B f1 = new F_B(this);
フォームBでは、
Form f;
コンストラクタで
public F_B(Form f)
{
this.f = f;
}
あとは、
switch (((フォームA)f).P)
{
case 0:
・・・・
case 1:
・・・・
みたいな感じで。フォームBにフォームAの参照が渡らなければ、Pをどこから呼び出すのかわかりません。
例えば鈴木さんを呼び出すことは禁止されていない(public)とき、どこに鈴木さんがいるのかわからなければ(フォームAへの参照)呼び出せないのと同じです。
この場合、フォームBへはFormオブジェクトとしてフォームAが渡されています。フォームBではあくまでフォーム型の変数を受け取ったにすぎません。なんだかわかんないけどこれはフォームなんだというレベルです。だから実際に使えるようにするには、フォームAにキャストする必要があります。例えるならなんだかわかんないけど食べ物をもらった。これはよくみたらラーメンだった(キャスト)。じゃぁ、ゆでて食べよう(ラーメンのメソッドが使えるようになる)。
みたいな感じです。わかるかなぁ(^^;
投稿日時 - 2004-10-21 21:57:33
お礼
hppさん、回答ありがとうございます。
先日も助けていただき、感謝です。
ふむふむ。
説明を読むと、まずフォーム型の変数というものがあって、それをキャストするとは、その変数を実際に使えるよう(これがインスタンス?)にするということでよろしいでしょうか?
コードまで教えていただきましたが、それをどこに記述してよいものかよく理解しておりません。^^;
投稿日時 - 2004-10-22 00:47:20
> キャストというのは、「型変換」のキャストですよね。
YES.
> 僕が参考にしているテキストでは、そのような例もなく・・・
もう一冊、ちゃんとしたのをお買いなさい。
switch ( ((フォームA)Owner).P ) {
...
}
投稿日時 - 2004-10-21 15:58:01
お礼
再び回答ありがとうございます。
>もう一冊、ちゃんとしたのをお買いなさい。
はい。もうちょっと根本的なことから勉強しなおさないといけないと思っていますので、書籍も検討いたします。
プログラムは初めてなので、どうしても簡単な入門書から手を付け始めてしまいます。
epistemeさんのお勧めがありましたら、助言を頂けたら幸いです。
> switch ( ((フォームA)Owner).P ) {
この部分を実行させていただきましたところ、
ビルドの部分で問題は起きませんでした。
ところが、実行させてみると、値がnullのようで、例外エラーが出まして、
「オブジェクト参照がオブジェクト インスタンスに設定されていません。」とエラーになってしまいました。
やはりどこか理解の仕方を間違っているのだと思います。
もうちょっと追跡してみます。
投稿日時 - 2004-10-22 00:40:26
こんにちは。
Owner.P
では、コンパイル時にPがわからないのでエラーですよ。
OwnerをAにするか、キャストするか、型を指定するか・・・、
ですね。
(^^ゞ
投稿日時 - 2004-10-21 15:30:48
お礼
回答ありがとうございます。
Ownerと書くことで、親フォームという認識は間違いなのですね。
OwnerをAにするか、キャストするか、型を指定するか・・・
とは、具体的にどのようにやるのでしょうか?
フォームAのクラス名をOwnerの変わりに記述するのでしょうか?
何度も申し訳ありませんが回答を頂ければ幸いです。
投稿日時 - 2004-10-21 15:49:15
OKWaveのオススメ
おすすめリンク