2011-01-26 5 views
4

私は単純なWindowsフォームアプリケーションを持っています。フォーム上には独自のDisposeメソッドを持つカスタムクラスがあります。フォームからオブジェクトをクリーニングする、場所と時間

私はこれをいつ呼びますか?

FormClosedイベント(つまりForm1_FormClosed)がこれを行う正しい場所ですか?または、フォームのカスタムDisposeメソッドを記述する必要がありますか?

ボーナスポイントの場合:一旦閉鎖すると再開できますか? (そうであれば、FormClosedは間違った方法です!)

ありがとうございました。

答えて

6

手術が少し必要です。ソリューションエクスプローラウィンドウで、フォームの横にあるノードを開きます。フォームのDesigner.csファイルをダブルクリックします。 Dispose()メソッドを探して、フォームのソースコードファイルにカットアンドペーストします。これで、フォームクラスを変更して、使い捨てオブジェクト参照のDisposeメソッドを呼び出すことができます。

先取り:いいえ、デザイナーファイルのこの部分を編集しても問題ありません。 #regionのセクションのみがオフリミットです。

-1

本当に理由がない場合は、決して処理しないでください。

オブジェクトに重いオブジェクト(イメージ、データベース接続など)が含まれている場合は、終了するとすぐにクローズを呼び出します。

closeでdisposeを呼び出すと、開いているリソースをリロードする必要があります。重要なアイテムを閉じた後に破棄せずに参照を保持すると、フォームを再度開くことができます。

'定義'によって、closeは 'dispose'と同じことを行います(ウィンドウとフォームを閉じます)。 .netフレームワーク内のすべてのclose呼び出しは、内部的にanaywayを呼び出すだけです。私は40メガバイトのビットマップの周りに保たれたアプリケーションを使用しました

@comment

。メモリにバインドされたマシンで実際に助けられた人に処理を依頼してください。 質問に記載された情報でオブジェクトを処理することは不可能です。デザイナーがそれをさらに悪化させるので、それは単に「悪い」と呼ぶのは悪いことです。

+0

私は本当に良い理由があるとしましょうが、もはやそれが使用されなくなることを知ったときにのみ呼びたいと思います。したがって、フォームを再オープンすることができれば、Disposeを呼び出すことはありません。オブジェクトの廃棄をフォームの廃棄に移動する必要がありますか? – AidanO

+0

@Barfieldmv:Disposeメソッドが呼び出される必要があります。必要なのは、 'インスタンスが完了しました'だけです。 'Close'メソッドを呼び出すことは、A)' Close'メソッドが存在する場合、B)インスタンスが( 'Open'メソッドなどによって)再利用可能であり、C)あなたがこれを知っていて、再利用する必要がある/インスタンス。 –

+0

@Mr。失望しないと断言しないでください。はい、私たちはそのようなインターフェースを持っています。しかし、それを呼び出すことは賢明でなければなりません。フレームワークの場合、CLRはあなたの邪魔をすることなくすべてを行います。 –

0

form closingに理由がある場合は、ブールA pplication.IsExitingを確認する必要があります。

フォームを破棄したくない場合は、form closingをキャンセルしてからHide()にしてください。その後、フォームはShow()を使用して再度開くことができます。フォーム全体の状態は変わりません。

+0

厚くて申し訳ありませんが、なぜApplication.IsExitingをチェックする必要がありますか?私は "this.Hide(); e.Cancel = true;を知っていたので、もし私がそれをやっていなければ私の心には、フォームは閉じていて、再び開くことはできません。それは再現することができますが、それも良いです。 – AidanO

+0

アプリのライフタイムごとに1つのフォームインスタンスが必要だと思いました。あなたのケースでは、何らかの形でフォームを非表示にするか閉じたいかを閉じるメソッドに通知する必要があります。たとえば、いくつかの静的な 'bool NeedsClosing'をフォームに追加し、それを確認して閉じます。 –

5

IDisposableを実装するコントロールは、フォームのSystem.ComponentModel.IContainer componentsプロパティに追加する必要があります。

フォームの処分では、そのコレクション内のすべての使い捨て品は処分されます。

EDIT これを見るには、フォームにTimerをドロップして、生成されたコードを見てください。

+0

これはきちんとした解決策のようです。私はIComponentと関連するISiteを実装する必要はないでしょうか?私はちょうどそこに任意の付加価値が追加されています。 – AidanO

+1

はい、コンポーネントを開発するために、コントロールをデザイン面にドロップすることができます。コンポーネントを追加および構成するためにデザイナーを使用したくない場合は、おそらくコントロール/コンポーネントではありません。 (私はタイマーのような '見えない'コントロールが好きではなかった)コントロールでない場合は、 'Disposables:List 、IDisposable {}'という同じトリックを実装して、フォームの廃棄またはあなたが望む他の方法。 –

+0

私はあなたの答えが本当に好きです。できるだけそれを評価しましたが、Hansの答えはより直接的に答えられたと思います。両方の組み合わせが私が使用するものになります。もし私がクレジットを分かち合うことができたら、 – AidanO

関連する問題