- PR -

C#: FormをまたがったNetworkStreamのClose

投稿者投稿内容
雪ふくろう
会議室デビュー日: 2009/01/27
投稿数: 11
投稿日時: 2009-02-06 14:55
引用:

せっきーさんの書き込み (2009-02-06 10:29) より:
Form1の終了ボタンClickイベント内で、
Form2をShowDialog()し戻り値がOKだったらCloseする
という流れで問題ないと思いますが。。。
ShuryoButton_Click(object sender, EventArgs e){
Form2 formYesNo = new Form2();
if (DialogResult.OK == formYesNo.ShowDialog()) {
// ソケットをクローズする
}
}


せっきーさん、ありがとうございます。
解決できました!

可能でしたら、
1) Form1のインスタンス
2) 静的でない...のエラーの意味
を知りたく、お答え頂けるとうれしいです。
セラフ
ベテラン
会議室デビュー日: 2005/12/01
投稿数: 95
お住まい・勤務地: 東北の顔の形といえば
投稿日時: 2009-02-06 19:22
時間があるので回答します。

本来は、言語仕様の基本的な部分なので、書籍等で学習して欲しいのですが、自分がきちんと説明できるか腕試ししてみたいと思います。

まず、雪ふくろうさんが作成したボタンやテキストボックスなどが配置され、NetworkStreamが宣言してあるForm1を「クラス」といいます。「クラス」とは、建物の設計図のようなもので、あくまで設計図でしかないので、建物はまだありません。

また、その設計図には、建物の寸法や材質だけではなく、「コンストラクタ」といわれる建築方法が書かれた部分が存在し、その建築方法を元に建物を建築する行為を「インスタンス化する」といいます。そして、建築が完了したものを「インスタンス」といいます。

したがって「Form1のインスタンス」とは、「Form1クラスをインスタンス化したオブジェクト」のことであり、「Form1クラスのインスタンス化」とは以下のように行います。

コード:
Form1 formHoge = new Form1();



そして、この「インスタンス化されたForm1」が代入されている「formHoge」が「Form1のインスタンス」となります。

引用:
「静的でないフィールド、メソッド、またはプロパティ
 '(namespace名).Form1.ns'で
 オブジェクト参照が必要です」



これは、上記をお読みいただくとわかるとおり、設計図しかなく、現実の世界には建物がまだ存在していないのに、その現実に存在しない建物の中のものを使おうとしたために出たエラーで、「'(namespace名).Form1.ns'を使うには建物を建てる必要があります」というエラーで、インスタンス化してから使えということです。

ただし、これには注意点があって、「静的でないフィールド、メソッド、またはプロパティ」の逆で「静的であるフィールド、メソッド、またはプロパティ」は設計図の状態で使用可能になります。と話を続けていくと本が1冊かけてしまうので、あとはご自分で勉強してみてください。

ところで、「Form1にコンストラクタなんて書いた覚えないよ?」なんていう疑問がわいてきませんか?
雪ふくろう
会議室デビュー日: 2009/01/27
投稿数: 11
投稿日時: 2009-02-07 12:29
セラフさん、丁寧なご説明感謝いたします。
お時間割いて下さってありがとうございます。

甘えて少し追加で質問を...

今回使っているForm1は、VS2008の
ファイル>新規作成>プロジェクト>Windowsフォームアプリケーション
テンプレートを元にしています。
このテンプレートのMainには
Application.Run(new Form1());
とあって、ここでForm1のインスタンスが作成されていると
いう理解ですが、正しいでしょうか。
(これ以外の場所でnew Form1()を行っていないと思います。
 これでアプリとして動作しているので、
 インスタンス化はされていると思うのですが...)

ここではセラフさんの例のformHogeのように
オブジェクトに名称を与えていないのですが
先にあすかさんに頂いたお答えにある
「Form1のインスタンス.ns」のように使いたい場合は
どうなるのでしょう。

また上記インスタンス化がされているのに
「静的でない...」のエラーが出るのはなぜでしょうか。
(やっぱり、インスタンス化されていない???
 でもならなぜアプリとして動作している?????)

Form1のコンストラクタは Form1.csに含まれていた
public Form1(){}
の中に必要な初期作業を追加しましたが
この点でもご教示頂ける点があれば、ぜひお願いします。
Jitta
ぬし
会議室デビュー日: 2002/07/05
投稿数: 6267
お住まい・勤務地: 兵庫県・海手
投稿日時: 2009-02-07 13:05
少しは本を読んで、体系的に勉強しましょうよ(-_-;

引用:

Application.Run(new Form1());
とあって、ここでForm1のインスタンスが作成されていると
いう理解ですが、正しいでしょうか。


正しいです。

引用:

また上記インスタンス化がされているのに
「静的でない...」のエラーが出るのはなぜでしょうか。


ここでインスタンス化したものを使わずに、Form1(←クラス名)から ns にアクセスしているからです。

引用:

先にあすかさんに頂いたお答えにある
「Form1のインスタンス.ns」のように使いたい場合は
どうなるのでしょう。


どこで、ここで作成したインスタンスを使いたいかによります。
Form2 のインスタンスは、Main メソッドの中で宣言した変数にアクセスできません。そのため、Main 関数を変更するのではなく、Form1 と Form2 を変更することになります。

コード:
Form1 の、Form2 を表示するところ。

    Form2 f2 = new Form2();
    f2.Parent = this; // this は、"この"インスタンス
    DialogResult r = f2.ShowDialog();

Form2 の、Yes ボタン クリック イベント ハンドラ。

    Parent.Close();

※ 最近 C# 触ってないのでテキトー

雪ふくろう
会議室デビュー日: 2009/01/27
投稿数: 11
投稿日時: 2009-02-09 16:50
Jittaさん、お答えありがとうございます。試してみます。

スキルアップ/キャリアアップ(JOB@IT)