OOP no VB: classe para bloquear e desbloquear janelas com segurança

Visual Basic, VB .NET, ASP, Active X, Access, SQL Server

OOP no VB: Classe para bloquear e desbloquear janelas com segurança

A função da API LockWindowUpdate bloqueia as atualizações da janela cujo hwnd lhe é passado como argumento até que LockWindowUpdate seja novamente chamada com o argumento 0&. A utilidade disto é que você pode querer fazer uma série de atualizações na interface gráfica sem ter que produzir o efeito piscante que resulta de uma alteração para a outra. Suponha que você tenha que excluir vários itens de uma ListView  em um loop que examina cada item. Para evitar que a janela seja redesenhada a cada item excluído, você pode chamar LockWindowUpdate no início do loop passando como argumento o hwnd da janela ou da ListView  e tornar a chamar LockWindowUpdate 0& no final do loop. O problema é quando se chama LockWindowUpdate e se esquece de chamá-la de volta antes de sair do procedimento. Se ocorrer um erro no procedimento,você também pode sair dele sem chamar LockWindowUpdate. Qualquer uma destas possibilidades resulta no congelamento da sua janela. 

Para evitar isto, podemos usar uma técnica simples de OOP no Visual Basic, que já usamos na classe CHourGlass. A idéia é aproveitarmos o fato de que o evento Terminate sempre ocorre na destruição de um objeto. Encapsulando as chamadas a LockWindowUpdate em uma classe e chamando LockWIndowUpdate 0& no tratamento do evento Terminate da classe, poderemos criar um objeto desta classe sempre que precisarmos chamar LockWindowUpdate e deixar que o objeto seja destruído na saída do procedimento que o utilizou. Na destruição do objeto, LockWindowUpdate 0& será chamada  automaticamente na ocorrência do evento Terminate. Com isto não teremos que nos preocupar com a chamada que desbloqueia a janela travada com LockWindowUpdate. 

Para criar a classe CLockWindowUpdate, adicione um módulo de classe ao seu projeto e nomeie-o CLockWindowUpdate. Adicione o código abaixo ao módulo de classe.

Option Explicit
Private Declare Function LockWindowUpdate Lib "user32" (ByVal hwndLock As Long) As Long

Public Sub LockWindow(hWnd As Long)

    'método para bloquear atualizações da janela
     LockWindowUpdate hWnd

End Sub

Public Sub UnLockWindow()

    'método para desbloquear atualizações da janela
     LockWindowUpdate 0&

End Sub

Private Sub Class_Terminate()
     LockWindowUpdate 0& 'desbloqueia na destruição do objeto
End Sub

Observação: Apenas uma janela pode ser bloqueada de cada vez.

Exemplo de uso:

Public Sub cmdAtualizarJanela_Click( )

   Dim olw As CLockWindowUpdate

   Set olw  = New CLockWindowUpdate

   olw.LockWindow Me.Hwnd

   Call AtualizaJanela

   ' Na saída, nada precisa ser feito, pois

   ' olw será destruído e LockWindowUpdate 0&

   ' será chamada automaticamente.

End Sub