処理をキャンセルしフォームを閉じるには?


CCyou  2004-04-13 13:03:55  No: 112801  IP: [192.*.*.*]

初めて投稿させてもらいます。超初心者ですので色々宜しくお願い致します。
今やりたいこととしては、親フォームにボタンを作成し、そのボタンが押されたら別フォームを呼び出し、アニメーションを起動させるといったものです。そのアニメーションを途中キャンセルした際に親フォームを残しつつ自分のフォームを閉じるといったことをしたいのですが…。キャンセルボタンを押した時にメッセージボックスを出しそれで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

結果としては一度フォームは閉じるのですが再びアニメーションが起動し永遠に続く感じです。
オブジェクトの解放等色々やってみましたが解決策がみつからず困ってます。
なにかいい方法はないでしょうか?

編集 削除
GOD  2004-04-13 14:42:05  No: 112802  IP: [192.*.*.*]

>DoEvents
が悪さしているのでしょう。
DoEvents中にボタンが押下されてUnload処理を行うがUnload処理終了後に
Do〜Loopに制御が戻り、
>Animation1.Stop
が実行されるところでAnimation1をロードするために対象フォームまでロード
いているのだと思います。
ボタンのところでは押下フラグだけ立てるようにしてDo〜Loopで監視するのも
一つの手ではないでしょうか?

編集 削除
CCyou  2004-04-13 18:22:19  No: 112803  IP: [192.*.*.*]

キャンセルボタンが押された時に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'既にアンロードされています。と出ます。
これってどういうことなんですか?何か回避する方法ってありますか?

編集 削除
GOD  2004-04-15 17:58:44  No: 112804  IP: [192.*.*.*]

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

編集 削除