Essa unit possui uma função que recebe um identificador de mensagem do Windows tipo WM_TIMER, WM_PAINT, WM_LBUTTONDOWN, WM_NCHITTEST e transforma numa string igual ao nome do identificador de sua constante para que você possa imprimir no form e saber de que mensagem se trata sem ter que consultar a documentação. Isso é muito útil no caso de você estar escrevendo um código que lida muito com as mensagens e precisa fazer Debug, aí você pode ir vendo todas as mensagens que são enviadas a cada evento que ocorre e saber exatamente porque as coisas estão acontecendo. Foi muito útil pra mim porque estava apanhando para resolver erros intermitentes num componente, e com esse código resolví com muita facilidade. Estou postando porque eu precisei e tive que escrever, na verdade tive que escrever um programa que escreveu a unit automaticamente, porque eu não iria escrever isso tudo no braço não. O computador pode muito bem escrever código de trabalho braçal sozinho. Bom, eu precisei e tive que fazer, mas agora quem precisar pode pegar aqui se quiser. Aí vai ->
Aí como se pode usar: Eu fiz uma lista no form que vai rolando a medida que são exibidas as mensagens, assim ->
Primeiro você declara uma StringList global na unit do form, tudo vai ser na unit do form, claro ->
implementation
var
List : TStringList;
Aí no final da unit antes do end. você coloca a inicialização e finalização ->
Aí você declara na interface Public do seu form o procedimento de janela, e a referencia ao original->
Public
ParentWProc : TWndMethod;
procedure MyWProc(var msg : TMessage);
A implementação dela deve ser ->
procedure TForm1.MyWProc(var msg : TMessage);
var
i : cardinal;
begin
ParentWProc(msg);
List.Add(MesToStr(msg.msg)+' W = '+IntToHex(msg.wParam,8)+' L = '+IntToHex(msg.lParam,8)+' R = '+IntToHex(msg.Result,8));
if (List.Count > 49) then List.Delete(0);
i:=0;
while (i <= List.Count-1) do
Begin
Canvas.TextOut(4,abs(Canvas.Font.Height)*i,List[i]+' ');
inc(i);
end;
end;
E no OnCreate do form deve-se salvar o WndProc do Form ->
ParentWProc:=WindowProc;
WindowProc:=MyWProc;
E no OnClose coloque ->
WindowProc:=ParentWProc;
Acho que é só isso. Isso deve fazer todas as mensagens que o Form recebe serem listadas numa lista rolante desenhada no Canvas do Form.
Pergunta
Thales Pontes Martins
Transformando mensagens do Windows em string:
Essa unit possui uma função que recebe um identificador de mensagem do Windows tipo WM_TIMER, WM_PAINT, WM_LBUTTONDOWN, WM_NCHITTEST e transforma numa string igual ao nome do identificador de sua constante para que você possa imprimir no form e saber de que mensagem se trata sem ter que consultar a documentação. Isso é muito útil no caso de você estar escrevendo um código que lida muito com as mensagens e precisa fazer Debug, aí você pode ir vendo todas as mensagens que são enviadas a cada evento que ocorre e saber exatamente porque as coisas estão acontecendo. Foi muito útil pra mim porque estava apanhando para resolver erros intermitentes num componente, e com esse código resolví com muita facilidade. Estou postando porque eu precisei e tive que escrever, na verdade tive que escrever um programa que escreveu a unit automaticamente, porque eu não iria escrever isso tudo no braço não. O computador pode muito bem escrever código de trabalho braçal sozinho. Bom, eu precisei e tive que fazer, mas agora quem precisar pode pegar aqui se quiser. Aí vai ->
Aí como se pode usar: Eu fiz uma lista no form que vai rolando a medida que são exibidas as mensagens, assim -> Primeiro você declara uma StringList global na unit do form, tudo vai ser na unit do form, claro -> Aí no final da unit antes do end. você coloca a inicialização e finalização -> Aí você declara na interface Public do seu form o procedimento de janela, e a referencia ao original-> A implementação dela deve ser -> E no OnCreate do form deve-se salvar o WndProc do Form -> E no OnClose coloque ->Acho que é só isso. Isso deve fazer todas as mensagens que o Form recebe serem listadas numa lista rolante desenhada no Canvas do Form.
Espero que seja útil.
Abraço.
Link para o comentário
Compartilhar em outros sites
0 respostass a esta questão
Posts Recomendados
Participe da discussão
Você pode postar agora e se registrar depois. Se você já tem uma conta, acesse agora para postar com sua conta.