DOBON.NET DOBON.NETプログラミング掲示板過去ログ

[.net2003]×ボタンの実装について

分類:[.NET]

こんにちは

今作っているアプリなのですが、終了ボタンを押したときは、メッセージボックスで、
終了しますか?[はい][いいえ] と出しているのですが、
×ボタンを押すと確認することなくアプリが終了してしまいます。
終了ボタンと×ボタンで同じ事をするのに動作が違うのは気持ちが悪いので、
×ボタンを選択不可にしようと思いましたが、×ボタンのみ選択不可というプロパティがみつかりませんでした(サイズは固定なのでMaximizeBoxはFalseですが、
最小化ボタンは必要なため、ControlBoxをFalseにするのは無しです)。

考え方を変えてFormのClosedとCrosingでメッセージボックスを出して、[いいえ] を選択した時は、
アプリケーションの終了をキャンセルできないかと思ったのですが、実験したらどちらを選択しても、アプリが終了してしまいます。
(終了したら呼ばれるプロシージャなので当然と言えば当然ですが・・・)

どちらの方法でも良いので(欲を言えば方法があるのであれば勉強のために両方ですが)やり方を教えてください。 よろしくお願いします。
■No14863に返信(あおぞらさんの記事)
> 今作っているアプリなのですが、終了ボタンを押したときは、メッセージボックスで、
> 終了しますか?[はい][いいえ] と出しているのですが、
> ×ボタンを押すと確認することなくアプリが終了してしまいます。

そもそもここがおかしいので後の内容は割愛。
Closing イベントで実装しているならば、問題なく表示されるはず。
2006/02/06(Mon) 14:39:18 編集(投稿者)
2006/02/06(Mon) 14:38:38 編集(投稿者)

はいこーん様
早速の返信、ありがとうございます。

>>今作っているアプリなのですが、終了ボタンを押したときは、メッセージボックスで、
>>終了しますか?[はい][いいえ] と出しているのですが、
>>×ボタンを押すと確認することなくアプリが終了してしまいます。
>
> そもそもここがおかしいので後の内容は割愛。
> Closing イベントで実装しているならば、問題なく表示されるはず。

今までは
Private Sub SyuuryouButton_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles SyuuryouButton.Click
Dim Reary
REM 目的 アプリケーション終了ボタン処理
Reary = MsgBox("終了します。よろしいですか?", MsgBoxStyle.OKCancel, "確認") REM 終了確認
If Reary = vbOK Then REM OKボタンが押されたら
End REM アプリケーション終了
Else REM キャンセルなら
Exit Sub REM プロシージャ離脱
End If
End Sub
この処理をclosingにコピペしても駄目でした(終了ボタンは正常に動作していました)。

今度は
Private Sub SyuuryouButton_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles SyuuryouButton.Click
Close()
End Sub


Private Sub Form1_Closing(ByVal sender As Object, ByVal e As System.ComponentModel.CancelEventArgs) Handles MyBase.Closing
Dim Reary
REM 目的 アプリケーション終了ボタン処理
Reary = MsgBox("終了します。よろしいですか?", MsgBoxStyle.OKCancel, "確認") REM 終了確認
If Reary = vbOK Then REM OKボタンが押されたら
End REM アプリケーション終了
Else REM キャンセルなら
Exit Sub REM プロシージャ離脱
End If
End Sub

このように変更してみたら、終了ボタンも効かなくなりました。
Closingのはずなのですが・・・

症例として確かにダイアログは表示されますが、はいでもいいえでもプログラムが終了してしまいます。

よろしくお願いします。</pre></pre>
各ステートメント、イベントなど何も理解しないままに闇雲に実装しているように見えます。

■No14867に返信(あおぞらさんの記事)
> Dim Reary

型がないですね。

> End

End は正常終了を行うステートメントではありません。
Closing イベントに制御が移っている以上、何もする必要はありません。

> Exit Sub

無意味です。
e.Cancel = True を実装すべきです。

そのままなのでまずはご覧ください。

 フォームが閉じられるのをキャンセルする
 http://jeanne.wankuma.com/tips/form/closingcancel.html


