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!!!
9e175410-d9bf-4725-bd3d-66b500ae344d|0|.0