Delphi é uma ferramenta de desenvolvimento de software visual orientada a objetos da Borland Company. Delphi combina as vantagens do Visual C++ e do Visual Basic: fácil de usar, poderoso e tem vantagens exclusivas, especialmente em design de interface, programação de banco de dados e programação de rede.
Mensagens em Delphi
Uma mensagem é uma notificação enviada pelo Windows que informa a um aplicativo que ocorreu um evento. No Delphi, na maioria dos casos, as mensagens do Windows são encapsuladas em eventos VCL. No entanto, se precisarmos escrever nossos próprios controles, interceptar ou filtrar mensagens, devemos nos aprofundar no mecanismo de processamento de mensagens.
No Delphi, as mensagens são definidas na forma de registros TMessage. Abra o arquivo Message.pas, podemos ver que Tmessage está definido assim:
tipo
TMessage = registro compactado
Mensagem: Cardeal;
caso Inteiro de
0: (WParam: inteiro longo;
LParam: Inteiro longo;
Resultado: Inteiro Longo);
1: (WParamLo: Palavra;
WParamOi: Palavra;
LParamLo: Palavra;
LParamOi: Palavra;
ResultadoLo: Palavra;
ResultadoOi: Palavra);
fim;
Entre eles, Msg é um valor constante diferente de outras mensagens. Esses valores constantes podem ser constantes predefinidas em unidades do Windows ou constantes definidas pelo usuário. Wparam geralmente é um valor constante relacionado a uma mensagem ou pode ser um identificador para uma janela ou controle. LParam geralmente é um ponteiro para dados na memória.
O resultado é o valor de retorno do processamento de mensagens. Wparam, Lparam e Result são todos de 32 bits. Se você deseja acessar os 16 bits inferiores ou os 16 bits superiores, você pode usar WparamLo, WparamHi, LParamLo, LparamHi, ResultLo e ResultHi respectivamente.
Além do Tmessage geral, um registro de mensagem especial é definido para cada Windows no Delphi. Podemos navegar no arquivo Message.pas e aqui está o registro da mensagem do teclado:
TWMKey = registro compactado
Mensagem: Cardeal;
CharCode: Palavra;
Não utilizado: Palavra;
Dados-chave: inteiro longo;
Resultado: Inteiro Longo;
Mensagens relacionadas ao teclado, como: registros WM_KEYDOWN, WM_KEYUP, WM_CHAR, WM_SYSKEYDOWN, WM_SYSKEYUP e WM_SYSCHAR também são definidas como TWMkey. Há a seguinte instrução no arquivo Message.pas:
TWMChar=TWMchave; TWMKeyDown=
TWMchave;TWMKeyUp=TWMchave;
-KeyDown=TWMchave;
TWMkey;TWMSysChar=TWMkey;
envio de mensagens
O processamento de mensagens serve para definir como o aplicativo responde às mensagens do Windows. No Delphi, cada mensagem tem seu próprio processo de processamento. Deve ser um método em um objeto e só pode passar um Tmessage ou outro registro de mensagem especial. Deve haver um comando de mensagem após a declaração do método, seguido por uma mensagem variando de 0. para Constante entre 32767.
As mensagens mencionadas anteriormente são todas mensagens padrão do Windows (WM_X). Além disso, existem mensagens internas VCL, mensagens de notificação e mensagens definidas pelo usuário.
As mensagens internas da VCL geralmente começam com "CM_" e são usadas para gerenciar coisas dentro da VCL. Se você alterar o valor de uma propriedade ou alguma outra característica de um componente, será necessário notificar outros componentes sobre a alteração por meio de mensagens internas. Por exemplo, a mensagem ativar foco de entrada é enviada para um componente ativado ou desativado para aceitar ou abandonar o foco de entrada.
Há também mensagens de notificação. Algo acontece com um controle filho em uma janela e a janela pai precisa ser notificada. Isso é feito por meio de mensagens de notificação. Funciona apenas com controles de janela padrão, como botões, caixas de listagem, caixas de edição, etc. Abra o arquivo Message.pas Após o padrão do Windows é a declaração da mensagem de notificação:
const
{$EXTERNALSYM BN_CLICKED}
BN_CLICKED = 0;
{$EXTERNALSYM BN_PAINT}
BN_PAINT = 1;
{$EXTERNALSYM BN_HILITE}
BN_HILITE = 2;
Acima estão as mensagens de notificação do botão, que indicam respectivamente que o usuário clicou no botão, que o botão deve ser redesenhado e que o usuário destacou o botão.
Os usuários também podem definir suas próprias mensagens, enviar mensagens para si próprios e escrever procedimentos de processamento de mensagens. O valor constante da mensagem é WM_USER+100 a $7FFF. Esse intervalo é reservado pelo Windows para mensagens definidas pelo usuário.
Existem três métodos para enviar mensagens Delphi:
1. Execute o método objeto da classe Tcontrol. Você pode enviar mensagens para qualquer formulário ou controle, basta saber a instância do formulário ou controle. Sua declaração é a seguinte:
função Tcontrol.Perform(Msg:Cardinal;Wparam,Lparam:Inteiro longo):Inteiro longo
2. Funções da API do Windows SendMessage() e Postmessage(). Sua declaração é a seguinte:
função EnviarMensagem (hWnd: HWND; Mensagem: UINT; wParam: WPARAM; lParam: LPARAM): LRESULT;
função EnviarMensagem (hWnd: HWND; Mensagem: UINT; wParam: WPARAM; lParam: LPARAM): LRESULT;
A função PostMessage adiciona uma mensagem à fila de mensagens do aplicativo. O loop de mensagens da aplicação extrairá a mensagem registrada da fila de mensagens e a enviará para a janela correspondente.
A função SendMessage pode enviar mensagens diretamente para o procedimento de janela na fila de mensagens. Portanto, SendMessage é usado quando o Windows precisa retornar um valor imediatamente, e PostMessage é usado quando diferentes aplicativos precisam processar mensagens em sequência. Perform é essencialmente semelhante ao SendMessage, eles são enviados diretamente para a janela de procedimento. As funções SendMessage e Postmessage só precisam conhecer o identificador da janela para enviar mensagens, para que possam enviar uma mensagem para um formulário não Delphi, mas Perform deve conhecer a instância do formulário ou controle.
Mecanismo de processamento de mensagens VCL
Existe a instrução application.Run no código fonte da aplicação Delphi. Sua função é iniciar o loop de mensagens e então chamar Application.PRocessMessage. Esta função encontrará uma mensagem na fila de mensagens da aplicação. Quando uma mensagem é recuperada da fila de mensagens, o evento Application.OnMessage é acionado. Desta forma, antes que o próprio Windows processe a mensagem, ele responderá ao processamento do evento OnMessage. É superior a qualquer processamento de mensagens e recebe apenas mensagens registradas, ou seja, as mensagens enviadas pelo PostMessage conforme mencionado acima. O processo de processamento que responde ao evento Application.OnMessage deve ser do tipo TmessageEvent, que é declarado da seguinte forma:
tipo TMessageEvent = procedimento (var Msg: TMsg; var Handled: Boolean) do objeto;
Onde TMsg é o registro da mensagem definido no Windows, podemos declará-lo assim:
Procedimento OnMyMessage(var Msg:TMsg;var Handled:Boolean);
Em seguida, atribua este método ao evento Application.OnMessage:
Application.OnMessage :=OnMyMessage;
O evento OnMessage irá capturar todas as mensagens enviadas para a aplicação, que é um evento muito movimentado, por isso não é aconselhável definir pontos de interrupção durante o processamento do evento OnMessage para processamento de mensagens.
O método usado pelo objeto VCL para receber mensagens é denominado MainWndProc. É um método estático definido na classe Twincontrol e não pode ser sobrecarregado. Ele não processa a mensagem diretamente. Quando a mensagem sai de MainWndProc, a mensagem é passada para o método WndProc do objeto. O método WndProc é um método virtual definido na classe Tcontrol, que chama o método Dispatch. O Dispatch procura o método de processamento correspondente com base na mensagem recebida. Se não conseguir encontrá-lo no final, ele continua procurando o método de processamento de mensagens na classe pai até que seja encontrado, ele chama o Defaulthandler. O método Defaulthandler executa o processamento final na mensagem e, em seguida, passa a mensagem para a função DefWindowProc do Windows ou outros procedimentos de janela padrão.