Delphi3 comenzó a tener el componente Twebbrowser, pero apareció en forma de controles ActiveX en ese momento y necesitaba ser introducido por sí mismo en el posterior 4.0 y 5.0, apareció como uno de los grupos de componentes de Internet después de encapsular shdocvw.dll. El panel de componentes está encendido. A menudo escucho que la gente regaña a Delphi por hacerlo muy mal. será más.
Aquí hay algunas experiencias sobre el uso de Twebbrowser para hacer programas y algunos ejemplos e información recopilados de Internet, con la esperanza de brindar ayuda a los amigos que están interesados en programar con Twebbrowser.
1. Inicialización y finalización
Cuando ejecuta un método de twebbrowser para realizar la operación deseada, como ExecWB, etc., es posible que haya encontrado errores como "tratar de activar el objetivo faltante no registrado" o "objeto OLE no registrado", o no hay error pero no hay error pero no hay error. No está hecho. Cuando lo usé para programar, descubrí que ExecWB a veces funciona, pero a veces no funciona. También fue una oportunidad accidental que me di cuenta de que los objetos OLE necesitan ser inicializados y terminados (hay muy pocas cosas para entender).
Utilicé el método mencionado en mi artículo anterior "Delphi Program Window Animation & Solutions para el mosaico de disposición normal". ¡Finalmente lo hice! La razón, creo que probablemente se deba a que Twebbrowser es un objeto OLE incrustado y no es un VCL escrito en Delphi.
Inicialización
Oleinitialize (nulo);
Finalización
intentar
Oleuninitialize;
excepto
fin;
Estas oraciones se colocan después de todas las declaraciones en la ventana principal, antes del "final".
-------------------------------------------------- ---------------------------------
2. EmpActyParam
En Delphi 5, el método de navegación de twebbrowser se sobrecarga varias veces:
Procedimiento navegación (URL const: Widestring);
procedimiento navegación (const url: widestring; var bandas:
Olevariant);
procedimiento navegación (const url: widestring; var bandas:
Olevariant;
procedimiento navegación (const url: widestring; var bandas:
Olevariant;
Olevariant);
procedimiento navegación (const url: widestring; var bandas:
Olevariant;
Olevariant;
En aplicaciones reales, al llamar al último método, ya que rara vez usamos los últimos parámetros, pero la declaración de función requiere parámetros variables, el método general es el siguiente:
varilla
T: Olevariant;
Comenzar
webbrowser1.navigate (edit1.text, t, t, t, t);
fin;
Es muy problemático definir la variable T (y todavía hay muchos lugares para usarlo). De hecho, podemos usar EmpAcyParam en su lugar (SacParam es una variable vacía de variante común, no le asigne un valor), solo una oración:
WebBrowser1.navigate (edit1.text, showyParam, showyParam, showyParam, showyParam);
Aunque es un poco más largo, es mucho más conveniente que definir variables cada vez. Por supuesto, el primer método también se puede usar.
webbrowser1.navigate (edit1.text)
-------------------------------------------------- ---------------------------------
3. Las operaciones de comando comunes se pueden completar utilizando el método ExecWB.
procedimiento execwb (cmdid: olecmdid; cmdexecopt:
Olecmdexecopt);
procedimiento execwb (cmdid: olecmdid; cmdexecopt: olecmdexecopt;
var pVain:
Olevariant);
procedimiento execwb (cmdid: rolecmdid; cmdexecopt:
Olecmdexecopt;
Olevariant;
Abierto: aparece el cuadro de diálogo "Abrir la dirección de Internet", y el commandId es olecmdid_open (si la versión del navegador es IE5.0,
Entonces este comando no está disponible).
Guardar como: llame al cuadro de diálogo Guardar como.
ExecWB (OLECMDID_SAVEAS, OLECMDEXECOPT_DODEFAULT,
SewyParam,
ShowParam);
Imprimir, imprimir la vista previa y la configuración de la página: llame a los cuadros de diálogo "Imprimir", "Vista previa de impresión" y "Configuración de la página" (IE5.5 y arriba solo admiten las versiones "Tipo"
Vista previa de impresión, por lo que la implementación debe verificar si este comando está disponible).
ExecWB (OLECMDID_PRINT, OLECMDEXECOPT_DODEFAULT,
SewyParam,
ShowParam);
Si QuerystatusWB (olecmdid_printpreview) = 3 entonces
ExecWB (OLECMDID_PRINTPREVIEW, OLECMDEXECOPT_DODEFAULT,
SewyParam, vacío);
ExecWB (OLECMDID_PAGESETUP, OLECMDEXECOPT_DODEFAULT,
SewyParam,
ShowParam);
Cortar, copiar, pegar, seleccionar todo: no hay necesidad de decir mucho sobre la función, es importante tener en cuenta que cortar y pegar no solo proporciona texto para editar marcos, sino también no editar en las páginas web.
El texto del cuadro de edición también es efectivo. Obtener su estado de habilitación de comando
Hay dos formas de ejecutar comandos (tomar una copia como ejemplo, cortar, pegar y seleccionar todos reemplazará las palabras clave respectivas.
Simplemente cámbielo, a saber, corte, pegue y seleccione, respectivamente):
A. Use el método QueryStatusWB de Twebbrowser.
if (querystatusWb (olecmdid_copy) = olecmdf_enabled) o
Olecmdf_supported) entonces
ExecWB (OLECMDID_COPY, OLECMDEXECOPT_DODEFAULT,
SewyParam,
ShowParam);
B. Use el método de consulta de CommandenAnted de IHTMLDOCUMENT2.
varilla
Doc: ihtmlDocument2;
Comenzar
Doc: = webbrowser1.document como ihtmlDocument2;
Si doc.QueryCommandEnabled ('Copiar') entonces
Doc.execCommand ('Copy', False, VacyParam);
fin;
Búsqueda: consulte la novena función "Buscar".
-------------------------------------------------- ---------------------------------
4. Tamaño de fuente
Similar a los cinco elementos de "máximo" a "mínimo" en el menú "fuente" (correspondiente a los enteros 0 ~ 4, más grandes, etc., suponiendo que los nombres de los cinco elementos del menú son los siguientes, etiqueta
Las propiedades se establecen en 0 ~ 4 respectivamente).
A. Lea el tamaño de fuente de la página actual.
varilla
T: Olevariant;
Comenzar
Webbrowser1.execwb (olecmdid_zoom,
Olecmdexecopt_dontpromptuser,
ShowyParam, t);
Caso T de
4: más grande. Verificado: = verdadero;
3: más grande. Verificado: = True;
2: Middle.ecked: = True;
1: Small.Calked: = True;
0: más pequeño. Comprobado: = True;
fin;
fin;
B. Establezca el tamaño de la fuente de la página.
Más grande. Verificado: = falso;
Más grande. Comprobado: = falso;
Middle.ecked: = false;
Small.ecked: = false;
Más pequeño.ecked: = false;
Tmenuitem (remitente) .COLKED: = True;
t: = tmenuitem (remitente) .tag;
Webbrowser1.execwb (olecmdid_zoom,
Olecmdexecopt_dontpromptuser,
t, t);
-------------------------------------------------- ---------------------------------
5. Agregar a los favoritos y organizar los favoritos
estúpido
Clsid_shelluihelper: tguid =
'{64AB4BB7-111E-11D1-8F79-00C04FC2FBE1}';
varilla
p: procedimiento (mango: thandle; ruta: pChar);
procedimiento tForm1.organizeFavorite (remitente: tobject);
varilla
H: hwnd;
Comenzar
H: = loadLibrary (pchar ('shdocvw.dll'));
Si h <> 0 entonces
Comenzar
p: = getProcaddress (h, pchar ('doorganizefavdlg'));
Si se le asigna (p), entonces p (Application.Handle,
Pchar (favfolder));
fin;
Freelibrary (h);
fin;
procedimiento tForm1.Addfavorite (remitente: tobject);
varilla
Shelluihelper: ishelluihelper;
URL, Título: Olevariant;
Comenzar
Título: = webbrowser1.locationName;
Url: = webbrowser1.locationUrl;
Si url <> '' entonces
Comenzar
Shelluihelper: = createComobject (clsid_shelluihelper) como
Ishelluihelper;
Shelluihelper.addfavorite (url, título);
fin;
fin;
El método de usar el método anterior para abrir el cuadro de diálogo "Agregar a favoritos" a través de la interfaz ISHELLUIHELPER es relativamente simple, pero hay un inconveniente, es decir, la ventana abierta no es una ventana de modo, pero es independiente de la aplicación. Es concebible que si usa el mismo método que el procedimiento OrganizeFavorite para abrir el diálogo, puede implementar naturalmente la ventana de modo porque puede especificar el mango de la ventana principal (el efecto es lo mismo que abrir el "Agregar a los favoritos" diálogo en Explorer e IE). El problema es obviamente esto. ¿No importaba si era una ventana de patrón?
El siguiente proceso le indicará el prototipo de función de Doaddtofavdlg. Cabe señalar que el cuadro de diálogo abierto de esta manera no realiza la operación "Agregar a los favoritos". Quiere colocar el atajo de Internet.
procedimiento tForm1.addfavorite (es decir: TembedDedWb);
procedimiento createUrl (aurlpath, aurl: pchar);
varilla
Urlfile: Tinifile;
Comenzar
Urlfile: = tinifile.create (string (aurlpath));
rlfile.writeString ('InternetShortcut', 'url',
Cadena (aurl));
rlfile.Free;
fin;
varilla
Addfav: función (mango: thandle;
Urlpath: pchar;
Título: PCHAR;
Favidlist: pitemidlist): bool;
FDOC: ihtmlDocument2;
Urlpath, url, título: array [0..max_path] de char;
H: hwnd;
Pidl: Pitemidlist;
FRETOK: BOOL;
Comenzar
Fdoc: = ihtmlDocument2 (ie.document);
Si fdoc = nil entonces salga;
StrpCopy (título, fdoc.get_title);
StrpCopy (url, fdoc.get_url);
Si url <> '' entonces
Comenzar
H: = loadLibrary (pchar ('shdocvw.dll'));
Si h <> 0 entonces
Comenzar
ShgetSpecialFolderLocation (0, csidl_favorites, pidl);
Addfav: = getProcAddress (h, pchar ('doaddtofavdlg'));
si se asigna (addfav) entonces
Fretok: = addfav (manejo, urlpath, sizeof (urlpath),
Título, sizeof (título), Pidl)
fin;
Freelibrary (h);
Si fretok entonces
CreateUrl (urlpath, url);
fin
fin;
-------------------------------------------------- ---------------------------------
6. Haga un enfoque de Browser WebBrowser
Twebbrowser es muy especial.
Explorer en sí tiene teclas de acceso directo, la solución es la siguiente:
procedimiento tForm1.setFocustodoc;
Comenzar
Si webbrowser1.document <> nil entonces entonces
con webbrowser1.Application como lo hace IOLEObject
Doverb (oleiverb_uiActivate, nil, webbrowser1, 0, manejo,
GetClientRect);
fin;
Aparte de eso, también encontré una manera más fácil, que se enumera aquí:
Si webbrowser1.document <> nil entonces entonces
Ihtmlwindow2 (ihtmlDocument2 (webbrowser1.document) .parentwindow) .cocus
Acabo de encontrar una manera más fácil, quizás la más fácil:
Si webbrowser1.document <> nil entonces entonces
Ihtmlwindow4 (webbrowser1.document) .cocus
Además, debe determinar si el documento ha ganado el enfoque:
Si ihtmlwindow4 (webbrowser1.document) .hasfocus entonces
-------------------------------------------------- ---------------------------------
7. Haga clic en el botón "Enviar"
Así como hay un botón "predeterminado" en cada formulario en el programa, cada formulario en la página web también tiene un botón "predeterminado", es decir, un botón con el atributo "enviar". es equivalente a hacer clic en "enviar" en el mouse. Sin embargo, Twebbrowser no parece responder a la tecla ENTER, e incluso si la tecla clave del formulario que contiene el twebbrowser está configurado en verdadero, las teclas enviadas por el usuario a Twebbrowser no pueden interceptarse en el evento KeyPress del formulario.
Mi solución es usar el componente AppliatineVents o escribir el evento OnMessage del objeto TAPPLICATION por usted mismo, juzgar el tipo de mensaje y responder al mensaje del teclado. En cuanto a hacer clic en el botón "Enviar", puede hacerlo analizando el código fuente web, pero he encontrado un método más simple y rápido. Alguien más escribió.
A. Use la función SendKeys para enviar la tecla ENTER a WebBrowser
En Delphi
5 Hay un archivo sndkey32.pas en el directorio de información/extras/sendkeys en el CD, que contiene dos funciones sendkeys y apactivate. Es muy simple.
SendKeys ('~', true); // Presione la tecla de retorno
La descripción detallada del parámetro de la función sendkeys, etc., se incluye en el archivo sndkey32.pas.
B. Pase el mensaje de teclado recibido a WebBrowser en el evento OnMessage.
Procedimiento TForm1.ApplicationEvents1Message (var msg: tmsg;
Var manejado: booleano);
{corrige el mal funcionamiento de algunas claves dentro de WebBrowser
control}
estúpido
Stdkeys = [vk_tab, vk_return];
Extkeys = [vk_delete, vk_back, vk_left, vk_right];
claves extendidas}
fextended = $ 01000000;
Comenzar
Manejado: = falso;
con msg do
if ((mensaje> = wm_keyfirst) y (mensaje <= wm_keylast)))
y
((wparam en stdkeys) o
{$ Ifdef ver120} (getKeyState (vk_control) <0) o {$ endif}
(wparam en extkeyes) y
((lparam y fextended) = fextended)) entonces
intentar
if ischild (handle, hwnd) entonces {maneja todo el navegador
Mensajes relacionados}
Comenzar
con {$ ifdef
Ver120} aplicación _ {$ else} aplicación {$ endif} como
IoleinplaceactiveObject do
Manejado: = tradureAccelerator (msg) = s_ok;
Si no se maneja entonces
Comenzar
Manejado: = verdadero;
TranslateMessage (MSG);
DispatchMessage (MSG);
fin;
fin;
excepto
fin;
fin;
(Este método proviene de InbeddedWB.pas)
-------------------------------------------------- ---------------------------------
8. Obtenga el código fuente de la página web y HTML directamente desde Twebbrowser
Primero introduzcamos un método extremadamente simple para obtener el código fuente de la página web a la que está accediendo Twebbrowser. El método general es utilizar la interfaz ImperSisttreamInit proporcionada por el objeto de documento en el control de twebbrowser para implementarlo. Tamaño del código fuente HTML, asigne el bloque de memoria de Heap global, cree una secuencia y luego escriba el texto HTML en la transmisión. Aunque el programa no es complicado, existen métodos más simples, por lo que el código de implementación ya no se da. De hecho, básicamente todas las funciones de IE Twebbrowser deben tener una forma relativamente simple de implementarlas, y lo mismo es cierto para obtener el código fuente de la página web. El siguiente código muestra el código fuente de la página web en Memo1.
Memo1.lines.add (ihtmlDocument2 (webbrowser1.document) .body.outerhtml);
Al mismo tiempo, es muy simple guardar archivos HTML como archivos de texto al navegar Twebbrowser, y no se necesitan herramientas de análisis de sintaxis, porque Twebbrowser también se completa, como sigue:
Memo1.lines.add (ihtmlDocument2 (webbrowser1.document) .body.outerText);
-------------------------------------------------- ---------------------------------
9. Función "Buscar"
El cuadro de diálogo de búsqueda se puede llamar presionando la tecla CTRL-F cuando el documento se enfoca en el programa. El programa para lograrlo.
varilla
Doc: ihtmlDocument2;
Txtrange: ihtmltxtrange;
Comenzar
Doc: = webbrowser1.document como ihtmlDocument2;
Doc.selectall;
// Esta oración es particularmente importante, porque la premisa de que el método del objeto ihtmltxtrange puede ser operado es
// El documento ya tiene un área de selección de texto. Dado que se ejecuta la siguiente declaración, no
// Consulte el proceso de selección de todos los documentos.
Txtrange: = doc.selection.createrange como ihtmltxtrange;
Txtrange.findText ('texto a buscar', 0.0);
Txtrange.select;
fin;
Además, puede obtener el contenido de texto seleccionado actualmente de txt.get_text, que es útil en algún momento.
-------------------------------------------------- ---------------------------------
10. Extraiga todos los enlaces en la página web
Este método proviene de un amigo del foro de Monopoly Hopfield que responde una pregunta.
varilla
doc: ihtmlDocument2;
Todos: ihtmlelementCollection;
Len, I: entero;
Artículo: Olevariant;
Comenzar
doc: = webbrowser1 .document como ihtmlDocument2;
Todos: = doc.get_links; //doc.links también está bien
len: = all.length;
para i: = 0 a len-1 comienza
item: = all.item (i, varEmty);
memo1.lines.add (item.href);
fin;
fin;
-------------------------------------------------- ---------------------------------
11. Establezca la codificación de twebbrowser
¿Por qué siempre extraño muchas oportunidades? De hecho, debería haber pensado en ello durante mucho tiempo, pero una diferencia en el pensamiento lo convertirá en un mundo de diferencia. Si lo hubiera pensado más y lo hubiera probado más, no habría sido clasificado el 11º. Aquí hay una función, que es inimaginablemente simple de resolver.
Procedimiento SetCharset (AWEBBROWSER: Twebbrowser; Acharset:
Cadena);
varilla
Refreshlevel: olevariant;
Comenzar
IhtmlDocument2 (awebbrowser.document) .set_charset (acharset);
RefreshLevel: = 7;
Awebbrowser.refresh2 (refreshLevel);
Fin;