過去ログなど大変参考にさせていただいています。VB6、WinXPです
フォームを開いたままにしておき、スタートボタンよりWindowsの終了を選んだ際に、ファイルをコピーしてから終了させるという処理を行いたいと思っています。
Private Sub Form_QueryUnload(Cancel As Integer, UnloadMode As Integer)
If UnloadMode = vbAppWindows Then
Cancel = True
'//このへんにコピーの処理
End If
End Sub
としているのですが、コピーの量が多いのでWindowsが「このプログラムは応答していません」とメッセージを出してきてしまうのです。
このプロシージャが終わるまでcancelにならないのはなんとなくつかんだんですが、callなどで呼び出したとしてもcancelにならないし…
このプロシージャが終了した後に、他のプロシージャを呼び出す方法も思い浮かびません。
早くcancelを出すか、プロシージャ終了後に処理を行うといった手段がありましたらどうかよろしくお願いいたします。
簡単に思いつく方法としては
1タイマーを使う
2非同期な実行が出来る「何か」を使う。
多分1なら簡単に出来ると思います。
…でも、終了させたいときに「終わらない」のはちょっとデザインとして(orz)な感じです…
※「保存している」と確認できるメッセージを表示するウィンドウでも
追加してみるのといいかもしれません。
…それでも私はいやですが(ぇ
ぁ…と、思いついただけでテストしていない、と書くのを忘れました(orz
ありがとうございます。
実はどうしてもWin終了時にコピーしなくてはならなくて、しかもスタートボタンから終了を選ばさなければならないのです。
で、思いついた方法が、終了をキャンセルさせてコピーした後に、VBからWindowsをシャットダウンさせる…というものでして。
タイマーを使っても、Form_QueryUnloadがEnd subまでたとりつかないとcancelにならないみたいなんです。
>>※「保存している」と確認できるメッセージを表示するウィンドウでも
こんな感じでしょうか?
If UnloadMode = vbAppWindows Then
Cancel = True
'/コピーの処理
msgbox "保存してます"
End If
でもメッセージボックスをOKと押さないとcancelになってないみたいでして。
なにぶん初心者でくわかっていない私ですが、何卒良い方法をよろしくお願いいたします。
頑張っているようなので、コードを投下します。
ノ■ミ
'・フォーム:Form1.frmを作る
' ・タイマー:Timer1を貼り付ける
Option Explicit
Private Sub Form_Load()
With Timer1
.Enabled = False
.Interval = 1
End With
End Sub
Private Sub Form_QueryUnload(Cancel As Integer, UnloadMode As Integer)
If UnloadMode <> QueryUnloadConstants.vbFormCode Then
'Unloadステートメント以外で、
'自分の破棄が行われそうな場合は、その破棄を中断する。
Cancel = 1
Timer1.Enabled = True
End If
End Sub
Private Sub Timer1_Timer()
'自分の破棄が外部によって行われた。
Debug.Print "終了時に一回だけ呼ばれるタイマー"
'自分を破棄する
Unload Me
End Sub
※フォームの閉じるボタンを押した場合、
Timer1_Timer()はちゃんと呼び出されるみたいです。
…「ウィンドウズの終了」をする実験までやる元気が無かったので、
もしかしたら、「ウィンドウズの終了」の時はちゃんと動かないかもしれません。
ガッさんありがとうございます!
すごい!完璧です!!
私も早くこんな考え方ができるようにがんばります。
自分なりに考えてこんな風にアレンジしてみましたので報告まで。
If UnloadMode = vbAppWindows Then
Cancel = 1
Timer1.Enabled = True
ElseIf UnloadMode = vbFormCode Then
Call シャットダウンさせるプロシージャ
End If
-----------------------------------------------
Private Sub Timer1_Timer()
Call コピーをするプロシージャ
'自分を破棄する
Unload Me
End Sub
本当にありがとうございます
//ぬるぽ
すんません解決のチェックいれるの忘れてました。orz
最後のぬる○は叩けという指令のよーなので>( ´Д`)
ノシ<でゎ、さささん頑張ってくださいw
ツイート | ![]() |