初めて投稿させてもらいます。超初心者ですので色々宜しくお願い致します。
今やりたいこととしては、親フォームにボタンを作成し、そのボタンが押されたら別フォームを呼び出し、アニメーションを起動させるといったものです。そのアニメーションを途中キャンセルした際に親フォームを残しつつ自分のフォームを閉じるといったことをしたいのですが…。キャンセルボタンを押した時にメッセージボックスを出しそれでOKの返答が返ってきたらフォームを閉じるという作業を行っています。
Dim ret As Integer
Private Sub CancelButton_Click()
ret = MsgBox("本当によろしいですか?", vbOKCancel + vbQuestion + vbSystemModal, "キャンセルします")
If ret = vbOK Then
Unload Me
End If
End Sub
Private Sub Form_Load()
Dim st As Long
Dialog1.Show
'アニメーションファイルを表示する
'表示ファイルの指定及びオープン
Animation1.Open "filepath"
'再生開始
Animation1.Play
'10秒間表示
st = Timer
Do While Timer - st < 10
DoEvents
Loop
'再生を停止
Animation1.Stop
ret = MsgBox("完了しました", vbOKOnly, "")
If ret = vbOK Then
Unload Me
End If
End Sub
Private Sub Form_unLoad(Cancel As Integer)
set dialog1 = nothing
End Sub
結果としては一度フォームは閉じるのですが再びアニメーションが起動し永遠に続く感じです。
オブジェクトの解放等色々やってみましたが解決策がみつからず困ってます。
なにかいい方法はないでしょうか?
>DoEvents
が悪さしているのでしょう。
DoEvents中にボタンが押下されてUnload処理を行うがUnload処理終了後に
Do〜Loopに制御が戻り、
>Animation1.Stop
が実行されるところでAnimation1をロードするために対象フォームまでロード
いているのだと思います。
ボタンのところでは押下フラグだけ立てるようにしてDo〜Loopで監視するのも
一つの手ではないでしょうか?
キャンセルボタンが押された時にcancel_flgに1をたて、While〜Loop内でチェックを入れてみました。
'5秒間表示
st = Timer
Do While Timer - st < 5
If cancel_flg = 1 Then
Exit Sub
End If
DoEvents
Loop
その結果無事に抜けることができました。
しかし実行時エラー'364'既にアンロードされています。と出ます。
これってどういうことなんですか?何か回避する方法ってありますか?
Form内で自分をShow(?)しているのでLoadイベント抜けた後にShow関係のイベント
が走ろうとしているが、既にUnloadされているということではないですか?
例.(既にアンロードしています。)
- Form1側 -
Private Sub Command1_Click()
Load Form2
End Sub
- Form2側 -
Private Sub Form_Load()
Me.Show
Unload Me
End Sub
対策としてLoadイベントの中で10秒待ちの処理をしない。
Timerコントロールを使用してもいいし、探せば方法はいくらでもあると思います
よ。
例.Showはフォームをロードした側で書いてあげればいいですよ。
Private Sub Form_Load()
'再生開始
'現在の時間を取得
'100msタイマー開始
End Sub
Private Sub Form_Unload(Cancel As Integer)
'タイマーは止める
End Sub
Private Sub Timer1_Timer()
'キャンセルされていたらUnloadする。
'Load時に取った時間と現在時間を比較
'10秒立っていたらUnloadする
End Sub