Delphi: TWebBrowser - Backspace e setas não funcionam. Veja como resolver

Estive essa semana criando um processo de atendimento online no sistema da empresa, onde o mesmo é aberto em um componente WebBrowser. Nada de muito complicado, mas me deparei com um problema no mínimo 'curioso'.

Ao tentar fazer o login na página aberta, percebi que ao tentar apagar o texto do login, que eu havia digitado errado, a tecla backspace simplesmente fazia a função de "tab". O mesmo ocorria com as setas do teclado. Comecei a buscar em alguns fóruns uma solução elegante, mas não achei nada em foruns do Brasil. Por fim encontrei a solução em um site de fora.

Agora eu trago a solução aos colegas, explicado em português ;)

 

Primeiramente, adicione a unit ActiveX em seu uses.

Agora, adicione a informação abaixo, bem no final de sua unit; ou seja, a cima do 'end.' final.


initialization
  OleInitialize(nil);

finalization
  OleUninitialize;


Aqui eu fiz algumas alterações, para evitar problemas no programa. Lembre-se que abaixo eu uso como form um Form1:TForm, como é de prache em exemplos em Delphi. Não esqueça de adaptar com base no nome do seu form!


Na área private do seu form, insira o seguinte:


private
  FOleInPlaceActiveObject: IOleInPlaceActiveObject;
  SaveMessageHandler: TMessageEvent;

  procedure MyMessageHandler(var Msg: TMsg; var Handled: Boolean);


Na implementação, adicione os códigos:

implementation

.... { bla blá...}

procedure TForm1.FormActivate(Sender: TObject);
begin
  SaveMessageHandler := Application.OnMessage;
  Application.OnMessage := MyMessageHandler;
end;

procedure TForm1.FormDeactivate(Sender: TObject);
begin
  Application.OnMessage := SaveMessageHandler;
end;

procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
  Application.OnMessage := SaveMessageHandler;
  FOleInPlaceActiveObject := nil;
end;

procedure TForm1.MyMessageHandler(var Msg: TMsg; var Handled: Boolean);
var
  iOIPAO: IOleInPlaceActiveObject;
  Dispatch: IDispatch;
begin
  { Cai fora caso o objeto já foi retirado da memória, para evitar 'paus' }
  if WebBrowser = nil then
  begin
    Handled := False;
    Exit;
  end;

  Handled:=(IsDialogMessage(WebBrowser.Handle, Msg) = True);

  if (Handled) and (not WebBrowser.Busy) then
  begin
    if FOleInPlaceActiveObject = nil then
    begin
      Dispatch := WebBrowser.Application;
      if Dispatch <> nil then
      begin
        Dispatch.QueryInterface(IOleInPlaceActiveObject, iOIPAO);
        if iOIPAO <> nil then
          FOleInPlaceActiveObject := iOIPAO;
      end;
    end;

    if FOleInPlaceActiveObject <> nil then
      if ((Msg.message = WM_KEYDOWN) or (Msg.message = WM_KEYUP)) and
         ((Msg.wParam = VK_BACK) or (Msg.wParam = VK_LEFT) or (Msg.wParam = VK_RIGHT)) then
        //nothing - do not pass on Backspace, Left or Right arrows
      else
        FOleInPlaceActiveObject.TranslateAccelerator(Msg);
  end;


end;

 

Não tem erro. Fazendo isso o problema é resolvido. Abraços, e até a próxima!!!


Posted by: Raphael Zimermann
Posted on: 18/10/2010 at 14:48
Tags: , ,
Categories: Desenvolvimento | Matérias | Tecnologia
Actions: E-mail | Kick it! | DZone it! | del.icio.us
Post Information: Permalink | Comentários (1) | Post RSSRSS comment feed

Visitas: 1661249