[リストへもどる]   [VBレスキュー(花ちゃん)]
一括表示

投稿時間:2006/05/24(Wed) 21:55
投稿者名:とびた
Eメール:
URL :
タイトル:
イベント発生時の割り込み規制について
環境 WinXP-SP2 VB6.0-SP5


処理に3秒程度掛かるプロシージャ(たとえば検索処理プログラム)処理中に、
コマンドボタン等のイベントが発生した場合、
イベントの処理をおこなって、もとにプロシージャに戻ると思いますが、
このとき、元のプロシージャで”Dim”で宣言された変数は、値がクリアされてしまいますよね?

時間の掛かる処理中にイベントが発生した場合に、
イベントをフックしておいて、時間の掛かる処理が終わった後に
イベントでのプロシージャ処理をしたいと思うのですが、
みなさんは、どのように処理されているのでしょうか?

私自身、経験が浅い為、イベントの割込みが予想される部分は、
標準モジュールで”Public”で宣言されたグローバルな変数を使用して、
割り込み処理からの復帰後も継続して処理が行えるようにしているのですが、
もっと良い方法があるようなきがして質問させていただきました。

アドバイスを宜しくお願い申し上げます。

投稿時間:2006/05/25(Thu) 01:22
投稿者名:
Eメール:
URL :
タイトル:
Re: イベント発生時の割り込み規制について
> 環境 WinXP-SP2 VB6.0-SP5
>
>
> 処理に3秒程度掛かるプロシージャ(たとえば検索処理プログラム)処理中に、
> コマンドボタン等のイベントが発生した場合、
> イベントの処理をおこなって、もとにプロシージャに戻ると思いますが、
> このとき、元のプロシージャで”Dim”で宣言された変数は、値がクリアされてしまいますよね?
つまり、以下のようなことですか?
hogeを呼び出し中にイベントの処理を行っても、
hogeのローカル変数の値がクリアされているように見えませんが…?
(もしかして、再起呼び出しになっている…?)

Option Explicit
Private WithEvents cmd As CommandButton

Private Sub Form_Load()
    Set cmd = Me.Controls.Add("VB.CommandButton", "cmd")
    With cmd
        .Caption = "テスト"
        .Move 0, 0, 1000, 1000
        .Visible = True
    End With
    
    Me.Show
    
    Call hoge
    
End Sub

Private Sub cmd_Click()
    'イベント
    MsgBox "コマンドボタンが押されました"   '←何か処理をする
End Sub

Private Sub hoge()
    '長い処理
    Dim local_i         As Long
    
    Do
        Me.Caption = local_i
        local_i = local_i + 1
        DoEvents
    Loop
    
End Sub

Private Sub Form_Unload(Cancel As Integer)
    'アンロード
    Unload Me
End Sub

投稿時間:2006/05/25(Thu) 10:27
投稿者名:ダンボ
URL :
タイトル:
Re: イベント発生時の割り込み規制について
> イベントの処理をおこなって、もとにプロシージャに戻ると思いますが、
> このとき、元のプロシージャで”Dim”で宣言された変数は、値がクリアされてしまいますよね?

ここに誤解かコーディングミスがあると思います。
「変数のスコープ」を勉強すれば、プロシージャローカルで宣言された変数は、その外部の
プロシージャからは参照も変更もできないことを確信するでしょう。

想像1:外部からクリアされたように見えるが実はプロシージャ内部でクリアする場合があった。
想像2:割り込みロジック実行過程で当該プロシージャを呼んでいた。
想像3:実はその変数がプロシージャローカルでは無かった。

#想像2あたりではないかな

投稿時間:2006/06/01(Thu) 16:47
投稿者名:とびた
Eメール:
URL :
タイトル:
Re^2: イベント発生時の割り込み規制について
  も さん
ダンボ さん

私の勘違いのようでした。
ダンボさんのご指摘の動作をしておりました。

アドバイスありがとう御座いました。