- PR -

終了処理について

投稿者投稿内容
じゃんぬねっと
ぬし
会議室デビュー日: 2004/12/22
投稿数: 7811
お住まい・勤務地: 愛知県名古屋市
投稿日時: 2007-04-04 15:01
引用:

ponさんの書き込み (2007-04-04 11:58) より:

' グローバル値
Private m_bQuitFlg As Boolean = False


グローバルではなく 「Private フィールド」 ですよね。

引用:

' 共通の終了処理


このメソッドを呼ぶ必要があるということですよね。
どうやって 「共通化」 しようとしているのでしょうか?

継承元のフォームに実装してフレームワーク化するのでしょうか...?

引用:

Private Function aplQuit(ByVal svMsg As String)


戻り値の型指定がありません。
遅延バインディングを防ぐためにも Option Strict On にしておきましょう。

引用:

Private Function aplQuit(ByVal svMsg As String)
  MsgBox(svMsg)
  Return True
End Function


このメソッドの戻り値は、いつも True になりますよね。(正常系の場合)
これでは戻り値を返す意味がないと思います。

そうなると、「Closing 系のイベントで良いのでは」 という意見が出てきます。
(ShuU さんの投稿はまさにそういうことでしょう)

引用:

' 各オブジェクトの破棄
XX.Dispose


どのようなリソースを使っているのか存じませんが、
'破棄せねばならないほどもの' を、終了時にするというのは稀ではないでしょうか?
(強制終了時など、破棄されない Case が増えてしまいます)

'破棄せねばならないほどもの' は、使い終わったら即 Dispose が基本です。
そのために、Using ステートメントがあります。(7.1 以前は Try ~ Finally + Dispose パターン)

引用:

Application.Exit()
' 念のため
End


個人的には、普通の Windows アプリケーションには必要ないと思いますね。
通信関係で保険として用いることはありましたが、多くの場合はそれほど意味がありません。

_________________
C# と VB.NET の入門サイト
じゃんぬねっと日誌
mio
ぬし
会議室デビュー日: 2005/08/25
投稿数: 734
お住まい・勤務地: 神奈川県
投稿日時: 2007-04-04 15:41
引用:

ぽぴ王子さんの書き込み (2007-04-04 11:27) より:
上記のアプリケーション メッセージ ループを使用する場合は、終了時のい
ろいろな処理を行うタイミングがわかっている(メッセージループを抜けたと
きということがわかる)わけですが、End ステートメントを使うとそういった
処理を無視して即時終了してしまいます。これはいけません。


すみません、勝手に脳内でVB6の話と思って回答してました…。
VB6ならMsgBoxとかにカッコつける必要ないのに。
じゃんぬねっと
ぬし
会議室デビュー日: 2004/12/22
投稿数: 7811
お住まい・勤務地: 愛知県名古屋市
投稿日時: 2007-04-04 16:25
引用:

mioさんの書き込み (2007-04-04 15:41) より:

すみません、勝手に脳内でVB6の話と思って回答してました…。


VB6 であっても "即時終了する" という部分は変わりありません。

_________________
C# と VB.NET の入門サイト
じゃんぬねっと日誌
pon
会議室デビュー日: 2007/04/04
投稿数: 5
投稿日時: 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
------------------------------
mio
ぬし
会議室デビュー日: 2005/08/25
投稿数: 734
お住まい・勤務地: 神奈川県
投稿日時: 2007-04-04 17:41
VB6の場合、.netと比較して即時終了することによる問題は少ないと思いますが。
じゃんぬねっと
ぬし
会議室デビュー日: 2004/12/22
投稿数: 7811
お住まい・勤務地: 愛知県名古屋市
投稿日時: 2007-04-04 17:43
引用:

ponさんの書き込み (2007-04-04 17:06) より:

単純に新規でフォームを作成してボタンを一つ付けそのボタンを押した時にエラーだと終了したいのですがそれではプロセスが終了してくれません
なぜ以下のコードでプロセスが終了しないのかがわからない状態です


最初の投稿で、

> そもそも、Close メソッドの後に、そのインスタンス内で何かをすること自体が流儀に反していると思います。

と書かせて頂きました。

というのも、今回のような MessageBox.Show メソッド
(内部的には、MessageBox.ShowCore(IWin32Window owner...)) のような場合に弊害が出ます。

Me.Close() を実行した後は、すぐプロシージャを抜けるようにしましょう。
そのためのキーワードも、これまでの投稿で見つけることができます。

_________________
C# と VB.NET の入門サイト
じゃんぬねっと日誌
pon
会議室デビュー日: 2007/04/04
投稿数: 5
投稿日時: 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 についての仕組みの解説
ありがとうございました

大変勉強になりました。

ぽぴ王子
ぬし
会議室デビュー日: 2006/03/24
投稿数: 475
お住まい・勤務地: お住まい:城・勤務地:城
投稿日時: 2007-04-04 18:19
引用:

mioさんの書き込み (2007-04-04 17:41) より:

VB6の場合、.netと比較して即時終了することによる問題は少ないと思いますが。


確かに VB6 の場合は比較的即時終了による問題は少ないかもしれな
いですね。
ただ、VB6 だと「VB がヨロシクやってくれている」というだけで、End ステー
トメントで終了すること自体はあまり勧められないんじゃないのかな?と思
います。


引用:

ponさんの書き込み (2007-04-04 17:46) より:

> Me.Close() が実行されたら、すぐプロシージャを抜けるようにしましょう。
> Return, Exit Sub...

既に出ていた答えに気付くことが出来ませんでした。


解決してよかったです。

End ステートメントの是非はともかくとして、今回は Me.Close() が呼ば
れた時点でイベントプロシージャを抜けると思いこんでいた部分に原因が
あったかもしれませんね。
VisualStudio で開発しているのであれば、デバッグからステップ実行で
一行ずつ動作を確認してみるのも良いと思います。
また、MSDN で Me.Close() (この場合は Form.Close() メソッド かな)
などについて調べてみるとか。わからないことがあったらすぐ調べるように
すると、調べた結果が知識として蓄積されるので有効です。
調べたけれどわからないという場合は、問題点を整理した上で質問して
みるのも良いかと。
# Form.Close() メソッドの「注意」はよく読むといいかもしれませんね
_________________
ぽぴ王子@わんくま同盟
ぽぴ王子の人生プログラミング中 / ぽぴンち。

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