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
|