2017年6月
        1 2 3
4 5 6 7 8 9 10
11 12 13 14 15 16 17
18 19 20 21 22 23 24
25 26 27 28 29 30  
無料ブログはココログ

« 2GBを超えるファイルがダウンロードできない | トップページ | ようやくK200Dにさわってきました »

2008.03.01

コントロールメニューの「閉じる」とCloseメソッドが同じ扱い!?

最近、VB6で作った自作ツールをVisual Basic 2008 Express Edtionを使ってVB .NETへ移行(というか作り直し)して遊んでいます。
単純なプログラムばかりなので簡単にできるだろうと思っていたのですが、それでもいろいろあるものです。

VB6では、コントロールメニューの「閉じる」をキャンセルさせるために、フォームのQueryUnloadイベントに以下のようなコードを書いていました。
    If UnloadMode = vbFormControlMenu Then
        Cancel = True
    End If
これと同じ事をVB .NET(.NET Framework 2.0以降)でやろうとすると、フォームのFormClosingイベントで
    If e.CloseReason = CloseReason.UserClosing Then
        e.Cancel = True
    End If
とやればよいそうです。


で、やってみたところ大問題が発生。
VB .NETのUserClosingというのは、コントロールメニューの「閉じる」だけでなく、Closeメソッドによる場合も含まれてしまうのです。
コントロールメニューから閉じられたのか、プログラム中から処理として閉じたのかを判断させたいのに、これでは判断できません。crying

ダイアログボックスなどの子画面ならDialogResultを使えるかな、と思いましたが、コントロールメニューの「閉じる」をクリックすると、勝手にCancelが設定されてしまうんですね……
さらに、コントロールメニューの「閉じる」を一度キャンセルすると、その後のFormClosingに渡ってくるCloseReasonは、DialogResultにOKやCancelを設定して流れてきた場合であっても必ずUserClosingになっています。
変な仕様ですね。
結局、インチキくさいフラグでも使うしかないのか?

VB .NETは便利なところも大いにある反面、大きな仕様変更に苦労することも多いですね。

« 2GBを超えるファイルがダウンロードできない | トップページ | ようやくK200Dにさわってきました »

パソコン・インターネット」カテゴリの記事

コメント

コメントを書く

コメントは記事投稿者が公開するまで表示されません。

(ウェブ上には掲載しません)

トラックバック

この記事のトラックバックURL:
http://app.cocolog-nifty.com/t/trackback/39755/40317885

この記事へのトラックバック一覧です: コントロールメニューの「閉じる」とCloseメソッドが同じ扱い!?:

« 2GBを超えるファイルがダウンロードできない | トップページ | ようやくK200Dにさわってきました »

にほんブログ村

Amazon.co.jp