2009-08-11 1 views
3

誰でもこの種のコードに非常に精通している:簡略化するダイアログにはどのような影響がありますか? .NETとのWinFormsで任意のUIの仕事をしています

TestForm frm = new TestForm(); 
frm.ShowDialog(); 

私は自分自身をもっと、モーダルダイアログを表示するための呼び出しは少し冗長であったことを願いました静的呼び出し。 Andfにはもっと簡単な方法があります。

new TestForm().ShowDialog(); 

私は何をしないのです:あなたが本当に必要なのは、単純なケースでは、このようなものでしょうか?この種の略記からの影響はありますか?例えば。 Windowsメッセージが正しく処理されない/ルーティングされない、ダイアログのリソースが削除されないなど私はレイのフィードバックを見たとき

がこれに取り組んでいた:

私も短い道は自身のインスタンスを作成し、内部的にShowDialogを呼び出す静的メンバwithingのTestFormをを作成するだろうと仮定します。だから、このコード:

public static DialogResult DoModal() 
{ 
    return new TestForm().ShowDialog(); 
} 

はthusly呼び出すことができます

TestForm.DoModal(); 
+1

'TestForm.DoModal();'を呼び出すのは、実際には 'new TestForm()。ShowDialog();'ということよりはそれほど短くはありません。 – RaYell

+0

合意されたRa、静的なことは、冗長という点では話す価値がありません。他の可能性への興味深い接線です。 –

答えて

5

フォームオブジェクトを再利用したくない場合はどこでも、あなたのコード内であなただけの

new TestForm().ShowDialog(); 
短い形式を使用することができます

そのオブジェクトで後で何かをしたい場合は、それを変数に割り当てる必要があります。

2

かなり簡単です。フォームコンストラクタを非表示にして(プライベートにする)、フォームの新しいインスタンスを初期化してすぐに表示する静的ファクトリメソッドを追加します。 ShowDialogメソッドの例については

(私は間違っていない場合はモノラル、)メッセージボックスのソースコードを参照してください link

+0

これがなぜ落選したのか分かりません...元の質問の編集を確認してください。レイのポイントは確固たるようだ。 +1 0に戻るには... –

1

典型的な用途は次のようになります。

using (Form form = new Form()) 
{ 
    // here setup your form instance 

    if (DialogResult.OK == form.ShowDialog()) 
    { 
     // here read data from form instance 
    } 
} 

をShowDialogを()原因がありますのでご注意くださいフォームインスタンスはそれ自体を処理しません。作業を終えたら手動で処理する必要があります。したがって、句を使用してください。詳細は、http://msdn.microsoft.com/en-us/library/w61zzfwe.aspxを参照してください。あなたのシナリオでは、これは以下のようになります:

public static DialogResult DoModal() 
{ 
    using (Form form = new TestForm()) 
     return form.ShowDialog(); 
} 

これは、フォームインスタンスからデータを読み取る必要がない場合にのみ便利です。したがって、ここに収まる唯一のシナリオはメッセージボックスです。 MessageBox.Show(...)メソッドは、あなたの投稿に実装したいパターンを利用します。

他のシナリオでは、フォームは、DialogResult以外のデータを閉じた後にアプリケーションに戻すことになっています。そのため、標準のFormには、静的なShowDialog()メソッドまたはDoModal()メソッドがありません。静的メソッドは、一時的なフォームインスタンスを処理する必要があります。そのような処分は、フォームからデータを読み取ることを不可能にするでしょう。さらに、静的メソッドのシナリオでは、データを読み戻すフォームインスタンスはありません。ガイドラインに準拠するために、すべて一緒にあなたの方法を置く

は、より多くのようになります。

public static YourResultClass DoModal() 
{ 
    using (TestForm form = new TestForm()) 
    if (DislogResult.OK == form.ShowDialog()) 
    { 
     YourResultClass result = new YourResultClass(); 
     // Here initialize YourResultClass instance with data from form instance 
     return result; 
    } 
} 

しかし、それは具体的で、かなり遠くあなたのワンライナーのユーティリティメソッドから非常にユースケースです。

+0

これは興味深い概念のPrzemaasです。しかし、それをバックアップするためにいくつかのドキュメント/リンクを共有できますか?関数のスコープで宣言されたフォームまたはそのオブジェクトは、関数がスタックから取り除かれた後のある時点でGCedを取得するはずです。 Graphicsのようなオブジェクトは、実際にはクライアントコードから呼び出されるDisposeを必要とします。 –

+0

ここにいくつかのMSDNの読書があります:http://msdn.microsoft.com/en-us/library/w61zzfwe.aspx – Przemaas

+1

はい、GC-edされますが、2回目のガベージコレクションの後です。最初のガベージコレクションはDispose()のみを呼び出します。したがって、Dispose()を手動で呼び出すことは、リソースのクリーニング速度を上げるため、お勧めです。これはフォームだけでなく、すべてのIDisposableオブジェクトに当てはまります。このようなオブジェクトを廃棄しないと、リークやパフォーマンスの問題が発生する可能性があります。特に、このようなオブジェクトによって管理されていないリソースが割り当てられた場合。それぞれの生きているフォーム(およびコントロールも)は、存在するためにウィンドウハンドルを割り当てる必要があります。したがって、単一のフォームで多くのウィンドウハンドルを割り当てることができます。 Windowsハンドルは管理オブジェクトではなく、安価ではありません。 – Przemaas

関連する問題