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

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

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

Re[7]: 別フォームへアクセスして値を取得する為のインス


(過去ログ 22 を表示中)

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

■9833 / inTopicNo.1)  別フォームへアクセスして値を取得する為のインスタンスの使い方
  
□投稿者/ くまこ (3回)-(2007/11/05(Mon) 20:14:39)

分類:[C#] 

くまこです。
みなさま、いつもお世話になっております。
ありがとうございます。

早速ですが、どうも、インスタンスの使い方が把握できておらず、
求めている結果が得られているものの、
この使い方で正しいのかどうか分かりかねております。
どなたかご教示お願い致します。


準備
 ・Form1には、textBox1×1、button1×1を配置
 ・Form2には、textBox1×1を配置

やりたい事
 ・Form1からForm2を呼び出し、
  Form2を閉じる際にForm2のtextBox1に入っている内容を
  Form1のtextBox1に表示させるコードを下記のように書きました。

質問
 ・これで確かに求めている結果が得られているのですが、
  この使い方で合っているのでしょうか。
 ・Form1のtextBox1に表示させたら、
  インスタンスは不要になるように思うのですが、
  解放するにはどの様にしたら良いのでしょうか。

以下、コード
//-------------------------------------------------------------
// form1.cs
// using 節は省略
namespace WindowsApplication1
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }
        private void button1_Click(object sender, EventArgs e)
        {
            // Form2 の新しいインスタンスを生成する
            Form2 hForm2 = new Form2();
            //Form2Instanceに代入
            Form2.Form2Instance = hForm2;
            // Form2 をモーダルで表示する
            hForm2.ShowDialog();
            //インスタンスから取得
            textBox1.Text = Form2.Form2Instance.textBoxText;
        }
    }
}
//-------------------------------------------------------------
// form2.cs
// using 節は省略
namespace WindowsApplication1
{
    public partial class Form2 : Form
    {
        //Form2オブジェクトを保持するためのフィールド
        private static Form2 _form2Instance;
        //Form2オブジェクトを取得、設定するためのプロパティ
        public static Form2 Form2Instance
        {
            get { return _form2Instance; }
            set { _form2Instance = value; }
        }
        public string textBoxText
        {
            get {return textBox1.Text; }
            set {textBox1.Text = value; }
        }
        public Form2()
        {
            InitializeComponent();
        }
    }
}
//-------------------------------------------------------------

引用返信 編集キー/
■9834 / inTopicNo.2)  Re[1]: 別フォームへアクセスして値を取得する為のインスタンスの使い方
□投稿者/ ダッチ (169回)-(2007/11/05(Mon) 20:29:47)
> 質問
>  ・これで確かに求めている結果が得られているのですが、
>   この使い方で合っているのでしょうか。
Form2Instance プロパティは不要ですね。

Form2 のインスタンスは既にこの部分で hForm2 に入っています。

 Form2 hForm2 = new Form2();

なので、表示したフォーム(hForm2)の textBox1 の値を取得したい場合は
そのフォームのインスタンスに対して取得するコードを書けばいいですよ。

 textBox1.Text = hForm2.textBoxText;

>  ・Form1のtextBox1に表示させたら、
>   インスタンスは不要になるように思うのですが、
>   解放するにはどの様にしたら良いのでしょうか。

Dispose メソッドを呼んであげればいいです。
ただしフォームが Show メソッドで表示された場合は、Close メソッドでフォームを閉じる際に内部で Dispose メソッドが呼ばれているため、解放するのを気にする必要はありません。
ShowDialog メソッドで表示された場合のみ Dispose メソッドを呼んであげるようにしてください。
引用返信 編集キー/
■9835 / inTopicNo.3)  Re[2]: 別フォームへアクセスして値を取得する為のインスタンスの使い方
□投稿者/ くまこ (4回)-(2007/11/05(Mon) 21:03:15)
No9834 (ダッチ さん) に返信
> textBox1.Text = Form2.Form2Instance.textBoxText;
> ↓
>  textBox1.Text = hForm2.textBoxText;

ありがとうございます。

>> ・Form1のtextBox1に表示させたら、
>>  インスタンスは不要になるように思うのですが、解放するにはどの様にしたら良いのでしょうか。
>
> Dispose メソッドを呼んであげればいいです。
> Show メソッドで表示された場合は...解放するのを気にする必要はありません。
> ShowDialog メソッドで表示された場合のみ Dispose メソッドを呼んであげるようにしてください。

「ShowDialog メソッドで表示された場合」について、宜しければ追加で教えて頂きたいですが、、、
Form2.csの方に、以下のようにすれば良いのでしょうか?

private void Form2_FormClosing(object sender, FormClosingEventArgs e)
{
Dispose();
}

