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

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

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

Re[5]: 自作ダイアログについて


(過去ログ 41 を表示中)

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

■21607 / inTopicNo.1)  自作ダイアログについて
  
□投稿者/ 若葉マーク (1回)-(2008/07/05(Sat) 17:33:07)

分類:[.NET 全般] 

Visual Studio 2005 スタンダード で、C# Windowsアプリケーションを作成しています。

自作したダイアログを他のコントロールのようにVSのツールボックスに表示することはできるでしょうか?

それと、クリックイベントでダイアログを作成して表示させる場合、Dispose() は必要ありませんか?
private void buttonOpen_Click(object sender, EventArgs e)
{
MyDialog myDialog = new MyDialog();
DialogResult dr = new DialogResult();
dr = myDialog.ShowDialog();
if (dr == DialogResult.OK)
MessageBox.Show("User clicked OK button");
else if (dr == DialogResult.Cancel)
MessageBox.Show("User clicked Cancel button");

myDialog.Dispose();<<
}

コンストラクタで作成した場合は、
protected override void Dispose(bool disposing)
{
if (disposing && (components != null))
{
components.Dispose();
}
if (disposing && (myDialog != null))<<
{ <<
myDialog.Dispose(); <<
} <<
base.Dispose(disposing);
}
必要ですか?

前者と後者、どちらが適切でしょうか?

複数の質問を同時にお伺いして申し訳ありません。
また、初心者の質問で、説明が分かりづらいかと思いますが、どうぞよろしくお願いいたします。




引用返信 編集キー/
■21608 / inTopicNo.2)  Re[1]: 自作ダイアログについて
□投稿者/ ネタ好き (531回)-(2008/07/05(Sat) 18:16:17)
>自作したダイアログを他のコントロールのようにVSのツールボックスに表示することはできるでしょうか?
出来ます。今確認できない環境なのでちょっと曖昧な表現ですが、コントロールの追加というメニューで出来ます。
ただし、属性をちゃんと設定しないと見栄えがいいものは出来ません。
自作コントロールで検索してみてください。

>それと、クリックイベントでダイアログを作成して表示させる場合、Dispose() は必要ありませんか?
必要かどうかはアンマネージのリソースを使っているか否かによってきまります。
ダイアログボックスの場合は、問題が発生するか、Winのアンマネージリソースが使われている事が確かで、
それを開放しないと不味い状況になる時にだけIDsposeを実装するようにしましょう。
引用返信 編集キー/
■21610 / inTopicNo.3)  Re[1]: 自作ダイアログについて
□投稿者/ Azulean (155回)-(2008/07/05(Sat) 22:58:42)
2008/07/05(Sat) 22:59:16 編集(投稿者)
> 自作したダイアログを他のコントロールのようにVSのツールボックスに表示することはできるでしょうか?
OpenFileDialog等が存在することから工夫すれば可能だとみられます。(あれはComponentか…)
ただ、Formからどのように登録される状態に持って行くのかまでは存じません。

> それと、クリックイベントでダイアログを作成して表示させる場合、Dispose() は必要ありませんか?
Clickイベントで毎回newするのであれば、ClickイベントにDisposeが必要でしょう。
例示されているような使い方であれば、using構文をお薦めします。
private void buttonOpen_Click(object sender, EventArgs e)
{
    using(MyDialog myDialog = new MyDialog())
    {
        DialogResult dr = myDialog.ShowDialog();
        if (dr == DialogResult.OK)
            MessageBox.Show("User clicked OK button");
        else if (dr == DialogResult.Cancel)
            MessageBox.Show("User clicked Cancel button");
    }
}

> コンストラクタで作成した場合は、
デフォルトのFormだと×ボタンで閉じると勝手にDisposeされてしまい、再利用できませんが、大丈夫ですか?

> 前者と後者、どちらが適切でしょうか?
場合によりけりです。

引用返信 編集キー/
■21611 / inTopicNo.4)  Re[2]: 自作ダイアログについて
□投稿者/ 高見知英 (9回)-(2008/07/05(Sat) 23:55:34)
高見知英 さんの Web サイト
2008/07/05(Sat) 23:57:52 編集(投稿者)
2008/07/05(Sat) 23:56:40 編集(投稿者)

アンマネージリソースを使っているとしたら使っているのはフォームなので、フォームのDisposeメソッドをオーバーライドしてやるべきなんじゃないでしょうか。
Clickイベントで呼び出した際にDisposeするのはまた別の問題では?Formクラス自体が使用しているアンマネージリソースを解放するためにも呼ばなければいけないわけですし。
なので、上の例では、前者も後者も両方必要・・・という認識ですが、間違っていますでしょうか。

