質問

一部の VB6 コードには、TreeView の Collapse イベントのハンドラーがあります。

Private Sub MyTree_Collapse(ByVal Node as MSComCtlLib.Node)

これは、ユーザーまたはプログラムによってツリー内のノードが折りたたまれるたびに呼び出されます。結局のところ、いくつかの回りくどい実行により、このハンドラーがノードに折りたたみを指示することになり、無限再帰が発生する可能性があります。

この猫の皮を剥ぐ方法は複数考えられますが、私にとって最も簡単だと思われるのは、一定期間イベントを発生させないよう TreeView に指示することです。ただし、これを実行させるための簡単な呼び出しが見つかりません。誰かがこれを成功させたことがありますか? それとも、再帰的なイベントが発生したときに適切に対応できるように、他の方法で状態を追跡する必要がありますか?

役に立ちましたか?

解決

VB の多くのイベントと同様に、これをオフにすることはできないと思います。

あなたが提案したように、ブールフラグを設定するだけです。

他のヒント

@Phil - 私も同じ結論に達しました。私の実装 MyTree_Collapse 次のようになります(ここで m_bHandlingCallback はメンバー変数です):

Private Sub MyTree_Collapse(ByVal Node as MSComCtlLib.Node)
    If m_bHandlingCallback Then Exit Sub

    m_bHandlingCallback = True
    DoSomeStuff
    m_bHandlingCallback = False
End Sub

VB6 のもう 1 つの方法は、代替手段を用意することです。 WithEvents コントロールへの参照:

Private WithEvents alt as TreeView

そしてで Form_Load:

Private Sub Form_Load()
Set alt = MyTree
End Sub

alt 次のようなイベントがたくさん受信されます。

Private Sub alt_Collapse(ByVal Node as MSComCtlLib.Node)
Set alt = Nothing
'DoSomeStuff'
Set alt = MyTree
End Sub

しかし、その間、 DoSomeStuff, 、イベントはフックされていません - これは他のすべてのイベントにも当てはまります Subのための alt 煩わしい変更を加える必要はありません。

Sub でフラグ変数を STATIC として宣言します。これにより、変数がグローバルになることが回避され、呼び出し間でその値が保持されます。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top