違いますね、何か違うと感じるのですが、正解がわかりません…(^^;;
引用返信 編集キー/
■9838 / inTopicNo.4)  Re[3]: 別フォームへアクセスして値を取得する為のインスタンスの使い方
□投稿者/ 渋木宏明(ひどり) (510回)-(2007/11/05(Mon) 22:12:27)
渋木宏明(ひどり) さんの Web サイト
> 違いますね、何か違うと感じるのですが、正解がわかりません…(^^;;

using (Form2 hForm2 = new Form2())
{
    Form2.Form2Instance = hForm2;
    hForm2.ShowDialog();
    textBox1.Text = Form2.Form2Instance.textBoxText;
}

引用返信 編集キー/
■9841 / inTopicNo.5)  Re[4]: 別フォームへアクセスして値を取得する為のインスタンスの使い方
□投稿者/ くまこ (5回)-(2007/11/05(Mon) 22:32:41)
No9838 (渋木宏明(ひどり) さん) に返信
> using (Form2 hForm2 = new Form2())
> {
> Form2.Form2Instance = hForm2;
> hForm2.ShowDialog();
> textBox1.Text = Form2.Form2Instance.textBoxText;
> }

ありがとうございます!
何か素晴らしい手法を見せていただいたように感じるのですが、
すみません、未経験な手法のため利用法がわかりません。
これはどこに記述したら良いのでしょうか?

引用返信 編集キー/
■9844 / inTopicNo.6)  Re[5]: 別フォームへアクセスして値を取得する為のインスタンスの使い方
□投稿者/ ダッチ (170回)-(2007/11/05(Mon) 22:46:59)
2007/11/05(Mon) 22:47:31 編集(投稿者)
> ありがとうございます!
> 何か素晴らしい手法を見せていただいたように感じるのですが、
> すみません、未経験な手法のため利用法がわかりません。
> これはどこに記述したら良いのでしょうか?

Form1 の button1_Click イベントの処理内に記述してください。

using はそのブロックを抜けた時に自動的に Dispose を呼んでくれます。
using を使用すれば、いちいち Dispose メソッドを呼ぶ手間が省けます。

 using ステートメント (C# リファレンス)
 http://msdn2.microsoft.com/ja-jp/library/yh598w02(VS.80).aspx

今までの内容をまとめると、このようになりますね。

    // Form1 のコード
    private void button1_Click(object sender, EventArgs e)
    {
        // Form2 の新しいインスタンスを生成する
        using (Form2 hForm2 = new Form2())
        {
            // Form2 をモーダルで表示する
            hForm2.ShowDialog();
            //インスタンスから取得
            textBox1.Text = hForm2.textBoxText; // hForm2 に対して textBoxText プロパティにアクセスします。
        } // ここを抜けると hForm2 に対して Dispose メソッドが呼ばれます。
    }

引用返信 編集キー/
■9845 / inTopicNo.7)  Re[6]: 別フォームへアクセスして値を取得する為のインスタンスの使い方
□投稿者/ 渋木宏明(ひどり) (511回)-(2007/11/05(Mon) 23:15:30)
渋木宏明(ひどり) さんの Web サイト
2007/11/05(Mon) 23:55:38 編集(投稿者)

> using を使用すれば、いちいち Dispose メソッドを呼ぶ手間が省けます。

加えて、ブロック内で例外が発生しても、確実に IDisposable.Dispose() メソッド呼び出しが行われます。

引用返信 編集キー/
■9846 / inTopicNo.8)  Re[7]: 別フォームへアクセスして値を取得する為のインス
□投稿者/ くまこ (6回)-(2007/11/05(Mon) 23:28:19)
2007/11/05(Mon) 23:44:01 編集(投稿者)
2007/11/05(Mon) 23:43:31 編集(投稿者)

>ダッチ さん、渋木宏明(ひどり) さん

親切な説明ありがとうございました。

今回は値の取得だけでなく、インスタンスの概念そしてusing手法まで学ぶことができました。

大変勉強になりました。
ありがとうございました。

------------------------------------------------------
これで解決としようと思ったのですが、1つ疑問が生まれました。

今回完成したForm1とForm2では、
「Form2に入力された値をForm1に持ってくる」ことが出来るようになりました。
これにさらに「Form2を開く際にもForm1のtextBox1の値を持って行く」には、
どうした良いのでしょう?

と書いているうちにわかりました(^^;

hForm2.ShowDialog(); する前に
hForm2.textBoxText = textBox1.Text;
すれば良いのですね。

インスタンスとusing。
随分便利なものを使えるようになりました。
本当にありがとうございました。
解決済み
引用返信 編集キー/


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

このトピックに書きこむ

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

管理者用

- Child Tree -