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

Sincronizando Formulários


     Há ocasiões em que vários formulários exibem informações de um mesmo documento ou banco de dados simultaneamente e as alterações feitas em um formulário precisam ser refletidas imediatamente nos outros ou ao menos quando se tornarem ativos.

     Uma forma estruturada de lidar com este problema é criar uma rotina de nome comum e pública em todos os formulários que seja usada para atualizar o formulário conforme a fonte dos dados. Chamemos essas rotinas, por exemplo, de "AtualizarForm". Uma outra rotina, global, será encarregada de chamar a todas as rotinas "AtualizarForm" em todos os Form da aplicação. Chamemos essa rotina global de "AtualizarTodosForms". Sempre que uma alteração nos dados for produzida em um formulário, esse chamará a rotina central "AtualizarTodosForms" e essa se encarregará de chamar as rotinas "AtualizarForm" em todos os outros formulários para que tornem-se atualizados. No caso de o formulário que dispara o aviso de atualização não precisar ser atualizado, você pode incluir um argumento do tipo Form nomeado "oChamador" para indicar de onde partiu o aviso para as atualizações. Quando a rotina de atualização for chamada, o argumento pode ser testado para que o formulário saiba se este aviso partiu de outro formulário ou dele mesmo: "If oChamador Is Me Then Exit Sub".

     Em casos em que a atualização não necessite ser feita imediatamente, mas somente na ativação de cada form, pode ser incluída a verificação do formulário ativo no início de cada rotina "AtualizarForm". Caso o formulário não esteja ativo, uma variável booleana "bAtualizar" é posta em True para indicar a necessidade futura de atualização. No evento Activate do formulário, é sempre verificada essa variável. Quando ela estiver em True, é chamada a rotina "AtualizarForm" e em seguida a variável é posta em False. Veja abaixo o código fonte que exemplifica estas idéias.

-----------------------------------------
'Rotina "AtualizarTodosForms"
-----------------------------------------
Public Sub AtualizarTodosForms (Optional oChamador)

    On Error Resume Next

    Dim frm as Form

    If  Not IsMissing (oChamador) Then
          For Each frm in Forms
               Call frm.AtualizarForm (oChamador)
          Next frm
    Else
         For Each frm in Forms
              Call frm.AtualizarForm
         Next frm
    End If

End Sub

--------------------------------
'Rotina "AtualizarForm":
--------------------------------
Public Sub AtualizarForm (Optional oChamador)

     If Not IsMissing (oChamador) Then
          If oChamador Is Me Then Exit Sub
     End If

     'Usa a API GetActiveWindow para
     'obter o handle do form ativo
     If GetActiveWindow <> Me.hWnd Then
          'Não é form ativo: sinaliza necessidade
          'de atualização futura e sai
          bAtualizar = True
          Exit Sub
     End If

    ' Código que atualiza formulário vai aqui

End Sub

------------------------------
'Evento Form_Activate
------------------------------
Private Sub Form_Activate()

    If bAtualizar = True Then
         Call AtualizarForm  'não passa o form como argumento
         bAtualizar = False
    End If

End Sub


E-mail: codelines@codelines.com
Fone: (011) 6198-5137
Revisada: setembro 22, 2003.