terça-feira, 29 de setembro de 2015

Como definir o conteúdo de um TEdit em tempo de execução usando a função SendMessage() da API do Windows e a mensagem WM_SETTEXT

Embora o Delphi já nos forneça as ferramentas necessárias para definir o conteúdo de um TEdit em tempo de execução, é importante saber como realizar esta tarefa usando a API do Windows. Para isso, podemos usar a função SendMessage() em combinação com a mensagem WM_SETTEXT.

A função SendMessage() da API do Windows possui a seguinte assinatura em C/C++:

LRESULT SendMessage(          
  HWND hWnd,
  UINT Msg,
  WPARAM wParam,
  LPARAM lParam
);

No arquivo Windows.pas podemos encontrar o protótipo e corpo desta função convertidos para Object Pascal: 

// Protótipo
{$EXTERNALSYM SendMessage}
function SendMessage(hWnd: HWND; Msg: UINT; wParam: WPARAM; 
  lParam: LPARAM): LRESULT; stdcall;

// Implementação
function SendMessage; external user32 name 'SendMessageW';

Note que precisamos de um HWND (Handle) para a caixa de texto. Feito isso só precisamos enviar a mensagem WM_SETTEXT juntamente com o conteúdo a ser exibido no controle. Veja: 

procedure TForm1.Button1Click(Sender: TObject);
var
  texto: String;
begin
  // conteúdo a ser definido para a caixa de texto
  texto := 'Veja isso';

  // vamos definir o conteúdo usando a função SendMessage
  // fornecendo a mensagem WM_SETTEXT
  SendMessage(Edit1.Handle, WM_SETTEXT, 0, Integer(PChar(texto)));
end;

Veja que o parâmetro wParam da função SendMessage não é usado quando a mensagem é WM_SETTEXT. Desta forma só precisamos fornecer o valor 0.

Nenhum comentário:

Postar um comentário