- - PR -
終了処理について
投稿者 | 投稿内容 | ||||||||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
|
投稿日時: 2007-04-04 15:01
グローバルではなく 「Private フィールド」 ですよね。
このメソッドを呼ぶ必要があるということですよね。 どうやって 「共通化」 しようとしているのでしょうか? 継承元のフォームに実装してフレームワーク化するのでしょうか...?
戻り値の型指定がありません。 遅延バインディングを防ぐためにも Option Strict On にしておきましょう。
このメソッドの戻り値は、いつも True になりますよね。(正常系の場合) これでは戻り値を返す意味がないと思います。 そうなると、「Closing 系のイベントで良いのでは」 という意見が出てきます。 (ShuU さんの投稿はまさにそういうことでしょう)
どのようなリソースを使っているのか存じませんが、 '破棄せねばならないほどもの' を、終了時にするというのは稀ではないでしょうか? (強制終了時など、破棄されない Case が増えてしまいます) '破棄せねばならないほどもの' は、使い終わったら即 Dispose が基本です。 そのために、Using ステートメントがあります。(7.1 以前は Try ~ Finally + Dispose パターン)
個人的には、普通の Windows アプリケーションには必要ないと思いますね。 通信関係で保険として用いることはありましたが、多くの場合はそれほど意味がありません。 _________________ C# と VB.NET の入門サイト じゃんぬねっと日誌 | ||||||||||||||||||||||||
|
投稿日時: 2007-04-04 15:41
すみません、勝手に脳内でVB6の話と思って回答してました…。 VB6ならMsgBoxとかにカッコつける必要ないのに。 | ||||||||||||||||||||||||
|
投稿日時: 2007-04-04 16:25
VB6 であっても "即時終了する" という部分は変わりありません。 _________________ C# と VB.NET の入門サイト じゃんぬねっと日誌 | ||||||||||||||||||||||||
|
投稿日時: 2007-04-04 17:06
やりたいことはまさにShuUさんが記述したことです
単純に新規でフォームを作成して ボタンを一つ付けそのボタンを押した時にエラーだと終了したいのですが それではプロセスが終了してくれません なぜ以下のコードでプロセスが終了しないのかがわからない状態です ------------------------------ Option Strict On Public Class frmMain Inherits System.Windows.Forms.Form Private m_bQuitFlg As Boolean = False Private Function fncA() As Boolean Return True End Function Private Function fncB() As Boolean Return False End Function Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click m_bQuitFlg = fncA() If m_bQuitFlg = False Then Me.Close() End If m_bQuitFlg = fncB() If m_bQuitFlg = False Then Me.Close() End If MessageBox.Show("OK!") End Sub Private Sub frmMain_Closed(ByVal sender As Object, ByVal e As System.EventArgs) Handles MyBase.Closed If m_bQuitFlg = False Then MessageBox.Show("NG!") End If End Sub End Class ------------------------------ | ||||||||||||||||||||||||
|
投稿日時: 2007-04-04 17:41
VB6の場合、.netと比較して即時終了することによる問題は少ないと思いますが。
| ||||||||||||||||||||||||
|
投稿日時: 2007-04-04 17:43
最初の投稿で、 > そもそも、Close メソッドの後に、そのインスタンス内で何かをすること自体が流儀に反していると思います。 と書かせて頂きました。 というのも、今回のような MessageBox.Show メソッド (内部的には、MessageBox.ShowCore(IWin32Window owner...)) のような場合に弊害が出ます。 Me.Close() を実行した後は、すぐプロシージャを抜けるようにしましょう。 そのためのキーワードも、これまでの投稿で見つけることができます。 _________________ C# と VB.NET の入門サイト じゃんぬねっと日誌 | ||||||||||||||||||||||||
|
投稿日時: 2007-04-04 17:46
皆さま、ありがとうございます
解決しました。 > Me.Close() が実行されたら、すぐプロシージャを抜けるようにしましょう。 > Return, Exit Sub... 既に出ていた答えに気付くことが出来ませんでした。 -------------------- m_bQuitFlg = fncA() If m_bQuitFlg = False Then Me.Close() ' 追記:終了 Exit Sub End If m_bQuitFlg = fncB() If m_bQuitFlg = False Then Me.Close() ' 追記:終了 Exit Sub End If MessageBox.Show("OK!") -------------------- >じゃんぬねっとさん Option Strict On の件 Try 〜 Catch の件 Private フィールドの指摘 ありがとうございました。 >ぽぴ王子さん ME.Close と End についての仕組みの解説 ありがとうございました 大変勉強になりました。 | ||||||||||||||||||||||||
|
投稿日時: 2007-04-04 18:19
確かに VB6 の場合は比較的即時終了による問題は少ないかもしれな いですね。 ただ、VB6 だと「VB がヨロシクやってくれている」というだけで、End ステー トメントで終了すること自体はあまり勧められないんじゃないのかな?と思 います。
解決してよかったです。 End ステートメントの是非はともかくとして、今回は Me.Close() が呼ば れた時点でイベントプロシージャを抜けると思いこんでいた部分に原因が あったかもしれませんね。 VisualStudio で開発しているのであれば、デバッグからステップ実行で 一行ずつ動作を確認してみるのも良いと思います。 また、MSDN で Me.Close() (この場合は Form.Close() メソッド かな) などについて調べてみるとか。わからないことがあったらすぐ調べるように すると、調べた結果が知識として蓄積されるので有効です。 調べたけれどわからないという場合は、問題点を整理した上で質問して みるのも良いかと。 # Form.Close() メソッドの「注意」はよく読むといいかもしれませんね _________________ ぽぴ王子@わんくま同盟 ぽぴ王子の人生プログラミング中 / ぽぴンち。 |