VB6 で TreeView がイベントを起動しないようにするには?
質問
一部の 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 として宣言します。これにより、変数がグローバルになることが回避され、呼び出し間でその値が保持されます。