[リストへもどる]
一括表示

投稿時間:2003/12/26(Fri) 10:49
投稿者名:孤軍奮闘
URL :
タイトル:
QueryUnloadとUnloadModeについて
ひさびさの投稿です。よろしくお願いします。
フォームが閉じられる原因を識別して、ある処理をしたいのですがうまくいきません。
詳しく説明すると・・・
VBとSQL-SERVER2000でC/Sシステムを構築しています。アプリの起動時にDB上にログを書込み
終了時にログを削除するというものです。しかしユーザーによっては、フォームをタスクバーに
隠したままWindowsの終了をしてしまうようなアホがいて、ログ情報が消えずに残ります。
で、FORMのQueryUnloadイベントにWindowsの終了によってフォームが閉じられた場合、ログ削除する
という命令をコーディングして、うまくいきました!同じようにタスクマネージャから閉じられる時
にもログ削除するようにしているのですが、削除されません。 どうしてなんでしょう?

Private Sub Form_QueryUnload(Cancel As Integer, UnloadMode As Integer)

If UnloadMode = vbAppWindows Or UnloadMode = vbAppTaskManager Then
   Call ログ削除
End If

End Sub

OS WinXP Pro,VB6.0 SP5です
よろしくお願いします。長文になりました。すいませんm(__)m

投稿時間:2003/12/26(Fri) 12:18
投稿者名:ak
Eメール:
URL :
タイトル:
Re: QueryUnloadとUnloadModeについて
> VBとSQL-SERVER2000でC/Sシステムを構築しています。アプリの起動時にDB上にログを書込み
> 終了時にログを削除するというものです。しかしユーザーによっては、フォームをタスクバーに
> 隠したままWindowsの終了をしてしまうようなアホがいて、ログ情報が消えずに残ります。

最初に言っておきますが、エンドユーザーの事を『アホ』と言うのは如何なものかと
思いますよ。
PCの知識のあまりない人でも簡単に使用できるアプリケーションを構築するのが
我々技術者の腕の見せ所です。こんな事も分からないのかと思っているうちは良い
システムは構築できないでしょう。

> で、FORMのQueryUnloadイベントにWindowsの終了によってフォームが閉じられた場合、ログ削除する
> という命令をコーディングして、うまくいきました!同じようにタスクマネージャから閉じられる時
> にもログ削除するようにしているのですが、削除されません。 どうしてなんでしょう?

> Private Sub Form_QueryUnload(Cancel As Integer, UnloadMode As Integer)
>
> If UnloadMode = vbAppWindows Or UnloadMode = vbAppTaskManager Then
>    Call ログ削除
> End If
>
> End Sub

デバッグは行ったのでしょうか?

答えから言っておくと、タスクマネージャーから終了されようが、ウィンドウズが終了されようが
終了時に必ずQueryUnloadイベントは発生します。もちろんUnloadModeもそれぞれの値が入ってきます。

但しQueryUnloadイベントの発生順はロードされた順に発生します。

例えばログ削除処理を行っているフォームの前にロードされたフォーム内で終了処理(End)を
しているとログ削除処理を行っているフォームのイベントは発生しません。

フォーム単体でテストしてみてください。
ちゃんとイベントが発生しUnloadModeも値が入ってきているはずです。

ということはそちらのプログラムのバグの可能性が高いです。
ログ削除処理のあるフォームのQueryUnloadイベントにたどり着くまでに他のフォームのイベントで
終了処理(End)されているとかエラーで落ちているとか原因は色々考えられます。

それらの問題を全てテストした上でQueryUnloadイベントがおかしいというのなら分かりますが
テストせずにQueryUnloadイベントの質問をするのはどうかと思います。

まず自分の作ったプログラムを疑ってかかるべきです。

エンドユーザーの事を『アホ』と言う前にプログラムに対する取り組み方を見直した方が良いと
思いますよ。

投稿時間:2003/12/26(Fri) 13:19
投稿者名:孤軍奮闘
URL :
タイトル:
Re^2: QueryUnloadとUnloadModeについて
> 最初に言っておきますが、エンドユーザーの事を『アホ』と言うのは如何なものかと
> 思いますよ。

私としたことが・・・とんだ失言を。すいません
私の場合のユーザー(エンドユーザー)=同期社員(狭義) 広義では全社員です。
お客様などを対象にしている発言ではありません、しかも会社からは技術者としても見てもらえません
(しかし大人としは失格ですので以降気をつけます)
デバックの件ですが、QueryUnloadイベントにブレークポイントの設定などいろいろ試しているのですが
このイベント自体で中断してくれまへん・・・全てのフォーム中にEndステートメントも記述していない
し・・・デバックの仕方が悪いんでしょうね〜 もう少しやれる所までテストしてみます。

