8 de fevereiro de 2010

Interagindo com HTML em programas Delphi e C++ Builder - parte II

Neste post, vou dar sequência ao anterior e mostrar como interagir com uma página HTML dentro de um programa desktop em Delphi - esquema que vale igualmente para o C++ Builder com a única ressalva de que nesse ambiente o nome do componente a ser usado é TCppWebBrowser ao invés de WebBrowser.

Na ABC71, exibimos uma página HTML para recepcionar os novos usuários de nosso ERP, apresentando-lhe uma espécie de tutorial da ferramenta. Uma caixa de seleção (checkbox) é apresentada no canto inferior esquerdo da página e permite ao usuário optar por remover a recepção, de modo que ela não é mais exibida quando ele se logar no sistema. Este efeito é obtido através da interceptação do evento de navegação na página HTML.

A caixa de seleção da página HTML que eu citei tem um evento de "clique" que força a navegação para uma URL controlada por mim. Através de um código javascript na página, eu adiciono a essa URL o status atual da caixa de seleção, isto é, se ela está marcada ou não. O trecho abaixo mostra o ponto do javascript em que a URL é redirecionada:
function ExibirClick () {
Exibir = ! Exibir;
if ( Exibir ) {
document.getElementById("img_exibir").src = "Checked.jpg";
location.href = "http://event-omega/?exibir=true";
}
else {
document.getElementById("img_exibir").src = "Unchecked.jpg";
location.href = "http://event-omega/?exibir=false";
}
}
Repare no endereço HTTP incluído na URL: http://event-omega/. Esse é um endereço que não existe de verdade. Ele está aí apenas para marcar posição já que minha aplicação Delphi pesquisará por esse nome para detectar que se trata da navegação que eu quero interceptar. Com isso, se tentar usar essa página sem o programa que intercepta a navegação, uma página de erro será exibida avisando que o endereço acessado não existe.

Repare ainda que é acrescentada à URL um texto iniciado por um sinal de interrogação (?). Este texto emula o padrão usado pela tag FORM de um HTML. Quando se configura a ação de uma tag Form para usar o método GET, o "clique" para submeter o conteúdo prepara a URL acrescentando-lhe a interrogação e uma sequência de pares de valores (que correspondem a parâmetros da aplicação e o respectivo valor de cada um) separados por um símbolo & (E Comercial). O navegador, então, usa a URL resultante para realizar a próxima navegação. No exemplo, apenas um parâmetro é acrescentado manualmente - exibir - que está assumindo o valor "false" ou "true", dependendo se a caixa está marcada ou não no HTML.

No programa Delphi que utilizará este HTML, devemos começar exibindo-o, através da função Navigate do TWebBrowser:
var lURL: String;
begin
lURL := 'file://' + ExtractFilePath(Application.ExeName) + 'bemvindo/BV_menu.html/';
FBrowser.Navigate(lURL);
end;
Agora, podemos responder ao evento de navegação OnBeforeNavigate2. Esse evento deve detectar que se trata da nossa URL, extrair os valores passados como parâmetros e utilizá-los conforme a necessidade.
if AnsiStartsStr ('http://event-omega/', URL) then
begin
lHtmlVars := TStringList.Create;
try
{ Captura apenas os parâmetros, isto é, o que vem após o sinal de interrogação }
lPos := AnsiPos ('?', URL);
lUrl := AnsiRightStr (URL, Length (URL) - lPos);
lHtmlVars.Add (lUrl);
finally
trataEvento (lHtmlVars);
FreeAndNil (lHtmlVars);
end;

{ cancela a navegação pois o tratamento já foi feito }
Cancel := true;
A presença de um StringList neste código é um atalho para facilitar o tratamento de pares de valores separados pelo sinal de igual (=). Valores com essas características adicionados a um StringList são acessados mais facilmente. Por exemplo, dentro da minha função trataEvento eu posso recuperar diretamente o valor do parâmetro 'exibir' enviado pelo HTML:
var lStrExibir: String;
begin
lStrExibir := AHtmlVars.Values ['exibir'];
Com o valor recuperado, posso armazenar a opção do usuário num banco de dados ou no Registry do Windows e não exibir mais a página quando ele se loga.

O programa de exemplo montado com Delphi 2005 pode ser baixado aqui.

Nenhum comentário :

Postar um comentário

OBS: Os comentários enviados a este Blog são submetidos a moderação. Por isso, eles serão publicados somente após aprovação.

Observação: somente um membro deste blog pode postar um comentário.