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

Comentários

clau Brasil

quinta-feira, 17 de novembro de 2011 00:09

clau

ô velho não tô conseguindo implementar essas mudanças.

Se puder ajudar agradeço.

olha aí o cod
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, ExtCtrls, OleCtrls, SHDocVw;

type
  TForm1 = class(TForm)
    Panel1: TPanel;
    Button1: TButton;
    Edit1: TEdit;
    webteste: TWebBrowser;
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
begin
webteste.Navigate(Edit1.Text);
end;

end.

Os comentários estão fechados
Visitas: 2001467