Informações pessoais Informações Pessoais
Ciência e Tecnologia Ciência e Tecnologia
Embarcadero Delphi Delphi
Para Sua Área Profissional Área Profissional

 

Delphi Delphi

Pgina sobre a Linguagem
de programao da Embarcadero

Criando um Navegador Web com TWebBrowser

03-09-2013

Na paleta Internet, h um componente chamado WebBrowser (da classe TWebBrowser), o qual podemos usar para construir um pequeno - porm eficiente - navegador Web. Coloque um WebBrowser no seu formulrio e adicione tambm uma Toolbar (paleta Win32), que servir de barra de ferramentas. Na Toolbar, use o boto direito do mouse para colocar os botes de Voltar, Avanar e Pgina Inicial ("Home").

Faa o download de um modelo pronto para voc estudar e modificar. O exemplo contm cones que voc poder usar para ilustrar seu navegador e que tambm foram usados neste artigo.

  Clique em cada boto criado e modifique a propriedade Name de cada um para BtVoltar, BtPaginaInicial e BtAvancar, respectivamente (note que no se usa  "" em nomes de componentes e objetos).

Voc tambm pode aumentar o tamanho dos botes da Toolbar para que eles possam abrigar figuras maiores. Basta clicar na Toolbar e, nas propriedades ButtonHeight e ButtonWidth, alterar os valores para 32, indicando que os botes tero, agora, altura e largura iguais a 32 pixels.

Coloque, ainda, um componente Edit (paleta Standard) na Toolbar para servir de barra de endereos. Assim, podemos us-lo para digitar os endereos web. Inclua, ainda, uma StatusBar (paleta Win32), que ser nossa barra de status. Ela ficar posicionada, automaticamente, no rodap do formulrio. Aps estas modificaes e de ajustar os componentes adequadamente na tela, a aparncia de seu aplicativo dever estar semelhante ilustrao abaixo:
 

Para que os botes contenham cones, adicione um ImageList (paleta Win32). Nele, voc pode adicionar cones que representem as opes de Voltar, Pgina Inicial e Avanar. Neste artigo, foram usadas figuras capturadas na Internet em diversos sites:





Fazendo o WebBrowser acessar um site

O mtodo Navigate() do componente WebBrowser o responsvel pela navegao. Basta passar para ele, entre parnteses, o endereo do site desejado. No nosso caso, passaremos como parmetro o Edit1.Text, j que ele quem contm a URL a ser acessada. Clique no Edit e, na guia Events do Object Inspector, procure o evento OnKeyDown. Este evento ocorre sempre que uma tecla no teclado pressionada. Vamos us-lo para que, quando o usurio pressionar ENTER sobre o Edit, o WebBrowser acesse o link desejado.  Clique duas vezes em OnKeyDown para gerar o cabealho para ele e, ento, digite o seguinte:

//Cdigo para o evento OnKeyDown do Edit1
  if Key = VK_RETURN then
    WebBrowser1.Navigate(Edit1.Text);
 

J que qualquer pressionamento de tecla faria o navegador acessar o site digitado em Edit1, precisamos testar, primeiro, se a tecla pressionada foi ENTER, atravs da linha Key = VK_RETURN. Se no fizssemos isso, o WebBrowser tentaria acessar o site ainda no momento da digitao do endereo.

Para os botes Voltar, Pgina Inicial e Avanar, respectivamente, use a codificao mostrada abaixo:

//Cdigo para o boto Voltar
  WebBrowser1.GoBack;

//Cdigo para o boto Pgina Inicial
  WebBrowser1.GoHome;

//Cdigo para o boto Avanar
  WebBrowser1.GoForward;
 

A aparncia do seu navegador deve estar, agora, semelhante a esta:


Para que os botes Voltar e Avanar funcionem sem falhas, no entanto, necessrio, acrescentar algo mais nos cdigos. que, quando no h sites para os quais voltar ou avanar, uma mensagem de "Erro no especificado" aparece na tela:

 

Para evitar isso, modifique o cdigo dos botes Voltar e Avanar para que fiquem conforme a seguir:

//Novo cdigo para o boto Voltar
  try
   WebBrowser1.GoBack;
  except

  end;


//Novo cdigo para o boto Avanar
  try
    WebBrowser1.GoForward;

  except
  end;

No Delphi, o bloco try-except impede que, em tempo de execuo, aparea qualquer mensagem de erro gerada pelos cdigos em seu interior. Portanto, colocando o mtodo GoForward e GoBack entre um try e um except, qualquer erro proveniente destas linhas no ser mostrado para o usurio final.
 

Codificando mensagens na Barra de Status (StatusBar)

