C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[3]: Form2の設定値をForm1で使う


(過去ログ 61 を表示中)

[トピック内 11 記事 (1 - 11 表示)]  << 0 >>

■35345 / inTopicNo.1)  Form2の設定値をForm1で使う
  
□投稿者/ ao (1回)-(2009/04/26(Sun) 18:18:38)

分類:[.NET 全般] 

===  環境  ===
OS   : WinVista Home Basic
言語 : VS.net C# 2005 express edition 


===  質問内容  ===
標記の件でコーディングがとまってしまいました。
現在ストップウォッチを作成おります。

Form1クラス:ストップウォッチ本体プログラム
Form2クラス:設定ダイアログ
のようになっています。

Form2の設定ダイアログ内にはは
・2つのradioButton
・1つのtextBox
・1つのbutton(Form2を閉じるだけ)があるのみです。

具体的には、
radioButton1.Enabled == true	//カウント アップ モード
radioButton2.Enabled == true	//カウント ダウン モード
かつ、
if(radioButton2.Enabled == true) の場合、
textBox1にカウントダウンしたい "分" を入力できます。
Form2を閉じた後、Form1(ストップウォッチ本体)はそれに伴った
動作をします。


=== 困っていること ===
ストップウォッチ自体は完成しているのですが、Form2の設定値を
取得(保持?)ができずデフォルトのモードでしか動かず困っています。

フォーム間の値のやりとりなどをWeb等で調べたのですが、Form1(親)
のtextBoxの表示内容をForm2(子)で表示させる方法などは多数あった
のですが、今回のようなパターンを見つけることができませんでした。
初心者のため、ヒントを逃してしまっている可能性もありますが、
ご指導いただけないでしょうか。

引用返信 編集キー/
■35346 / inTopicNo.2)  Re[1]: Form2の設定値をForm1で使う
□投稿者/ επιστημη (1902回)-(2009/04/26(Sun) 18:42:46)
επιστημη さんの Web サイト
> ストップウォッチ自体は完成しているのですが、Form2の設定値を
> 取得(保持?)ができずデフォルトのモードでしか動かず困っています。

Form2にユーザの入力値を返すメソッドなりプロパティを用意し、
Form1がそれを呼ぶだけじゃなくて?

引用返信 編集キー/
■35356 / inTopicNo.3)  Re[1]: Form2の設定値をForm1で使う
□投稿者/ ぱぱいやん (6回)-(2009/04/27(Mon) 09:41:26)
ぱぱいやん さんの Web サイト
No35345 (ao さん) に返信

> === 困っていること ===
> ストップウォッチ自体は完成しているのですが、Form2の設定値を
> 取得(保持?)ができずデフォルトのモードでしか動かず困っています。
>
> フォーム間の値のやりとりなどをWeb等で調べたのですが、Form1(親)
> のtextBoxの表示内容をForm2(子)で表示させる方法などは多数あった
> のですが、今回のようなパターンを見つけることができませんでした。
> 初心者のため、ヒントを逃してしまっている可能性もありますが、
> ご指導いただけないでしょうか。

Form2 の設定値を取得するという考え方ではなく、Form2 と Form1 で同じ設定情報を持ったオブジェクトを共有するという考え方をした方が良いです。
Form1で、オブジェクトを生成して、Form2 に公開した連絡用プロパティを用意します。
引用返信 編集キー/
■35360 / inTopicNo.4)  Re[2]: Form2の設定値をForm1で使う
□投稿者/ επιστημη (1903回)-(2009/04/27(Mon) 12:34:23)
επιστημη さんの Web サイト
> Form2 の設定値を取得するという考え方ではなく、Form2 と Form1 で同じ
> 設定情報を持ったオブジェクトを共有するという考え方をした方が良いです。

なぜ?

# 「異議あり!」ってんじゃないんです。単に理由が知りたいだけ。

引用返信 編集キー/
■35361 / inTopicNo.5)  Re[3]: Form2の設定値をForm1で使う
□投稿者/ 倉田 有大 (584回)-(2009/04/27(Mon) 13:05:17)
モーダルダイアログでしたら、ウインドウを閉じた後、Form2から値を取得する処理でOK
プロパティーの実装がわからなかったら、コントロールをpublic宣言で直接所得(慣れたらお勧めしませんー)

