3

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

Private Sub MyTree_Collapse(ByVal Node as MSComCtlLib.Node)

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

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

4

4 に答える 4

3

@フィル - 私は同じ結論に達しました。私の実装は次の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
于 2008-08-19T17:56:39.843 に答える
3

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すべてのイベントにも適用され、侵入的な変更を行う必要はありません。Subalt

于 2009-11-28T19:32:36.030 に答える
1

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

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

于 2008-08-19T02:43:58.220 に答える
0

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

于 2008-09-29T11:10:56.597 に答える