TheCodeNaked

A VERDADE SOBRE EVENTOS (Copy)

(Tudo é Ponteiro, Loop e Mensagem)**

Prepare-se: isso não é conteúdo “introdutório”.
Isto é a base real de como aplicativos funcionam, mas que quase ninguém ensina.


Introdução

Quem programa Delphi desde sempre aprendeu a lidar com:

  • OnClick
  • OnChange
  • OnKeyPress
  • OnMouseMove
  • OnCreate
  • Timers
  • Forms que “respondem” a ações

Mas raramente alguém para e pergunta:

Como esse “evento” realmente chega no meu código?
Quem chama esse método?
Quando ele é chamado?
Qual mecanismo invisível está por trás disso?

A resposta é simples e universal:

Todo aplicativo com interface gráfica vive dentro de um loop infinito.
E os “eventos” que você conhece são apenas ponteiros para métodos que esse loop chama.

Nada mais.
Nada menos.

A seguir, vamos abrir a caixa preta que ninguém abre.


1. Todo aplicativo de GUI vive dentro de um loop infinito

Quando você executa um app Delphi (VCL ou FMX), o sistema chama:

Application.Run;

E o que Run faz?

while not Application.Terminated do
begin
    ProcessMessages; // lê mensagens do OS (mouse, teclado, redimensionamento)
    DispatchEvents;  // encaminha mensagens para controles
    DoIdle;          // timers, animações, OnIdle
end;

Enquanto isso ocorre:

  • Seu app nunca para.
  • Nunca “sai” desse loop.
  • Nunca dorme.
  • Ele só termina quando você fecha a janela.

Esse loop é o coração do aplicativo.

Sem este loop… nada acontece.


2. Mensagens vêm do sistema operacional

Sistemas operacionais enviam mensagens contínuas:

  • mouse move
  • mouse down
  • mouse up
  • tecla pressionada
  • tecla liberada
  • mudança de foco
  • redimensionamento
  • repintura
  • timer expirou
  • toque na tela (mobile)
  • gestos
  • eventos de sistema
  • etc.

No Windows, por exemplo:

MSG msg;
while (GetMessage(&msg, NULL, 0, 0)) {
    TranslateMessage(&msg);
    DispatchMessage(&msg);
}

Delphi só embrulha isso numa camada mais elegante.

Mas a essência é a mesma em:

  • Windows API
  • macOS / Cocoa
  • iOS UIKit
  • Android Looper
  • Java Swing
  • JavaFX
  • GTK
  • Qt
  • Electron
  • Browsers (Event Loop do JS)
  • Unity / Unreal
  • Godot
  • qualquer engine ou framework GUI do planeta

Todos seguem o mesmo padrão.


3. Eventos são apenas ponteiros para métodos

Pegue um botão:

Button1.OnClick := Button1Click;

Isso cria a impressão de que existe um “evento” mágico.

Mas na verdade o botão possui isto:

property OnClick: TNotifyEvent read FOnClick write FOnClick;

TNotifyEvent é:

type
  TNotifyEvent = procedure(Sender: TObject) of object;

Ou seja:

Um ponteiro para um método associado a um objeto.

O componente só armazena o ponteiro.
Ele não sabe o que está “por trás” do método.

Ele guarda assim:

FOnClick := @TForm1.Button1Click;

4. Quando o OS envia uma mensagem de click… o loop chama o ponteiro

Sequência real:

  1. O usuário clica.
  2. O OS manda mensagem WM_LBUTTONDOWN.
  3. O loop captura essa mensagem.
  4. Ele vê qual controle está sob o mouse.
  5. O controle interpreta: “ah, isso é um click”.
  6. O controle faz:
if Assigned(FOnClick) then
    FOnClick(Self); // chama o ponteiro

Fim.

O “evento” aconteceu.
Mas não existe sistema mágico.
Só ponteiro sendo chamado.


5. Quando você entende isso, entende EventBus instantaneamente

Porque o EventBus faz exatamente a mesma coisa:

  • Guarda ponteiros para métodos.
  • Agrupa esses ponteiros por tipo.
  • Quando algo acontece (Publish), percorre os ponteiros.
  • Chama cada um.

É literalmente a mesma mecânica que o Delphi usa:

Delphi “evento”EventBus “inscrição”
OnClickSubscribe<TEvent>
métodohandler
FOnClicklista de handlers
message loopPublish

Ambos são ponteiros sendo chamados no momento certo.


6. E quando você entende isso, entende por que SafeThread4D existe

SafeThread4D existe porque:

  • A UI é protegida pelo loop de mensagens.
  • Se outra thread chamar um ponteiro de UI fora do loop → crash.
  • Ou pior: comportamento indefinido.

O SafeThread4D sincroniza no main thread porque:

Todas as chamadas de métodos da UI têm que passar pelo loop, como o Delphi faz internamente.

7. E entende por que a UI congela

Quando você faz algo pesado no OnClick:

procedure TForm1.Button1Click(Sender: TObject);
begin
  Sleep(3000);
end;

Você está travando o mesmo loop que deveria:

  • processar mouse,
  • processar teclado,
  • repintar a tela,
  • responder a eventos,
  • rodar timers.

O loop não roda →
nenhum ponteiro é chamado →
nada funciona →
a UI congela.

Simples assim.


8. E entende por que Android dá ANR

ANR (Application Not Responding) acontece quando:

  • o loop principal não processa mensagens por 5 segundos.

Pois é o mesmo loop!


9. E entende por que “tudo é ponteiro” em Delphi

Porque objetos são ponteiros.
Métodos são ponteiros.
Funções são ponteiros.

O Delphi só disfarça tudo com nomes bonitos.


10. Conclusão: Com essa visão, você vira Arquiteto, não apenas programador

Quando você entende:

  • loop de mensagens,
  • ponteiros,
  • ciclo de vida,
  • desacoplamento,
  • chamadas indiretas,
  • UI thread,
  • concorrência cooperativa…

você finalmente entende como softwares realmente vivem.

O resto — componentes, frameworks, efeitos — é só camada superficial.


⭐ Se quiser, posso transformar este capítulo em:

  • vídeo script (YouTube)
  • post LinkedIn (curto)
  • artigo LinkedIn (longo)
  • capítulo de livro expandido (20 páginas)
  • conteúdo de aula para UNIGRAN
  • imagem explicativa (diagramas ASCII ou estilo Canva)
  • PDF com diagramas

Você escolhe.

Sobre o autor

TheCodeNaked

No TheCodeNaked, programar é consequência, não ponto de partida. Antes do código, vem a dúvida, a análise, o contexto. Não seguimos fórmulas — questionamos. Criar software é pensar com clareza. O resto é só digitação.

TheCodeNaked

Criar com clareza. Codificar com intenção.

TheCodeNaked

Ótimo! Você se inscreveu com sucesso.

Bem-vindo de volta! Você acessou com sucesso.

Você se inscreveu com sucesso o TheCodeNaked.

Sucesso! Verifique seu e-mail para acessar com o link mágico.

As suas informações de faturamento foram atualizadas.

Seu pagamento não foi atualizado