Delphi3 a commencé à avoir le composant TwebBrowser, mais il est apparu sous la forme de contrôles ActiveX à ce moment-là et devait être introduit par lui-même. Le panneau de composant est allumé. J'entends souvent les gens gronder Delphi pour faire très mal. sera plus.
Voici quelques expériences sur l'utilisation de Twebbrowser pour créer des programmes et quelques exemples et informations collectées sur Internet.
1. Initialisation et finalisation
Lorsque vous exécutez une méthode de TwebBrowser pour effectuer l'opération souhaitée, comme ExecWB, etc., vous pouvez avoir rencontré des erreurs telles que "essayer d'activer la cible manquante non enregistrée" ou "objet OLE non enregistré", ou il n'y a pas d'erreur mais il n'est pas fait. Lorsque je l'ai utilisé pour programmer, j'ai constaté que EXECWB fonctionne parfois mais ne fonctionne parfois pas. C'était aussi une opportunité accidentelle que j'ai réalisé que les objets OLE doivent être initialisés et résiliés (il y a trop peu de choses à comprendre).
J'ai utilisé la méthode mentionnée dans mon article précédent "Delphi Program Window Animation & Solutions for Normal Arrangement Tile". Enfin, ça fait! La raison, je pense que c'est probablement parce que Twebbrowser est un objet OLE intégré et n'est pas un VCL écrit à Delphi.
Initialisation
Oléinitialize (nul);
Finalisation
essayer
Oléuninitialise;
sauf
fin;
Ces phrases sont placées après toutes les instructions de la fenêtre principale, avant la «fin».
-------------------------------------------------- ---------------------------------
2. Videparam
Dans Delphi 5, la méthode de navigation de TwebBrowser est surchargée plusieurs fois:
Procédure naviguer (const URL: Widestring);
Procédure Naviguez (const URL: Widestring; Var Flags:
Olevariant);
Procédure Naviguez (const URL: Widestring; Var Flags:
Olevariant; var TargetFrameName: Olevariant);
Procédure Naviguez (const URL: Widestring; Var Flags:
Olevariant; var TargetFrameName: Olevariant;
Olevariant);
Procédure Naviguez (const URL: Widestring; Var Flags:
Olevariant; var TargetFrameName: Olevariant;
Olevariant; var en-têtes: olevariant);
Dans les applications réelles, lors de l'appel de cette dernière méthode, car nous utilisons rarement ces derniers paramètres, mais la déclaration de fonction nécessite des paramètres variables, la méthode générale est la suivante:
var
T: Olevariant;
Commencer
webBrowser1.navigate (edit1.text, t, t, t, t);
fin;
Il est très difficile de définir la variable T (et il y a encore de nombreux endroits pour l'utiliser). En fait, nous pouvons utiliser videParam à la place (videParam est une variante de variable commune, ne lui attribuez pas de valeur), une seule phrase:
webbrowser1.navigate (edit1.text, videParam, videParam, videParam, videParam);
Bien que ce soit un peu plus long, c'est beaucoup plus pratique que de définir les variables à chaque fois. Bien sûr, la première méthode peut également être utilisée.
webbrowser1.navigate (edit1.text)
-------------------------------------------------- ---------------------------------
3. Les opérations de commande communes peuvent être terminées à l'aide de la méthode EXECWB.
Procédure Execwb (CMDID: OlecMDID; CMDEXECOPT:
OlecmdexEcopt);
Procédure Execwb (CMDID: OlecMDID; CMDEXECOPT: OlecmdexECOPT;
var pvain:
Olevariant);
Procédure Execwb (CMDID: ROLECMDID; CMDEXECOPT:
OlecmdexEcopt;
Olevariant; var pvaout: olevariant);
Ouvert: la boîte de dialogue "Adresse Internet ouverte" apparaît et le commandid est olecmdid_open (si la version du navigateur est IE5.0,
Alors cette commande n'est pas disponible).
Enregistrer sous: Appelez la boîte de dialogue Enregistrer.
Execwb (olecmdid_saveas, olecmdexecopt_dodefault,
Videparam,
VideParam);
Imprimer, imprimer les paramètres de prévisualisation et de page: appelez les boîtes de dialogue "imprimer", "imprimer" et "Paramètres de page" (IE5.5 et supérieur à la prise en charge des versions "Type"
Imprimer l'aperçu, donc l'implémentation doit vérifier si cette commande est disponible).
Execwb (olecmdid_print, olecmdexecopt_dodefault,
Videparam,
VideParam);
si QueryStatuswb (olecmdid_printpreview) = 3 alors
Execwb (olecmdid_printpreview, olecmdexecopt_dodefault,
VideParam, videParam);
Execwb (olecmdid_pagesetup, olecmdexecopt_dodefault,
Videparam,
VideParam);
Couper, copier, coller, sélectionner tout: il n'est pas nécessaire de dire grand-chose sur la fonction, il est important de noter que la coupe et le collage fournissent non seulement du texte pour l'édition de cadres, mais également non d'édition sur les pages Web.
Le texte de la boîte d'édition est également efficace. Obtenir son état d'activation de commande
Il existe deux façons d'exécuter des commandes (prendre la copie comme exemple, la coupe, le collage et la sélection de tous remplaceront les mots clés respectifs.
Changez-le, à savoir couper, coller et sélectionner, respectivement):
A. Utilisez la méthode QueryStatusWB de TwebBrowser.
if (queryStatuswb (olecmdid_copy) = olecmdf_enabled) ou
Olecmdf_supported) puis
Execwb (olecmdid_copy, olecmdexecopt_dodefault,
Videparam,
VideParam);
B. Utilisez la méthode QueryCommandEnabled de IHTMLDocument2.
var
Doc: ihtmlDocument2;
Commencer
Doc: = webBrowser1.Document as ihtmlDocument2;
Si doc.QueryCommandenabled ('copy') alors
Doc.execcommand ('copy', false, videParam);
fin;
Recherche: reportez-vous à la neuvième fonction "trouver".
-------------------------------------------------- ---------------------------------
4. Taille de la police
Semblable aux cinq éléments du "maximum" à "minimum" dans le menu "Font" (correspondant aux entiers 0 ~ 4, plus importants, etc., en supposant que les noms des cinq éléments du menu sont les suivants, tag
Les propriétés sont définies respectivement à 0 ~ 4).
A. Lisez la taille de la police de la page actuelle.
var
T: Olevariant;
Commencer
Webbrowser1.execwb (olecmdid_zoom,
Olecmdexecopt_dontpromptuer,
VideParam, t);
cas t de
4: le plus grand. Vérifié: = true;
3: plus grand.Cheraked: = true;
2: Middle.Checked: = true;
1: Small.Cheraked: = true;
0: le plus petit.Crisé: = true;
fin;
fin;
B. Définissez la taille de la police de la page.
Le plus grand. Vérifié: = FAUX;
Plus grand.Checked: = false;
Middle.Cheraked: = false;
Small.checked: = false;
Le plus petit.Crisé: = false;
TMenuItem (expéditeur) .Cheraked: = true;
t: = tMenuem (expéditeur) .tag;
Webbrowser1.execwb (olecmdid_zoom,
Olecmdexecopt_dontpromptuer,
t, t);
-------------------------------------------------- ---------------------------------
5. Ajouter aux favoris et organiser les favoris
const
CLSID_SHELLUIHELPER: TGUID =
'{64ab4bb7-111e-11d1-8f79-00c04fc2fbe1}';
var
P: Procédure (Handle: Thandle; Path: PHAR);
procédure tform1.organizefavorite (expéditeur: tobject);
var
H: hwnd;
Commencer
H: = LoadLibrary (pChar ('shdocvw.dll'));
Si h <> 0 alors
Commencer
P: = GetProcAddress (H, PCHA ('DOORDANIISEFAVDLG'));
si elle est attribuée (p) alors p (application.handle,
PCHA (FAVFOLDER));
fin;
Freelibrary (H);
fin;
procédure tform1.addfavorite (expéditeur: tobject);
var
Sheluihelper: Ishelluilper;
URL, titre: Olevariant;
Commencer
Titre: = WebBrowser1.LocationName;
URL: = webBrowser1.LocationUrl;
Si url <> '' alors
Commencer
Shelluihelper: = createComObject (ClSid_ShelUihelper) comme
Ishelluilper;
Shelluihelper.addfavorite (URL, titre);
fin;
fin;
La méthode d'utilisation de la méthode ci-dessus pour ouvrir la boîte de dialogue "Ajouter aux favoris" via l'interface Ishelluihelper est relativement simple, mais il y a un inconvénient, c'est-à-dire que la fenêtre ouverte n'est pas une fenêtre de mode, mais est indépendante de l'application. Il est concevable que si vous utilisez la même méthode que la procédure OrganizeFavorite pour ouvrir la boîte de dialogue, vous pouvez naturellement implémenter la fenêtre de mode car vous pouvez spécifier la poignée de la fenêtre parent (l'effet est le même que l'ouverture de "Ajouter au favori" Dialogue dans Explorer et IE). Le problème est évidemment ceci. Peu importe que ce soit une fenêtre de motif?).
Le processus suivant vous indiquera le prototype de fonction de Doaddtofavdlg. Il convient de noter que la boîte de dialogue ouverte de cette manière n'effectue pas l'opération "Ajouter aux favoris". souhaite placer le raccourci Internet.
procédure tform1.addfavorite (c'est-à-dire: temddedwb);
Procédure CreateUrl (AurlPath, Aurl: PCHA);
var
Urlfile: tinifile;
Commencer
UrlFile: = tinifile.create (String (AurlPath));
rlfile.writeString («Internethortcut», «url»,
String (AURL));
rlfile.free;
fin;
var
Addfav: fonction (manche: thandle;
UrlPath: PHAR; UrlPathsize: Cardinal;
Titre: PCHER; TitleSize: Cardinal;
Favidlist: Pittemidlist): bool;
Fdoc: ihtmlDocument2;
URLPATH, URL, titre: Array [0..max_path] de char;
H: hwnd;
pidl: Pitemidlist;
Fretok: bool;
Commencer
Fdoc: = ihtmlDocument2 (ie.Document);
Si fdoc = nil alors sortez;
Strpcopy (title, fdoc.get_title);
Strpcopy (URL, fdoc.get_url);
Si url <> '' alors
Commencer
H: = LoadLibrary (pChar ('shdocvw.dll'));
Si h <> 0 alors
Commencer
ShgetSpecialFolderLocation (0, csidl_favorites, pidl);
Addfav: = getProcAddress (h, pChar ('doaddtofavdlg'));
Si vous êtes attribué (addfav) alors
Fretok: = addfav (manche, urlpath, sizeof (urlpath),
Titre, sizeof (titre), pidl)
fin;
Freelibrary (H);
Si Fretok alors
CreateUrl (URLPATH, URL);
fin
fin;
-------------------------------------------------- ---------------------------------
6. Faites focaliser WebBrowser
Twebbrowser est très spécial.
L'explorateur lui-même a des clés de raccourci, la solution est la suivante:
Procédure tform1.setFoCustoDoc;
Commencer
Si webbrowser1.Document <> nil alors
avec webbrowser1.application comme ioleObject
Doverb (oleiverb_uiactivate, nil, webbrowser1, 0, manche,
GetClientRect);
fin;
En dehors de cela, j'ai également trouvé un moyen plus facile, qui est répertorié ici:
Si webbrowser1.Document <> nil alors
Ihtmlwindow2 (ihtmldocument2 (webbrowser1.document) .parentWindow) .focus
Je viens de trouver un moyen plus facile, peut-être le plus simple:
Si webbrowser1.Document <> nil alors
Ihtmlwindow4 (webbrowser1.document) .focus
De plus, vous devez déterminer si le document a acquis un objectif:
Si ihtmlwindow4 (webBrowser1.Document) .hasfocus alors
-------------------------------------------------- ---------------------------------
7. Cliquez sur le bouton "Soumettre"
Tout comme il y a un bouton "par défaut" sur chaque formulaire du programme, chaque formulaire sur la page Web a également un bouton "par défaut" - c'est-à-dire un bouton avec l'attribut "Soumettre". équivaut à cliquer sur "Soumettre" sur la souris. Cependant, TwebBrowser ne semble pas répondre à la touche ENTER, et même si la vue de la touche du formulaire contenant le TwebBrowser est définie sur true, les clés envoyées par l'utilisateur à Twebbrowser ne peuvent pas être interceptées lors de l'événement de touche du formulaire.
Ma solution consiste à utiliser le composant ApplicatineVants ou à écrire l'événement OnMessage de l'objet Tapplication par vous-même, à juger le type de message et à répondre au message du clavier. Quant à cliquer sur le bouton "Soumettre", vous pouvez le faire en analysant le code source Web, mais j'ai trouvé une méthode plus simple et plus rapide. quelqu'un d'autre a écrit.
A. Utilisez la fonction SendKeys pour envoyer la touche Entrée à WebBrowser
À Delphi
5 Il y a un fichier SNDKEY32.PAS dans le répertoire Info / Extras / Sendkeys sur le CD, qui contient deux fonctions SendKeys et Appactive. C'est très simple.
SendKeys ('~', true); // Appuyez sur la touche de retour
La description détaillée des paramètres de la fonction SendKeys, etc., sont incluses dans le fichier sndkey32.pas.
B. Passez le message du clavier reçu à WebBrowser dans l'événement OnMessage.
Procédure TForm1.ApplicationEvents1Message (var msg: TMSG;
var manipulé: booléen);
{Corrige le dysfonctionnement de certaines clés dans WebBrowser
contrôler}
const
Stdkeys = [vk_tab, vk_return];
Extkeys = [vk_delete, vk_back, vk_left, vk_right];
Clés étendues}
fextend = 01000000; {Flag de clé étendu}
Commencer
Manipulé: = false;
avec msg faire
if ((message> = wm_keyfirst) et (message <= wm_keylast)))
et
((wparam dans stdkeys) ou
{$ Ifdef ver120} (getKeyState (vk_control) <0) ou {$ endif}
(wparam dans les extendus) et
((lparam et fextend) = fextend)) puis
essayer
Si ischild (manche, hwnd) alors {gère tout le navigateur
Messages connexes}
Commencer
avec {$ ifdef
Ver120} Application _ {$ else} Application {$ endif} comme
IoleinplaceActiveObject
Manipulé: = TranslateAccelerator (msg) = s_ok;
Si ce n'est pas géré alors
Commencer
Manipulé: = true;
TranslateMessage (MSG);
DispatchMessage (MSG);
fin;
fin;
sauf
fin;
fin;
(Cette méthode vient de Embeddedwb.pas)
-------------------------------------------------- ---------------------------------
8. Obtenez le code source de la page Web et HTML directement de TwebBrowser
Préduisons d'abord une méthode extrêmement simple pour obtenir le code source de la page Web à laquelle TwebBrowser accéde. La méthode générale consiste à utiliser l'interface ImpersistReAminit fournie par l'objet de document dans le contrôle TwebBrowser pour l'implémenter. Taille du code source HTML, allouer le bloc de mémoire du tas global, créer un flux, puis écrire du texte HTML dans le flux. Bien que le programme ne soit pas compliqué, il existe des méthodes plus simples, de sorte que le code d'implémentation n'est plus donné. En fait, fondamentalement, toutes les fonctions IE TwebBrowser devraient avoir un moyen relativement simple de les implémenter, et il en va de même pour obtenir le code source de la page Web. Le code suivant affiche le code source de la page Web dans MEMO1.
Memo1.lines.add (ihtmlDocument2 (webBrowser1.Document) .body.outerhtml);
Dans le même temps, il est très simple d'enregistrer des fichiers HTML sous forme de fichiers texte lors de la navigation TwebBrowser, et aucun outil d'analyse de syntaxe n'est nécessaire, car TwebBrowser est également terminé, comme suit:
Memo1.lines.add (ihtmlDocument2 (webBrowser1.Document) .body.outerText);
-------------------------------------------------- ---------------------------------
9. Fonction "Find"
La boîte de dialogue de recherche peut être appelée en appuyant sur la touche CTRL-F lorsque le document est mis au point. Le programme pour le faire.
var
Doc: ihtmlDocument2;
TxTrange: ihtmltxTrange;
Commencer
Doc: = webBrowser1.Document as ihtmlDocument2;
Doc.Selectall; // C'est une abréviation.
// Cette phrase est particulièrement importante, car la prémisse selon laquelle la méthode de l'objet ihtmltxtrange peut être exploitée est
// Document a déjà une zone de sélection de texte. Étant donné que la déclaration suivante est exécutée, elle ne sera pas
// Voir le processus de sélection de tous les documents.
TxTrange: = doc.selection.createrange comme ihtmltxtrange;
TxTrange.FindText ('texte à rechercher', 0.0);
TxTrange.Select;
fin;
En outre, vous pouvez obtenir le contenu texte actuellement sélectionné à partir de txt.get_text, ce qui est utile à un moment donné.
-------------------------------------------------- ---------------------------------
10. Extraire tous les liens de la page Web
Cette méthode vient d'un ami du Forum Monopoly Hopfield Forum répondant à une question.
var
doc: ihtmlDocument2;
Tous: ihtmlementmentCollection;
Len, i: entier;
Article: Olevariant;
Commencer
doc: = webBrowser1 .Document as ihtmlDocument2;
tout: = doc.get_links;
len: = all.length;
pour i: = 0 à Len-1 commencez
Item: = all.item (i, VAREMPTY);
memo1.lines.add (item.href);
fin;
fin;
-------------------------------------------------- ---------------------------------
11. Définissez le codage de Twebbrowser
Pourquoi est-ce que je manque toujours beaucoup d'opportunités? En fait, j'aurais dû y réfléchir pendant longtemps, mais une différence de pensée fera un monde de différence. Si j'avais réfléchi davantage à cela et que je l'essayais davantage, il n'aurait pas été classé 11e. Voici une fonction, qui est inimaginablement simple à résoudre.
Procédure setCharset (awebbrowser: twebbrowser; acharset:
Chaîne);
var
Refreshlevel: Olevariant;
Commencer
IhtmlDocument2 (awebBrowser.Document) .set_charset (acharset);
Refreshlevel: = 7;
Awebbrowser.refresh2 (Refreshlevel);
Fin;