ところで、ツールパレットにダイアログを入れるというのは、OpenFileDialogのようなものということで間違いないのでしょうか。そうすると、呼び出し元のコントロール(Componentあたりを継承)をつくって、それにフォームを呼び出してもらう という実装になるのではないかと思いますが。
# Clickイベント(などのコード上)で呼び出すだけのダイアログであれば、そのときそのときにコードでnewすれば良いだけなので、ツールパレットに表示させる必要はないですよね。


ところで
No21610 (Azulean さん) に返信
> デフォルトのFormだと×ボタンで閉じると勝手にDisposeされてしまい、再利用できませんが、大丈夫ですか?
間違っていたら申し訳ないのですが、フォームがDisposeされるのは明示的にDisposeする(usingブロックを抜けるのも含む)か、GCで回収されたときだと思うのですが、いかがでしょうか。
# そうでないと一度閉じたダイアログを再表示したり、そのデータにアクセスすることができなくなってしまう・・・
引用返信 編集キー/
■21615 / inTopicNo.5)  Re[3]: 自作ダイアログについて
□投稿者/ 渋木宏明(ひどり) (811回)-(2008/07/06(Sun) 00:34:38)
渋木宏明(ひどり) さんの Web サイト
> 間違っていたら申し訳ないのですが、フォームがDisposeされるのは明示的にDisposeする(usingブロックを抜けるのも含む)か、GCで回収されたときだと思うのですが、いかがでしょうか。

間違ってます。

Form.Show() した場合、Closing イベントなどで何もしていなければ、Form.Close() 経由で Dispose() が呼び出されます。

> # そうでないと一度閉じたダイアログを再表示したり、そのデータにアクセスすることができなくなってしまう・・・

「Dispose() が呼び出された」からと言って、必ずしもインスタンスメンバへのアクセスが不能になるわけではありません。

IDisposable.Dispose() 呼び出しは、オブジェクトインスタンスがカプセルするアンマネージリソースの解放を実行するものでしかありません。

結果的にインスタンスメンバへのアクセスに問題を生じることはありますが、決してイコールではありません。

引用返信 編集キー/
■21618 / inTopicNo.6)  Re[4]: 自作ダイアログについて
□投稿者/ 若葉マーク (2回)-(2008/07/06(Sun) 09:36:46)
皆さん、たくさんの回答ありがとうございました。

No21608
> 必要かどうかはアンマネージのリソースを使っているか否かによってきまります。
> ダイアログボックスの場合は、問題が発生するか、Winのアンマネージリソースが使われている事が確かで、
> それを開放しないと不味い状況になる時にだけIDsposeを実装するようにしましょう。
ありがとうございました。MSDNのサイトを見ても、混乱するばかりで、もう少し勉強しようと思います。

No21610
> using構文をお薦めします。
No21611
> ...Formクラス自体が使用しているアンマネージリソースを解放するためにも呼ばなければいけないわけですし。
> なので、上の例では、前者も後者も両方必要...
ありがとうございました。using構文を使用すると、とても安心のように思いました。
Disposeできるものは、できるだけ using構文を使用しようと思います。


No21610
> デフォルトのFormだと×ボタンで閉じると勝手にDisposeされてしまい、再利用できませんが、大丈夫ですか?
No21615
> Form.Show() した場合、Closing イベントなどで何もしていなければ、Form.Close() 経由で Dispose() が呼び出されます。
おっしゃられるとおりでした。ただ、今回のモーダルダイアログのShowDialog()で表示させる場合は、×ボタンでも、
Dispose()に制御は移りませんでした。


No21615
> 「Dispose() が呼び出された」からと言って、必ずしもインスタンスメンバへのアクセスが不能になるわけではありません。
大変勉強になりました。

myDialog.Dispose();
label1.Text = "" + myDialog.testInt;

と、したところ、エラーにもならず、testIntの値も表示されました。
Dispose()しても、myDialogはnullにもはならないんですね。

if (myDialog != null)
{
myDialog.Dispose();
}

このような構文は、ダイアログに限らず使っていましたが、Dispose()を繰り返し呼んでしまうとまずいのでしょうか。
可能性のあるときは明示的に、Disposeの後はnullを代入しておかなければいけませんか?