>なぜ?
># 「異議あり!」ってんじゃないんです。単に理由が知りたいだけ。

親から子も子から親からも同じオブジェクトのインスタンスを共有させれば考え方一緒といいたいんじゃないかな。

>aoさん
方法多すぎてなんともいえませんが、Formも所詮クラスですので、クラスの基本がわかれば何でも出来ますよー
引用返信 編集キー/
■35362 / inTopicNo.6)  Re[2]: Form2の設定値をForm1で使う
□投稿者/ はつね (1007回)-(2009/04/27(Mon) 13:58:12)
はつね さんの Web サイト
No35356 (ぱぱいやん さん) に返信
> Form2 の設定値を取得するという考え方ではなく、Form2 と Form1 で同じ設定情報を持った
> オブジェクトを共有するという考え方をした方が良いです。

Form1からForm2を生成しているのにForm2からForm1の内容を参照に行くなり更新しにいくなり
とかしているならば良くないですねーとは言えますが、上記の2つの考え方には優劣はあまり
ないと思います。

理由は設定オブジェクトをForm1からForm2に渡すところ自体は「Form1からForm2を生成し、
設定情報をもったオブジェクトも生成し、そして、Form2が公開している何らかのメンバに
Form1から設定オブジェクトを渡す」という仕組みになると思うからです。

つまりは、本質は変わらないんじゃないかと。

たくさんメンバ作るよりも設定情報もったオブジェクトをやりとりした方がすっきりする場
合もあるとは思いますが。


引用返信 編集キー/
■35364 / inTopicNo.7)  Re[2]: Form2の設定値をForm1で使う
□投稿者/ みきぬ (411回)-(2009/04/27(Mon) 15:14:35)
試しで作っているプログラムだったら、既に提案されている方法のどれでもいいんじゃないかな、と前おいて。

質問を読んだ限りでは、参照したい設定なるものをアプリケーション設定(か、他の何か)で保持するようにして、どの Form からもそこを参照・更新しにいく方が好みかしら。

参考URL:
http://dobon.net/vb/dotnet/programing/mysettings.html

質問者の方へ>
もし読んでわからなければ、今はとりあえず気にしない方向でお願いします。
引用返信 編集キー/
■35365 / inTopicNo.8)  Re[3]: Form2の設定値をForm1で使う
□投稿者/ ぱぱいやん (8回)-(2009/04/27(Mon) 17:42:11)
ぱぱいやん さんの Web サイト
No35360 (επιστημη さん) に返信
>>Form2 の設定値を取得するという考え方ではなく、Form2 と Form1 で同じ
>>設定情報を持ったオブジェクトを共有するという考え方をした方が良いです。
>
> なぜ?
>
> # 「異議あり!」ってんじゃないんです。単に理由が知りたいだけ。

Form2 も単なるクラスで、必要なプロパティを公開するという発想ができていないから、今回のような質問になるのだと感じました。
Form1 から Form2 に値を渡す方法のサンプルを見ても、ピンと来ない場合は、Form クラスから一旦離れて、設定値を保持する専用のクラスを作るという発想をした方が理解しやすいだろうと思ったからです。

また、設定値だけを保持するクラスを作ることで、値の保持やデータバインディングなど、将来的に機能を拡張しながら、少しずつご自身が学んでいくきっかけになるとも思いました。
引用返信 編集キー/
■35371 / inTopicNo.9)  Re[4]: Form2の設定値をForm1で使う
□投稿者/ ao (2回)-(2009/04/27(Mon) 22:24:17)
皆さんどうもありがとうございます。
いずれも皆さんのご指摘どおりです。

>ぱぱいやんさん
Form2 も単なるクラスで、必要なプロパティを公開するという発想ができていないから、今回のような質問になるのだと感じました。
 → たしかにサンプル等を読むとふむふむと理解したつもりになっても、
   実際に自分で書いてみるとよくわからなくなります。

>みぎぬさん
参考URL:
http://dobon.net/vb/dotnet/programing/mysettings.html
もし読んでわからなければ、今はとりあえず気にしない方向でお願いします。
 → ?な箇所もあるので、じっくりと読ませていただきます。