No Internet Explorer, sempre que uma pgina est sendo carregada, podemos observar a mensagem "Carregando ..." no rodap da janela, da mesma forma que, ao ser finalizado o seu carregamento, vemos a mensagem "Concludo". Faremos o mesmo com nosso navegador. O WebBrowser tem eventos que permitem o tratamento adequado destas mensagens. So eles:

  • OnDownloadBegin:  evento que ocorre sempre que um item da pgina comea a ser carregado, seja ele uma figura, cdigo HTML, etc.
     

  • OnDownloadComplete: este evento ocorre sempre que um item (figura, cdigo HTML, etc.) terminou seu carregamento, independentemente de ter sido carregado com sucesso ou no.
     

  • OnDocumentComplete: este evento acontece sempre que o documento totalmente carregado na janela do WebBrowser.
     

  • OnNavigateComplete2: este evento acontece antes do DocumentComplete e serve para indicar que o link desejado foi "atingido" com sucesso, mas no que esteja necessariamente carregado por completo. No entanto, serve como contraponto ao DownloadComplete, uma vez que OnNavigateComplete2 somente ocorre se o documento realmente consegue atingir e, ao menos, iniciar o carregamento da pgina adequadamente.

A ttulo de exemplo, trataremos aqui os eventos OnDownloadBegin, OnDownloadComplete e OnNavigateComplete2:

//Cdigo para o evento OnDownloadBegin
procedure TForm1.WebBrowser1DownloadBegin(Sender: TObject);
begin
  StatusBar1.SimpleText := 'Carregando ...';
end;
 

//Cdigo para o evento OnDownloadComplete
procedure TForm1.WebBrowser1DownloadComplete(Sender: TObject);
begin
  StatusBar1.SimpleText := 'Concludo';
end;


//Cdigo para o evento OnNavigateComplete2
procedure TForm1.WebBrowser1NavigateComplete2(Sender: TObject;
const pDisp: IDispatch; var URL: OleVariant);
begin
  StatusBar1.SimpleText := 'Concludo';
  Edit1.Text := WebBrowser1.LocationURL;
end;

Nos cdigos apresentados, estamos atribuindo o texto desejado propriedade SimpleText, da StatusBar, responsvel por exibir mensagens na barra de status.

No evento OnNavigateComplete2, tambm interessante acrescentar um cdigo que atualize o endereo da barra de endereos (nosso Edit1) sempre que um link inicia seu carregamento adequadamente. Para isso, a linha Edit1.Text := WebBrowser1.LocationURL foi usada. Com ela, atravs da propriedade LocationURL do componente WebBrowser, conseguimos saber em qual site estamos atualmente. Se atribuirmos seu valor ao Edit1 (atravs de sua propriedade Text), o Edit1 mostrar a URL em que estamos naquele momento - o que todo navegador que se preza deve fazer.  Afinal, no teria cabimento voc navegar para um site e a barra de endereos continuar mostrando a URL da pgina anterior.
 

Acrescentando botes de "Imprimir" e "Atualizar pgina"

Duas outra funcionalidades teis so a de imprimir e atualizar pgina. A de atualizar a mais simples. Basta adicionar um novo boto na Toolbar e, aps renome-lo para BtAtualizar, digite o seguinte cdigo:

//Cdigo para o boto Atualizar
begin
  WebBrowser1.Navigate(Edit1.Text);

end;

Conforme pode-se perceber, "atualizar" uma pgina nada mais do que forar seu carregamento de novo e, para isso, basta invocarmos o mtodo Navigate() do WebBrowser novamente.

J para imprimir, a coisa diferente. necessrio executar um mtodo chamado ExecWB (presente na propriedade ControlInterface), responsvel por executar comandos e pass-los ao componente WebBrowser. O mtodo ExecWB recebe quatro parmetros:

  • OLECMDID: este parmetro indica qual ser o comando a ser passado ao navegador em questo. Vrios so reconhecidos e, dentre eles, podemos destacar: OLECMDID_PRINT, OLECMDID_SAVE, OLECMDID_NEW, OLECMDID_STOP, e outros. O que nos interessa aqui o OLECMDID_PRINT, responsvel pela impresso de documentos Web.
     

  • OLECMDEXECOPT: indica como executar o comando passado no primeiro parmetro. Os valores vlidos so apenas quatro:  OLECMDEXECOPT_DODEFAULT, OLECMDEXECOPT_PROMPTUSER, OLECMDEXECOPTDONTPROMPTUSER e OLECMDEXECOPT_SHOWHELP. Se passarmos o primeiro valor, o comando ser executado da maneira padro; o segundo valor pede que o usurio seja perguntado sobre o que deseja fazer; o terceiro diz para no questionar o usurio, e o ltimo valor diz para mostrar a caixa de dilogo de ajuda sobre o comando, mas sem execut-lo.
     

  • pvaIn: este parmetro recebe uma matriz de entrada do tipo Variant. O melhor a fazer aqui criar uma varivel do tipo OleVariant e pass-la como parmetro.
     

  • pvaOut: este parmetro recebe o resultado do comando executado - se houver algum resultado. Tambm deve-se criar, aqui, uma varivel do tipo OleVariant para armazenar qualquer que seja o resultado retornado pelo comando.


Dessa maneira, o nosso boto Imprimir pode ter o seguinte aspecto:

//Cdigo presente no boto Imprimir
procedure TForm1.BtImprimirClick(Sender: TObject);
var
  Valor1, Valor2: OleVariant;
begin
  WebBrowser1.ControlInterface.ExecWB(OLECMDID_PRINT, OLECMDEXECOPT_PROMPTUSER, Valor1, Valor2) ;
end;

O cdigo acima usa o comando OLECMDID_PRINT, para imprimir o documento, e utiliza o parmetro OLECMDEXECOPT_PROMPTUSER para que a caixa de dilogo de impresso seja apresentada ao usurio. Caso isso no seja desejado, pode-se passar OLECMDEXECOPT_DONTPROMPTUSER.


Salvando um documento da Internet

Para finalizar, vejamos como utilizar o WebBrowser para salvar a pgina atualmente vista na tela. Aqui ser necessrio utilizar a unit ActiveX do Delphi. Coloque-a, ento, na clusula uses do seu programa. Coloque tambm um objeto SaveDialog (paleta Dialogs) para que o usurio possa informar qual ser o nome de destino do arquivo.

Tambm precisaremos lidar com um tipo especfico e mais complexo de dados chamado COM. De uma maneira geral, COM (Component Object Model) uma plataforma da Microsoft criada em 1993 que permite a comunicao entre processos e a criao dinmica de objetos independente da mquina ou arquitetura utilizada.

A plataforma COM traz o que se chama de Interface, uma caracterstica que permite trabalhar com diversos recursos de software sem que seja necessrio conhecer detalhes sobre como ele foi concebido. Um bom exemplo da utilizao de interfaces o do prprio sistema operacional que, atravs de uma interface de programao de aplicativos, permite que os programas utilizem diversos recursos (tais como memria, CPU,  etc.) sem que os seus detalhes de implementao sejam conhecidos do programador. Este esquema isola e protege o sistema operacional de eventuais erros cometidos pela aplicao.

A plataforma COM especifica vrias interfaces-padro usadas para permitir a comunicao entre componentes. A principal delas a IUnknown, que traz os principais mtodos necessrios para lidar com o sistema e da qual todas as demais so derivadas. Ns iremos utilizar a interface IStream, que exposta por componentes que utilizam fluxo de dados e que possui os mtodos Read e Write, para realizar a leitura e a escrita do fluxo de dados.

Portanto, para gravar em disco uma pgina Web, precisamos da interface IStream, que implementa os mtodos de leitura e escrita, e de uma IPersistStreamInit que, de certo modo, faz do documento web um objeto "gravvel". Tambm precisaremos de um tipo de varivel chamada TFileStream, que permite que seja atribudo um nome de arquivo aos dados salvos via IStream. O cdigo do boto para salvar ficaria assim:


procedure TForm1.BtSalvarComoClick(Sender: TObject);
 var
 
PersistStream: IPersistStreamInit;
  Stream: IStream;
  FileStream: TFileStream;
begin
 if not Assigned(WebBrowser1.Document) then
  begin
   application.messagebox('Documento HTML no carregado','Documento Web',16);
   Exit;
  end;

 if SaveDialog1.Execute then begin
  PersistStream := WebBrowser1.Document as IPersistStreamInit;
  FileStream := TFileStream.Create(SaveDialog1.FileName, fmCreate);
  try
   Stream := TStreamAdapter.Create(FileStream, soReference) as IStream;
   if Failed(PersistStream.Save(Stream, True)) then
   application.messageBox('Falha ao salvar arquivo HTML!','Salvar arquivo',16);
  finally
   FileStream.Free;
  end;
 end;

end;

 

Por conter uma codificao muito diferente das demais realizadas at aqui, vale ainda algumas observaes. A primeira linha logo aps o begin, onde l-se if not Assigned(WebBrowser1.Document)...  diz funo que, se no houver nenhum documento web atribudo ("assigned") propriedade Document do WebBrowser porque no h nenhuma pgina carregada e, ento, uma mensagem de erro deve ser exibida. Mais ao final, onde l-se if Failed(PersistStream.Save(Stream, True))...  estamos verificando se houve alguma falha no salvamento dos dados da pgina web em disco, atravs da funo Failed  - que retorna true se os dados no foram salvos corretamente, e false se tudo transcorreu sem problemas.


Outras funcionalidades

Pode-se adicionar ainda outras funcionalidades ao seu navegador web. No exemplo disponvel para download, h um boto com a opo de abrir um arquivo HTML previamente armazenado em disco e um menu de opes, com os itens Abrir, Salvar Como, Imprimir e Sair.

Fonte: ASMC


Usando Virtual-Key Codes - 27-03-2015

Usando a classe TDictionary - 26-03-2015

Sua Primeira Aplicao FireMonkey - 22-03-2015

Efeitos de imagem no Delphi - 22-03-2015

Timer: criando um cronmetro - 10-09-2013

Criando um Tocador de udio com Playlist - 03-09-2013

Personalizando o DBNavigator - 01-09-2013

Como Esmaecer um Formulrio - 24-09-2010

Procure um assunto especfico:  

 

  - Todos os artigos -