Como anexar um evento para elementos de ligação IHTMLDocument2 em Delphi?
-
11-09-2019 - |
Pergunta
Eu estou usando este código para obter todos os links de um IHTMLDocument2:
procedure DoDocumentComplete(const pDisp: IDispatch; var URL: OleVariant);
var
Document:IHTMLDocument2;
Body:IHTMLElement;
Links:IHTMLElementCollection;
i:integer;
tmp:IHTMLElement;
begin
try
Document := (pDisp as IWebbrowser2).Document AS IHTMLDocument2;
Body := Document.body;
Links := Document.links;
for i := 0 to (Links.length-1) do
begin
tmp := (Links.item(i, 0) as IHTMLElement);
//tmp.onclick := HOW SHOULD I ADD THE CALLBACK HERE?
//ShowMessage(tmp.innerText);
end;
except
on E : Exception do
ShowMessage(E.ClassName+' error raised, with message : '+E.Message);
end;
end;
Como eu poderia anexar uma função / procedimento para .onclick para fazer uma tarefa simples como mostrar um alerta com o texto âncora quando o link é clicado?
Solução
Uma maneira é afundar eventos do TWebBrowser com um objeto que implementa IDispatch (como http: // groups.google.com/group/borland.public.delphi.oleautomation/msg/a57d99e0e52c78ce )
você deve definir
tmp.onclick := TEventObject.Create(callbackProcedure) as IDispatch;
Outras dicas
Eu não recomendaria usar os onxxx-manipuladores (como onClick) diretamente como este irá substituir qualquer manipulador previouly anexado. Isso pode realmente mudar / destruir o comportamento da página. Se você estiver trabalhando com uma página web que não está sob seu controle é melhor uso attachEvent :
(tmp as IHTMLElement2).attachEvent('onclick', callbackProcedureDisp);
E não se esqueça de separar com detachEvent :
(tmp as IHTMLElement2).detachEvent('onclick', callbackProcedureDisp);
Atenção: é possível anexar o mesmo manipulador várias vezes. Neste caso, o manipulador também ser chamado várias vezes.
Se você está interessado apenas em onclick você poderia apenas adicionar um manipulador para o elemento raiz e não têm de viajar através de todos os elementos. MSDN afirma que as bolhas de eventos, para que poderia simplesmente anexar um manipulador de eventos para o elemento do documento e verifique o membro srcElement do IHTMLEventObj cada vez que o evento é acionado.