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