No21610
> OpenFileDialog等が存在することから工夫すれば可能だとみられます。(あれはComponentか…)
No21611
> 呼び出し元のコントロール(Componentあたりを継承)をつくって、それにフォームを呼び出してもらう
> という実装になるのではないかと思いますが。
ありがとうございました。おっしゃられるとおりでした。
長くなるのでレスを分けます。

引用返信 編集キー/
■21619 / inTopicNo.7)  Re[5]: 自作ダイアログについて
□投稿者/ 渋木宏明(ひどり) (812回)-(2008/07/06(Sun) 10:39:39)
渋木宏明(ひどり) さんの Web サイト
> Dispose()しても、myDialogはnullにもはならないんですね。

なりません。

> このような構文は、ダイアログに限らず使っていましたが、Dispose()を繰り返し呼んでしまうとまずいのでしょうか。

対象のクラス次第です。

が、基本的には IDisposable.Dispose() は何度でも正しく(=InvalidOperationException 例外などを発生することなく)呼び出せることが強く期待されます。

.NET の標準クラスライブラリのクラスに関しては「何度でも IDisposable.Dispose() を呼び出しても大丈夫」と考えて問題ないでしょう。

> 可能性のあるときは明示的に、Disposeの後はnullを代入しておかなければいけませんか?

必要ありません。

が、IDisposable.Dispose() 呼び出しを行った後のクラスインスタンが期待通りに動作するかどうかは、そのクラスの設計次第です。

正常動作が望めないものも数多く存在するので、Dispose() 呼び出し済みのインスタンスの使い回しによる不具合を回避するための仕掛けの一つとしては、アリだと思います。

引用返信 編集キー/
■21620 / inTopicNo.8)  Re[5]: 自作ダイアログについて
□投稿者/ 若葉マーク (3回)-(2008/07/06(Sun) 10:43:55)
2008/07/06(Sun) 13:17:53 編集(投稿者)
2008/07/06(Sun) 13:15:22 編集(投稿者)
2008/07/06(Sun) 11:54:47 編集(投稿者)

半分は無理かとあきらめかけていましたが、同様の方法のページがありました。
無事にツールボックスからフォームに貼り付けることもでき、ダイアログボックスを表示させることもできました。
具体的には、
http://it.toolbox.com/blogs/paytonbyrd/howto-create-a-dialog-box-for-your-toolbox-3165
VBですが、ここを参考にさせて頂きました。

引用返信 編集キー/
■21621 / inTopicNo.9)  Re[6]: 自作ダイアログについて
□投稿者/ 若葉マーク (4回)-(2008/07/06(Sun) 12:10:47)
すれ違いレスですみませんでした。


No21619 (渋木宏明(ひどり) さん) に返信
> が、IDisposable.Dispose() 呼び出しを行った後のクラスインスタンが期待通りに動作するかどうかは、そのクラスの設計次第です。
>
> 正常動作が望めないものも数多く存在するので、Dispose() 呼び出し済みのインスタンスの使い回しによる不具合を回避するための仕掛けの一つとしては、アリだと思います。
>

ありがとうございました。こちらで質問させていただいて、今回大変勉強になりました。
usingにするか、インスタンスの動作を保証するため、呼び出し元のコントロール(Component継承)のコンストラクタで初期化して、
そのDispose()メソッドで、ダイアログをDisposeするか、もう一度、検討したいと思います。
引用返信 編集キー/
■21622 / inTopicNo.10)  Re[7]: 自作ダイアログについて
□投稿者/ 若葉マーク (5回)-(2008/07/06(Sun) 13:02:09)
No21611
> # Clickイベント(などのコード上)で呼び出すだけのダイアログであれば、そのときそのときにコードでnewすれば良いだけなので、
> ツールパレットに表示させる必要はないですよね。

ツールボックスに表示させるのはあきらめまして、結局基もとの、Clickイベントの中のusing構文でデータの受け渡しを終わらせるのが一番安心だと判断しました。
皆さん、初心者の質問に親切にお答えいただきありがとうございました。
解決済み
引用返信 編集キー/
■21623 / inTopicNo.11)  Re[5]: 自作ダイアログについて
□投稿者/ Azulean (156回)-(2008/07/06(Sun) 14:14:38)
> おっしゃられるとおりでした。ただ、今回のモーダルダイアログのShowDialog()で表示させる場合は、×ボタンでも、
> Dispose()に制御は移りませんでした。
すみません。
Showの場合には自動的にDisposeに呼ばれるタイミングがあるようですが、ShowDialogの場合は異なるようです。

解決済み
引用返信 編集キー/


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

このトピックに書きこむ

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

管理者用

- Child Tree -