投稿時間:2003/12/26(Fri) 13:45
投稿者名:孤軍奮闘
URL :
タイトル:
Re^3:完了報告
開発環境での実行テスト(VBのデザイン時の実行)に無理があったようです。

投稿時間:2003/12/26(Fri) 14:05
投稿者名:ak
Eメール:
URL :
タイトル:
デバッグ方法
> > 最初に言っておきますが、エンドユーザーの事を『アホ』と言うのは如何なものかと
> > 思いますよ。
>
> 私としたことが・・・とんだ失言を。すいません
> 私の場合のユーザー(エンドユーザー)=同期社員(狭義) 広義では全社員です。
> お客様などを対象にしている発言ではありません、しかも会社からは技術者としても見てもらえません
> (しかし大人としは失格ですので以降気をつけます)
> デバックの件ですが、QueryUnloadイベントにブレークポイントの設定などいろいろ試しているのですが
> このイベント自体で中断してくれまへん・・・全てのフォーム中にEndステートメントも記述していない
> し・・・デバックの仕方が悪いんでしょうね〜 もう少しやれる所までテストしてみます。

ブレイクポイントを張る方法だとイベントを取られる可能性があるのでログファイルをはくかDebug.Printで
出力する方が良いと思います。また実行ファイルにしなければでないバグもありますので気を付けてください。

参考までに私が良くやるデバッグの例を記述しておきます。
'(*.frm)
Private Sub Form_Initialize()
    Call gsbLogOutput(Me.Name & ":Form_Initialize")
End Sub

Private Sub Form_Load()
    Call gsbLogOutput(Me.Name & ":Form_Load")
End Sub

Private Sub Form_QueryUnload(Cancel As Integer, UnloadMode As Integer)
    Call gsbLogOutput(Me.Name & ":Form_QueryUnload:Cancel=" & Cancel & ":UnloadMode=" & UnloadMode)
End Sub

Private Sub Form_Unload(Cancel As Integer)
    Call gsbLogOutput(Me.Name & ":Form_Unload:Cancel=" & Cancel)
End Sub

'(*.bas)
Private Const DEBUG_LOG_PATH = "C:\Test.log"
'----------------------------------------------------------------------------------
'概要      :ログ出力
'パラメータ    :変数名        ,IO ,型        ,説明
'          :sValue        ,I  ,Boolean   ,出力する値
'          :[bFileOutput] ,I  ,Boolean   ,ファイル出力 True:有効 False:無効
'          :[bTimeStamp]  ,I  ,Boolean   ,タイムスタンプ付加 True:有効 False:無効
'説明      :ボタンの有効・無効を指定された状態にする
'----------------------------------------------------------------------------------
Public Sub gsbLogOutput(ByVal sValue As String, Optional bFileOutput As Boolean = True, _
                        Optional bTimeStamp As Boolean = True)
    Dim iFl As Integer
    
    If bTimeStamp Then sValue = Format(Now, "YYYY/MM/DD HH:MM:SS") & vbTab & sValue
    
    If bFileOutput Then
    
        iFl = FreeFile
        
        Open DEBUG_LOG_PATH For Append As #iFl
        
        Print #iFl, sValue
        
        Close #iFl
        
    Else
    
        Debug.Print sValue
        
    End If
    
End Sub

このようなログをはく関数を作っておけばデバッグの時にかなり助かります。

根気の要る作業ですが頑張ってください。

では。

投稿時間:2003/12/26(Fri) 14:21
投稿者名:孤軍奮闘
URL :
タイトル:
Re: デバッグ方法
最後まで付き合って頂き、恐縮している次第です。 ソフト開発するだけが私の仕事では
ないため、デバックを疎かにする傾向が染み付いてしまっていました・・・
最近は、年月かけて作ったソフトのバグだしに時間がかかる始末で。
akさんのデバック方法参考にさせて頂き、これからも頑張ります。
ありがとうございました。m(__)m

投稿時間:2003/12/26(Fri) 15:14
投稿者名:魔界の仮面弁士
Eメール:
URL :
タイトル:
Re: デバッグ方法
> 参考までに私が良くやるデバッグの例を記述しておきます。

私の場合は、コンパイル前はDebug.Print、コンパイル後は App.LogEventを利用しています。
結構便利ですよ。>LogEventメソッド