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