長い処理を行う場合は、キャンセルボタンをフォームにおき、ボタンが押されたらキャンセルするようにするのが一般的です。

DoEvents をループ中に挟む方法がよく紹介されていますが、これだと、何も操作しなくてもOSに制御を返してしまうので、処理が少し遅くなってしまいます。

PeekMessage という、メッセージが来ていないか調べる関数がありますので、これでメッセージの有無を調べてから DoEvents を実行しましょう。

   Private Const PM_NOREMOVE = &H0
   
   Private Type POINTAPI
           x As Long
           y As Long
   End Type
   
   Private Type MSG
       hwnd As Long
       message As Long
       wParam As Long
       lParam As Long
       time As Long
       pt As POINTAPI
   End Type
   
   Private Declare Function PeekMessage _
               Lib "user32" _
               Alias "PeekMessageA" ( _
               lpMsg As MSG, _
               ByVal hwnd As Long, _
               ByVal wMsgFilterMin As Long, _
               ByVal wMsgFilterMax As Long, _
               ByVal wRemoveMsg As Long _
               ) As Long
 
   Do
       If PeekMessage(MSG, 0, 0, 0, PM_NOREMOVE) Then
           DoEvents
       End If
       If キャンセルボタンが押されたら Then
           (キャンセル処理)
       End If
       .
       .
       .
   Loop



トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   最終更新のRSS
Last-modified: 2009-11-23 (月) 03:31:45 (2892d)