Как прикрепить событие к элементам ссылки IHTMLDocument2 в Delphi?

Я использую этот код для получения всех ссылок из 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;

Как я могу прикрепить функцию/процедуру к .onclick, чтобы выполнить простую задачу, например, показать предупреждение с текстом привязки при нажатии на ссылку?


person Sebastian    schedule 02.12.2009    source источник


Ответы (2)


Один из способов — передавать события из TWebBrowser с помощью объекта, который реализует IDispatch (например, http://groups.google.com/group/borland.public.delphi.oleautomation/msg/a57d99e0e52c78ce)

ты бы поставил

tmp.onclick := TEventObject.Create(callbackProcedure) as IDispatch;
person jasonpenny    schedule 02.12.2009
comment
Спасибо, это выглядит полезным. Я это попробую. - person Sebastian; 02.12.2009

Я бы не рекомендовал использовать обработчики onXXX (например, onClick) напрямую, так как это заменит любой ранее прикрепленный обработчик. Это может фактически изменить/разрушить поведение страницы. Если вы работаете с веб-страницей, которая не находится под вашим контролем, лучше использовать attachEvent:

(tmp as IHTMLElement2).attachEvent('onclick', callbackProcedureDisp);

И не забудьте отсоединиться с помощью detachEvent:

(tmp as IHTMLElement2).detachEvent('onclick', callbackProcedureDisp);

Внимание: один и тот же обработчик можно прикрепить несколько раз. В этом случае ваш обработчик также будет вызываться несколько раз.

Если вас интересует только onclick, вы можете просто добавить один обработчик к корневому элементу и не проходить через все элементы. MSDN сообщает о событиях, поэтому вы можно просто прикрепить один обработчик события к элементу документа и проверять член srcElement IHTMLEventObj каждый раз, когда событие срабатывает.

person Heinrich Ulbricht    schedule 29.03.2010