- 題名: ShowDialogとDisposeについて
- 日時: 2009/10/05 16:33:03
- ID: 25503
- この記事の返信元:
- (なし)
- この記事への返信:
- [25507] Re[1]: ShowDialogとDisposeについて2009/10/06 10:40:19
- ツリーを表示
# 本題(ShowDialog と Dispose)とは別のところに反応。 ■No25508に返信(るしぇさんの記事) > VB.NET は Forms コレクションみたいなのも無くなったので、 (VB6 でいうところの) Forms 相当の機能が無いというのは、 http://support.microsoft.com/kb/308537/ja のことでしょうか? 2005 以降では、 My.Application.OpenForms Application.OpenForms を、Forms コレクションとして利用できます。 Private Sub Button1_Click(ByVal sender As Object, ByVal e As EventArgs) Handles Button1.Click Dim F As New Form() F.Text = Now.ToLongTimeString() F.Show() MsgBox(Application.OpenForms.Count) End Sub
>2005 以降では、 > My.Application.OpenForms > Application.OpenForms >を、Forms コレクションとして利用できます。 いつも、ありがとうございます。 検索の段階で OpenForms もチェックしましたが、Count プロパティで1しか取得 できなかったので、閉じたら出てこないのかなぁ。。。と思いお茶を濁しておりました。 魔界の仮面弁士さんの環境では繰り返しダイアログ表示で増えていきますか? サンプルコード[VB2008 Pro] Public Class Form1 Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click Dim f2 As Form2 f2 = New Form2 f2.ShowDialog() End Sub Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click Debug.WriteLine(My.Application.OpenForms.Count) Debug.WriteLine(Application.OpenForms.Count) End Sub End Class Public Class Form2 Private Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.Tick Debug.WriteLine(Now & Me.Name) End Sub Private Sub Form2_Disposed(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Disposed Debug.WriteLine(Now & "Form2_Disposed") End Sub Private Sub Form2_FormClosed(ByVal sender As Object, ByVal e As System.Windows.Forms.FormClosedEventArgs) Handles Me.FormClosed Debug.WriteLine(Now & "Form2_FormClosed") End Sub Private Sub Form2_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load With Me.Timer1 .Interval = 1000 .Start() End With End Sub End Class
■No25516に返信(魔界の仮面弁士さんの記事) > 閉じたら出てこないのは、VB6 時代も同様かと思います。 > (Forms.Count は、インスタンスの有無を表している訳ではありません) …そういうことですか。。。orz そもそもインスタンスの管理に関係ないんですね。了解です。 # VB6.0 時代も VB.NET 時代もインスタンスは自分で書いたコードで # 管理していたもので、勘違いしていました。 # というか、自分で管理しないとだめって事ですか。
■No25539に返信(ながさんの記事) > ザンネンなことに、どちらにも表示されませんでした。 そういうものです。 [参照の追加]に表示されるようにするためには、作成したアセンブリを 登録する作業が必要になります。 http://www.atmarkit.co.jp/fdotnet/dotnettips/454vsaddreflist/vsaddreflist.html > ということは、自分で解放してあげないとガベージコレクターの対象には > ならないということですね。 参照の追加に現れるかどうかと、ガベージコレクト対象かどうかは別問題です。 > WithEventsでクラスを定義し、 蛇足ですが、そのクラスが COM オブジェクトの場合、WithEvents を使うと 後始末の際に問題になる事があったりします。 >>.NET で作られたクラスは基本的にマネージリソースですよ。 > そうだったんですか。 > では、IDisposableを使用するのはどのようなときなのでしょうか? IDisposable は、割り当てられた資源を解放するメソッドを定義するためのものです。 そして多くの場合、この資源とはアンマネージ リソースのことを指しています。 IDisposable そのものは、別にアンマネージ専用という決まりは無いのですが、 マネージ リソースの場合、ガベージコレクトに任せれば充分という事が多いため、 結果として、アンマネージ リソースのために利用されることが多いのです。 # MSDN Library の“IDisposable インターフェイス”の項を参照してみると、 # MSDN 文書の更新時期によって、その表記内容には微妙に差があり、 # 『割り当てられたアンマネージ リソースを解放するメソッドを定義します。』な物と # 『割り当てられたリソースを解放するメソッドを定義します。』な物とがあります。 > (自作クラスはアンマネージリソースだと思っていたので、Disposeするよう > IDisposableを使用する必要があると思っていたんです。) managed resources とは、.NET で管理される資源の事です。対する unmanaged resources とは .NET 管理外の資源の事であり、たとえば API で「ハンドル」として扱われる物などは、アンマネージと言えます。 たとえば「ウィンドウ」は、OS によって管理されるものであり、 .NET にとってはアンマネージな資源にあたります。 OS にとって、Form や Button や TextBox は、すべてウィンドウの一種であり、 これらは、Control クラスというマネージ オブジェクト内で管理されています。 (Control そのものは、.NET で管理される managed なクラスである事に注意) # ウィンドウはウィンドウ ハンドル(HWND) という ID で管理されており、 # .NET からは、Handle プロパティでこの HWND を得ることができます。 作成したウィンドウは、使用後に破棄しなければいけないため、 それを保証するために、Control は IDisposable を実装しているのです。 なお、VB の InputBox 関数なども、ウィンドウを表示させてはいますが、 これは生成から破棄までが InputBox メソッド内で完結されているため、 利用側からは IDisposable として処理する必要がありません。 以下、InputBox 関数内部の実装イメージ。 Public Shared Function InputBox(パラメータ) As String Using box As New InternalInputBox(パラメータ) box.ShowDialog() Return box.InputedText End Using End Function > VB.netは「unsafe」キーワードが使用できないので、アンマネージは > 作られないということですね。 アンマネージ クラスを作る事はできませんが、 アンマネージ リソースを扱う事は少なからずあるでしょう。 その場合、アンマネージな資源を確実に後始末するために、 IDisposable を実装することができます。
分類:[.NET]
VS2008でVb.netを使用しています。
ShowDialogで開いた画面について質問があります。
ShowDialogで開いたにもかかわらず、終了時にDisposeをしないFormはどのよう
な問題が起こるのでしょうか?
下記のようなプログラムを作成した場合、何度もFormAからFormBを呼び出すと、
FormBのインスタンスを複数作成し、メモリを圧迫してしまうのでしょうか?
@FormAにあるボタンのClickイベント
・FormBのインスタンスを作成
・FormBをShowDialogで開くよう記載
・ShowDialogの後に、FormBのDisposeについて記載しない
AFormBのCloseイベント
・Disposeを記載しない
FormAのClickイベント
'フォーム(FormB)のインスタンスを作成
Dim fB As New FormB
'フォーム(FormB)を表示
f1.ShowDialog()
End Sub
FormBのClosedイベント
'なにもしない
End Sub
宜しくお願い致します。