- PR -

フォームが閉じるタイミング 〜VB.Net on CompactFramework 1.1〜

1
投稿者投稿内容
tani
会議室デビュー日: 2006/10/20
投稿数: 6
投稿日時: 2006-10-20 10:40
初めまして。taniと申します。
いつも勉強させていただいております。

WindowsCEの話ですが、ここより適切な会議室が見あたりませんでしたので、ここに投稿させていただきます。

VB.Net2003
.Net CompactFramework 1.1
WindowsCE .Net Emulator4.1
を使って開発をしています。

エントリポイントはモジュールで、
Application.Run()でメインメニューを呼び出しています。

このメインメニューからフォームを3階層ほどShowDialogで呼び出すと、
DialogResultを設定しても、Close()してもフォームが閉じられなくなります。
このとき、呼び出し元の処理はShowDialog()から進むのですが、子フォームは表示されたままです。
ちなみに、どのタイミングでも良いのでDispose()するとフォームが閉じます。
しかし、できることならDispose()はしたくありません。(WindowsCEで、処理が遅いため)
また、Hide()も試してみましたが、親フォームも一緒に隠れてしまうので使えません。

これの対処方法はありますでしょうか?

「WindowsCEでは、フォームの階層は2つまで」とかそのような制限があるのでしょうか?
どなたかご教授願えませんか?どうぞよろしくお願いします。

====サンプルプロジェクト(VB.Net2003)
http://tanimasan.sakura.ne.jp/hhtMainTest.zip
じゃんぬねっと
ぬし
会議室デビュー日: 2004/12/22
投稿数: 7811
お住まい・勤務地: 愛知県名古屋市
投稿日時: 2006-10-20 11:00
引用:

未記入さんの書き込み (2006-10-20 10:40) より:

DialogResultを設定しても、Close()してもフォームが閉じられなくなります。
このとき、呼び出し元の処理はShowDialog()から進むのですが、子フォームは表示されたままです。


Close メソッドは、デストローイ! ではなく WM_CLOSE に当たります。
見た目、閉じられない場合はあるでしょう。

引用:

ちなみに、どのタイミングでも良いのでDispose()するとフォームが閉じます。
しかし、できることならDispose()はしたくありません。(WindowsCEで、処理が遅いため)


とは言っても、ShowDialog メソッドで Form を表示した場合は、
Dispose メソッドを呼び出すことが義務づけられています。

コード:

    Try
        f1 = New Form1()
    Finally
        If Not f1 Is Nothing Then
            f1.Dispose()
        End If
    End Try


Show メソッドであれば、必要ないです。

_________________
C# と VB.NET の入門サイト
じゃんぬねっと日誌
tani
会議室デビュー日: 2006/10/20
投稿数: 6
投稿日時: 2006-10-20 13:03
引用:

じゃんぬねっとさんの書き込み (2006-10-20 11:00) より:
Close メソッドは、デストローイ! ではなく WM_CLOSE に当たります。
見た目、閉じられない場合はあるでしょう。
ShowDialog メソッドで Form を表示した場合は、
Dispose メソッドを呼び出すことが義務づけられています。



Dispose()が義務だったなんて。。。!!!勉強になります。
子フォームも孫フォームも標準のフォームでOn_Closeに何も書いていませんが、WM_CLOSEで閉じられない(こともある)仕様ってことなんですね。。。
「子フォームならClose()で閉じられて、孫フォームならClose()で閉じられない」という点に惑いました。

何にせよ、Disposeしないとダメなんですね。
ShowDialog、Disposeで検索したら下の記事が出てきました。<= 検索力の不足を感じますorz
http://forums.microsoft.com/MSDN-JA/ShowPost.aspx?PostID=614472&SiteID=7

引用:

http://msdn2.microsoft.com/ja-jp/library/c7ykbedk.aspx より

フォームがモーダル ダイアログ ボックスとして表示されている場合、閉じるボタン (フォームの右上隅の X が付いているボタン) をクリックするとフォームが非表示になり、DialogResult プロパティが DialogResult.Cancel に設定されます。モードレス フォームとは異なり、ユーザーがダイアログ ボックスの閉じるボタンをクリックするか、DialogResult プロパティの値を設定した場合には、Close メソッドは .NET Framework によって呼び出されません。その場合はフォームが非表示になるだけで、ダイアログ ボックスの新しいインスタンスを作成しなくてもそのフォームを再表示できます。ダイアログ ボックスとして表示されているフォームは Close メソッドで閉じられることはないため、フォームがアプリケーションで不要になった場合は、そのフォームの Dispose メソッドを呼び出す必要があります。



ん。。。。日本語が分からないorz。
「フォーム」と「ダイアログボックス」は違うのか。。。初めて知りました。

結論として、
「子フォーム.ShowDialog() はモーダルフォームとして表示される -> Close()で閉じられる」
「孫フォーム.ShowDialog() はモーダルダイアログとして表示される -> Close()で閉じられない」
というようなことだと思います。

もう少し、フォームとダイアログボックスについて勉強します。
とても勉強になりました。じゃんぬねっとさんありがとうございました。

[ メッセージ編集済み 編集者: 未記入 編集日時 2006-10-20 13:11 ]
じゃんぬねっと
ぬし
会議室デビュー日: 2004/12/22
投稿数: 7811
お住まい・勤務地: 愛知県名古屋市
投稿日時: 2006-10-20 14:57
引用:

未記入さんの書き込み (2006-10-20 13:03) より:

子フォームも孫フォームも標準のフォームでOn_Closeに何も書いていませんが、WM_CLOSEで閉じられない(こともある)仕様ってことなんですね。。。


見た目はそのように見えます。(見えました)
モーダルの制御は終了しますから、論理的には閉じられているのだと思います。

引用:

「子フォームならClose()で閉じられて、孫フォームならClose()で閉じられない」という点に惑いました。
結論として、
「子フォーム.ShowDialog() はモーダルフォームとして表示される -> Close()で閉じられる」
「孫フォーム.ShowDialog() はモーダルダイアログとして表示される -> Close()で閉じられない」
というようなことだと思います。


いえ、孫フォームだからというわけではないと思います。
通常は閉じられるものですから。

引用:

何にせよ、Disposeしないとダメなんですね。


本当は、Dispose しなくても何とかなる仕様であるハズなんですけどね...
何かが変なのは確かだと思います。

_________________
C# と VB.NET の入門サイト
じゃんぬねっと日誌
1

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