Pergunta

Em algum código VB6, tenho um manipulador para um evento Collapse do TreeView:

Private Sub MyTree_Collapse(ByVal Node as MSComCtlLib.Node)

Isso é chamado sempre que um nó na árvore é recolhido, seja pelo usuário ou programaticamente.Acontece que, por meio de alguma execução indireta, pode acontecer que esse manipulador acabe dizendo a um nó para entrar em colapso, levando à recursão infinita.

Posso pensar em várias maneiras de esfolar esse gato, mas o que me parece mais simples é dizer ao TreeView para não gerar eventos por algum período de tempo.No entanto, não consigo encontrar uma ligação simples para me deixar fazer isso.Alguém fez isso com sucesso ou preciso acompanhar o estado de alguma outra maneira para poder responder adequadamente quando surgirem eventos recursivos?

Foi útil?

Solução

Acho que como muitos eventos no VB, ele não pode ser desligado.

Basta definir um sinalizador booleano como você sugeriu.

Outras dicas

@Phil - cheguei à mesma conclusão.Minha implementação de MyTree_Collapse agora se parece com isto (onde m_bHandlingCallback é uma variável de membro):

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

    m_bHandlingCallback = True
    DoSomeStuff
    m_bHandlingCallback = False
End Sub

Outra maneira no VB6 é ter uma alternativa WithEvents referência ao controle:

Private WithEvents alt as TreeView

e em Form_Load:

Private Sub Form_Load()
Set alt = MyTree
End Sub

Agora alt receberá muitos eventos como este:

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

Mas, durante o DoSomeStuff, os eventos são desenganchados - o que também se aplica a todos os outros eventos Subé para alt sem a necessidade de mudanças intrusivas.

Eu declararia a variável flag como STATIC no Sub.Isso evita tornar a variável global e faz com que ela mantenha seu valor entre as chamadas.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top