Obtenga la URL de un hipervínculo cuando el mouse se mueve sobre un documento TWebBrowser
losTWebNavegadorEl componente Delphi proporciona acceso a la funcionalidad del navegador web desde sus aplicaciones Delphi.
En la mayoría de las situaciones, utiliza TWebBrowser para mostrar documentos HTML al usuario, creando así su propia versión del navegador web (Internet Explorer). Tenga en cuenta que TWebBrowser también puede mostrar documentos de Word, por ejemplo.
Una característica muy interesante de un navegador es mostrar información de enlace, por ejemplo, en la barra de estado, cuando el mouse pasa sobre un enlace en un documento.
El TWebBrowser no expone un evento como 'OnMouseMove'. Incluso si tal evento existiera, se activaría para el componente TWebBrowser, NO para el documento que se muestra dentro de TWebBrowser.
Para proporcionar dicha información (y mucha más, como verá en un momento) en su aplicación Delphi utilizando el componente TWebBrowser, una técnica llamada ' hundimiento de eventos ' debe ser implementado.
Sumidero de eventos de WebBrowser
Para navegar a una página web usando el componente TWebBrowser, llame al Navegar método. los Documento propiedad del TWebBrowser devuelve un HTMLDocumento2 value (para documentos web). Esta interfaz se utiliza para recuperar información sobre un documento, para examinar y modificar los elementos HTML y el texto dentro del documento y para procesar eventos relacionados.
Para obtener el atributo 'href' (enlace) de una etiqueta 'a' dentro de un documento, mientras el mouse pasa sobre un documento, debe reaccionar ante el evento 'onmousemove' del IHTMLDocument2.
Estos son los pasos para recibir eventos para el documento cargado actualmente:
- Hundir los eventos del control WebBrowser en el Documento Completo evento generado por el TWebBrowser. Este evento se activa cuando el documento está completamente cargado en el navegador web.
- Dentro de DocumentComplete, recupere el objeto de documento de WebBrowser y absorba la interfaz HtmlDocumentEvents.
- Maneja el evento que te interesa.
- Limpiar el fregadero en el en Antes de Navegar2 - es entonces cuando el nuevo documento se carga en el navegador web.
Documento HTML OnMouseMove
Dado que estamos interesados en el atributo HREF de un elemento A, para mostrar la URL de un enlace sobre el que se encuentra el mouse, hundiremos el evento 'onmousemove'.
El procedimiento para obtener la etiqueta (y sus atributos) 'debajo' del mouse se puede definir como:
|_+_|
Como se explicó anteriormente, adjuntamos al evento onmousemove de un documento en el evento OnDocumentComplete de un TWebBrowser:
|_+_|¡Y aquí es donde surgen los problemas! Como puede suponer, el evento 'onmousemove' *no* es un evento habitual, como lo son aquellos con los que estamos acostumbrados a trabajar en Delphi.
El 'onmousemove' espera un puntero a una variable de tipo VARIANT de tipo VT_DISPATCH que recibe la interfaz IDispatch de un objeto con un método predeterminado que se invoca cuando ocurre el evento.
Para adjuntar un procedimiento de Delphi a 'onmousemove', debe crear un contenedor que implemente IDispatch y genere su evento en su método Invoke.
Aquí está la interfaz TEventObject:
|_+_|Aquí se explica cómo implementar el hundimiento de eventos para un documento mostrado por el componente TWebBrowser y obtener la información de un elemento HTML debajo del mouse.
Ejemplo de sumidero de evento de documento TWebBrowser
Descargar
Coloque un TWebBrowser ('WebBrowser1') en un formulario ('Form1'). Añadir un TMemo ('elementInfo')...
unidad unidad 1;
interfaz
usos
Windows, Mensajes, SysUtils, Variantes, Clases, Gráficos, Controles, Formularios,
Diálogos, OleCtrls, SHDocVw, MSHTML, ActiveX, StdCtrls;
escribe
TObjectProcedure = procedimiento de objeto ;
TEventoObjeto = clase (TInterfacedObject, IDispatch)
privado
FOnEvent: TObjectProcedure;
protegido
función GetTypeInfoCount(out Count: Integer): HResult; llamada estándar;
función GetTypeInfo(Index, LocaleID: Integer; out TypeInfo): HResult; llamada estándar;
función ObtenerIDsOfNames( constante IID: TGUID; Nombres: Puntero; NameCount, LocaleID: Entero; DispIDs: Puntero): HResult; llamada estándar;
función Invocar(DispID: Integer; constante IID: TGUID; LocaleID: Entero; Banderas: Palabra; estaba parámetros; VarResult, ExcepInfo, ArgErr: Puntero): HResult; llamada estándar;
público
constructor Crear( constante OnEvent: TObjectProcedure) ;
propiedad OnEvent: TObjectProcedure leer FOnEvent escribir FOnEvent;
final ;
TForm1 = clase (Forma T)
WebBrowser1: TWebBrowser;
información del elemento: TMemo;
procedimiento WebBrowser1BeforeNavigate2(ASender: TObject; constante pDisp: IDispatch; estaba URL, Banderas, TargetFrameName, PostData, Encabezados: OleVariant; estaba Cancelar: WordBool);
procedimiento WebBrowser1DocumentComplete(ASender: TObject; constante pDisp: IDispatch; estaba URL: OleVariante) ;
procedimiento FormCreate(Remitente: TObject) ;
privado
procedimiento Documento_AlMouseOver;
público
{ Público declaraciones }
final ;
estaba
Formulario1: TForm1;
htmlDoc : IHTMLDocumento2;
implementación
{$R *.dfm}
procedimiento TForm1.Document_OnMouseOver;
estaba
elemento: IHTMLElement;
empezar
si htmlDoc = nulo después Salida;
elemento := htmlDoc.parentWindow.event.srcElement;
elementoInfo.Borrar;
si Minúsculas(elemento.tagName) = 'a' después
empezar
elementInfo.Lines.Add('INFORMACION DEL ENLACE...') ;
elementInfo.Lines.Add(Format('HREF: %s',[element.getAttribute('href',0)])) ;
final
más si Minúsculas(elemento.tagName) = 'img' después
empezar
elementInfo.Lines.Add('Información de la IMAGEN...') ;
elementInfo.Lines.Add(Format('SRC : %s',[element.getAttribute('src',0)])) ;
final
más
empezar
elementInfo.Lines.Add(Format('TAG: %s',[element.tagName])) ;
final ;
final ; (*Documento_EnMouseOver*)
procedimiento TForm1.FormCreate(Remitente: TObject) ;
empezar
WebBrowser1.Navigate('http://delphi.about.com') ;
elementoInfo.Borrar;
elementInfo.Lines.Add('Mueve el ratón sobre el documento...') ;
final ; (*FormCrear*)
procedimiento TForm1.WebBrowser1BeforeNavigate2(ASender: TObject; constante pDisp: IDispatch; estaba URL, Banderas, TargetFrameName, PostData, Encabezados: OleVariant; estaba Cancelar: WordBool);
empezar
htmldoc := nulo ;
final ; (*WebBrowser1BeforeNavigate2*)
procedimiento TForm1.WebBrowser1DocumentComplete(ASender: TObject; constante pDisp: IDispatch; estaba URL: OleVariante) ;
empezar
si Asignado (WebBrowser1.Documento) después
empezar
htmlDoc := WebBrowser1.Documento como HTMLDocumento2;
htmlDoc.onmouseover := (TEventObject.Create(Document_OnMouseOver) como IDespacho) ;
final ;
final ; (*NavegadorWeb1DocumentoCompletado*)
{ TEventObjeto }
constructor TEventObject.Create( constante OnEvent: TObjectProcedure) ;
empezar
heredado Crear;
FOnEvent := OnEvent;
final ;
función TEventObject.GetIDsOfNames( constante IID: TGUID; Nombres: Puntero; NameCount, LocaleID: Entero; DispIDs: Puntero): HResult;
empezar
Resultado := E_NOTIMPL;
final ;
función TEventObject.GetTypeInfo(Index, LocaleID: Integer; out TypeInfo): HResult;
empezar
Resultado := E_NOTIMPL;
final ;
función TEventObject.GetTypeInfoCount(out Count: Integer): HResult;
empezar
Resultado := E_NOTIMPL;
final ;
función TEventObject.Invoke(DispID: Integer; constante IID: TGUID; LocaleID: Entero; Banderas: Palabra; estaba parámetros; VarResult, ExcepInfo, ArgErr: Puntero): HResult;
empezar
si (DispID = DISPID_VALUE) después
empezar
si Asignado (FOnEvent) después FOnEvento;
Resultado := S_OK;
final
más Resultado := E_NOTIMPL;
final ;
final .