_________________________________________________________________________
じゃんぬ - Microsoft MVP for Visual Developer C#
  http://jeanne.wankuma.com/
  http://blogs.wankuma.com/jeanne/
じゃんぬねっと様
早速の返信、ありがとうございます。

> 各ステートメント、イベントなど何も理解しないままに闇雲に実装しているように見えます。

基本が独学で本に書いてある、Webサイトに乗ってて動くからとりあえず使う・・・
って事をやっていたのが露骨に裏目に出ました。
自分の理解度を超えているコードを”超技術”なんて言って逃げていては駄目ですね・・・ 恥ずかしい限りです。


> ■No14867に返信(あおぞらさんの記事)
>>Dim Reary
>
> 型がないですね。

本には型を記述するほうが望ましい 程度にしか書いていなかったのと、
型を記述しないと勝手にキャストしてくれて楽と解釈しています。
100箇所以上の修正になりそうですが(OptionStrictをONにしたら102箇所エラーが
出ました・・・)修正してみようと思います。

>>End
> End は正常終了を行うステートメントではありません。
> e.Cancel = True を実装すべきです。

早速実装しました。期待通りの動作になりました。
e.Cancelなんて便利なものがあったなんて知りませんでした。



End ステートメントは、プログラムを強制的に停止させる手段を提供しています。オブジェクトへの参照を保持している他のプログラムおよび実行中のコードがなくなると、すぐにプログラムは終了します。

MSDNでEndを調べてみました。
プログラムを強制終了させる方法だったんですね・・・
本にEndを書けばプログラムは終了します程度にしか書いていなかったのと、
20年以上昔ですが、MSX-BASICを少しやっていて、普通の終了命令がEND
だったのであまり深く考えずに使っていました。
同じBASICでも全然意味合いが違うところが面白いですね。(ぇ)

ありがとうございました。これにて問題解決とさせていただきます。
解決済み!
■No14872に返信(あおぞらさんの記事)
> 本には型を記述するほうが望ましい 程度にしか書いていなかったのと、
> 型を記述しないと勝手にキャストしてくれて楽と解釈しています。

うーん、遅延バインディングなども絡んできます。
コンパイル解決できるかそうでないかはかなり大きいです。
実行速度にも多少なりとも影響しますし、何より見ていて見やすいのが利点だと思います。

> 100箇所以上の修正になりそうですが(OptionStrictをONにしたら102箇所エラーが
> 出ました・・・)修正してみようと思います。

そうですね、Option Strict On で強制しましょう。(^^)

> 早速実装しました。期待通りの動作になりました。
> e.Cancelなんて便利なものがあったなんて知りませんでした。

イベントに何かを実装する時は、イベント引数も適当に見てやってください。
だいたい欲しいものが揃っています。(.NET Framework はサービス指向)
たとえば、キー系のイベントの引数には、どのキーが押されたのかを示すプロパティが存在します。


_________________________________________________________________________
じゃんぬ - Microsoft MVP for Visual Developer C#
  http://jeanne.wankuma.com/
  http://blogs.wankuma.com/jeanne/
解決済み!
> ×ボタンを選択不可にしようと思いましたが、×ボタンのみ選択不可というプロパティがみつかりませんでした(サイズは固定なのでMaximizeBoxはFalseですが、
> 最小化ボタンは必要なため、ControlBoxをFalseにするのは無しです)。

私のメールマガジン「.NETプログラミング研究」第63号で紹介していますので、よろしければ参考にしてみてください。

まぐまぐ - .NETプログラミング研究 -
http://blog.mag2.com/m/log/0000104516/106832576?page=1#106832576
解決済み!
じゃんぬねっと様
管理人様

返信ありがとうございます。
Option Strict ONにしてDim 〜 As をとりあえず全部書いてみたら、
静的バインディングの都合でStrict OFFにしないといけなくなりました。
VerUP時の課題にするためにとりあえずはStrict OFFでコンパイルして
コメントで書き直しマークをつけておきました。

×ボタンの機能をつぶすコードの紹介、ありがとうございます。
話し合いの結果、×ボタンは押せるようにして欲しいとの事なので、
実装はしませんがゆっくり読んで勉強します。
ありがとうございました。
解決済み!

DOBON.NET | プログラミング道 | プログラミング掲示板