> 倉田 有大 さん
方法多すぎてなんともいえませんが、Formも所詮クラスですので、クラスの基本がわかれば何でも出来ますよー
 → これを機に、ちゃんと理解しておこうと思います。

*****

で、本題についてですが、一応動かすことができました。
たぶん色々な方法があるのかと思いますがとりあえずです。

これは、
 επιστημη  さんの
「Form2にユーザの入力値を返すメソッドなりプロパティを用意し、
Form1がそれを呼ぶだけじゃなくて?」方法だと私は思っています。

ぱぱいやん さんの
「Form2 と Form1 で同じ設定情報を持ったオブジェクトを共有するという考え方をした方が良いです。」
「設定値を保持する専用のクラスを作るという発想をした方が理解しやすいだろうと」
という点があまり理解できてないので、今の私がかける方法は
↓のパターンくらいになってしまいます。


Form2.cs

        //0x00 カウントアップ,  0x01 カウントダウン
        public int mode = 0x00;

        //textBox1をForm1で取得できるための情報
        public string ttBox1
        {
            get
            {
                return textBox1.Text;
            }
            set
            {
                textBox1.Text = value;
            }
        }

        //textBox2をForm1で取得できるための情報
        public string ttBox2
        {
            get
            {
                return textBox2.Text;
            }
            set
            {
                textBox2.Text = value;
            }
        }

        //textBox3をForm1で取得できるための情報
        public string ttBox3
        {
            get
            {
                return textBox3.Text;
            }
            set
            {
                textBox3.Text = value;
            }
        }

        //カウントアップ側のラジオボタンをチェック
        public void radioButton1_CheckedChanged(object sender, EventArgs e)
        {
            mode = 0x00;   //カウントアップ
        }

        //カウントダウン側のラジオボタンをチェック
        public void radioButton2_CheckedChanged(object sender, EventArgs e)
        {
            mode = 0x01;   //カウントダウン
        }


Form1.cs
	//ツールメニューからForm2を起動する
        public void 設定ToolStripMenuItem1_Click(object sender, EventArgs e)
        {
            Form2 frm2 = new Form2();
            frm2.ShowDialog();

            try
            {
                set_h = int.Parse(frm2.ttBox1); 
            }
            catch
            { }

            try
            {
                set_m = int.Parse(frm2.ttBox2);
            }
            catch
            { }

            try
            {
                set_s = int.Parse(frm2.ttBox3);
            }
            catch { }

            if (frm2.mode == 0x00)
            {
                _mode = 0x00;	//Form1側で用意したモードに格納してあげる
                MessageBox.Show("カウントアップ");	//debug print
            }
            else if (frm2.mode == 0x01)
            {
                _mode = 0x01;	//Form1側で用意したモードに格納してあげる
                MessageBox.Show("カウントダウン");	//debug print
            }
            else
            {
                MessageBox.Show("どちらでもない(わけはない)");
            }

        }



引用返信 編集キー/
■35377 / inTopicNo.10)  Re[5]: Form2の設定値をForm1で使う
□投稿者/ ぱぱいやん (10回)-(2009/04/28(Tue) 10:59:44)
ぱぱいやん さんの Web サイト
No35371 (ao さん) に返信

> >みぎぬさん



> επιστημη  さんの
> 「Form2にユーザの入力値を返すメソッドなりプロパティを用意し、
> Form1がそれを呼ぶだけじゃなくて?」方法だと私は思っています。

そうです。
しかし、Form2 を Windows Form として捉えるのではなく「設定値を保持するオブジェクトに編集機能が付いている」と考える方が良いです。

Form1 から見た場合、ConfigForm(Form2) というクラスには、CountDirection プロパティ、CountValue プロパティ、ShowDialog メソッドがあれるだけで良くて、他は Form2 の中だけで処理されれば良いと考えます。

これはオブジェクト指向プログラミングでいうところの「カプセル化」と呼ばれる考え方です。

また、値チェックで例外を catch して握りつぶしていますが、ここには適切な処理を書くか、TryParse を使うと良いでしょう。

引用返信 編集キー/
■35431 / inTopicNo.11)  Re[3]: Form2の設定値をForm1で使う
□投稿者/ ao (3回)-(2009/04/29(Wed) 22:38:14)
解決済みにするのを忘れてました。
皆さんありがとうございました。
解決済み
引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -