Delphi3 hat die Twebbrowser -Komponente aufgetreten, die zu diesem Zeitpunkt in Form von ActiveX -Steuerelementen erschien und in der nachfolgenden 4.0 und 5.0 Einführung nach einer der Internetkomponentengruppen nach der Einkapselung von shdocvw.dll erscheint. Das Komponentenfeld ist eingeschaltet. Ich höre oft, dass Delphi sehr schlecht ist. wird mehr sein.
Hier sind einige Erfahrungen über die Verwendung von TwebBrowser, um Programme und einige Beispiele und Informationen aus dem Internet zu erstellen.
1. Initialisierung und Abschluss
Wenn Sie eine Methode des Twebbrowsers ausführen, um den gewünschten Vorgang wie execWB usw. durchzuführen, haben Sie möglicherweise Fehler wie "Versuch, das nicht registrierte fehlende Ziel zu aktivieren" oder "OLE -Objekt nicht registriert", oder es gibt keinen Fehler, aber es gibt keinen Fehler, aber kein Fehler Es ist nicht erledigt. Wenn ich es zum Programm verwendet habe, stellte ich fest, dass ExecWB manchmal funktioniert, aber manchmal nicht funktioniert. Es war auch eine zufällige Gelegenheit, dass mir klar wurde, dass OLE -Objekte initialisiert und beendet werden müssen (es gibt zu wenige Dinge, die man verstehen kann).
Ich habe die in meinem vorherige Artikel "Delphi Program Window Animation & Solutions for Normal Arrangement Fliesen" genannte Methode verwendet. Endlich erledigt! Der Grund, ich denke, es ist wahrscheinlich, dass Twebbrowser ein eingebettetes OLE -Objekt ist und keine VCL in Delphi ist.
Initialisierung
Oleeinitialize (NIL);
Abschluss
versuchen
Oleuninitialize;
außer
Ende;
Diese Sätze werden nach allen Aussagen im Hauptfenster vor "Ende" platziert.
-------------------------------------------------------------------------------------------------------------------------------------------------------------------------- ---------------------------------
2. Leereparam
In Delphi 5 wird die Navigationsmethode von TwebBrowser mehrmals überladen:
Prozedur navigieren (const URL: WideString);
Prozedur navigieren (const URL: WideString; VAR -Flags:
Olevariante);
Prozedur navigieren (const URL: WideString; VAR -Flags:
Olevariante;
Prozedur navigieren (const URL: WideString; VAR -Flags:
Olevariant;
Olevariante);
Prozedur navigieren (const URL: WideString; VAR -Flags:
Olevariant;
Olevariante;
In tatsächlichen Anwendungen, wenn wir die letztere Methode aufrufen, ist die allgemeine Methode wie folgt:
var
T: olevariante;
Beginnen
webbrowser1.navigate (edit1.text, t, t, t, t);
Ende;
Es ist sehr problematisch, die Variable T zu definieren (und es gibt immer noch viele Orte, an denen sie verwendet werden können). Tatsächlich können wir stattdessen Leereparam verwenden (Leereparam ist eine gängige Variante leerer Variable, weist ihm keinen Wert zu), nur ein Satz:
webbrowser1.navigate (edit1.text, leerparam, leerparam, leerparam, leerparam);
Obwohl es etwas länger ist, ist es viel bequemer als jedes Mal Variablen zu definieren. Natürlich kann auch die erste Methode verwendet werden.
webbrowser1.navigate (edit1.text)
-------------------------------------------------------------------------------------------------------------------------------------------------------------------------- ---------------------------------
3. Die gemeinsamen Befehlsvorgänge können mit der ExecWB -Methode abgeschlossen werden.
procedure execWB (CMDID: olecmDid; CMDEXECOPT:
Olecmdexecopt);
procedure execWB (CMDID: olecmdid; cmdexecopt: olecmdexecopt;
var pvain:
Olevariante);
procedure execWB (CMDID: rolecmDid; cmdexecopt:
Olecmdexecopt;
Olevariante;
Öffnen: Das Dialogfeld "Internetadresse öffnen" wird angezeigt, und das KommandoID ist olecmdid_open (wenn die Browser -Version IE5.0 ist.
Dann ist dieser Befehl nicht verfügbar).
Speichern Sie als: Rufen Sie das Dialogfeld Speichern als Dialogfeld an.
ExecWB (olecmdid_saveas, olecmdexecopt_dodefault,
Leerparam,
Leerparam);
Einstellungen für die Vorschau und Seitendrucke und Seitendruck: Rufen Sie die Dialogfelder "Print", "Print Preview" und "Seiteneinstellungen" auf (dh 5.5 und höher nur die "Typ" -Version ".
Druckvorschau drucken, sodass die Implementierung überprüfen sollte, ob dieser Befehl verfügbar ist).
ExecWB (olecmdid_print, olecmdexecopt_dodefault,
Leerparam,
Leerparam);
Wenn querystatuswb (OLECMDID_printpreview) = 3 dann
ExecWB (OLECMDID_PRINTPREVIEW, OLECMDEXECOPT_DODEFAULT,
Leerparam, leerparam);
ExecWB (OLECMDID_PAGESETUP, OLECMDEXECOPT_DODEFAULT,
Leerparam,
Leerparam);
Schneiden, kopieren, einfügen, alle auswählen: Es ist nicht erforderlich, viel über die Funktion zu sagen. Es ist wichtig zu beachten, dass das Schneiden und Einfügen nicht nur Text zum Bearbeiten von Frames, sondern auch nicht auf Webseiten liefert.
Der Text des Bearbeitungsfelds ist ebenfalls effektiv. Erhalten Sie seinen Befehlsaktivierungsstatus
Es gibt zwei Möglichkeiten, um Befehle auszuführen (das Kopieren von Kopien, das Schneiden, Einfügen und Auswahl aller Ersetzen der jeweiligen Schlüsselwörter.
Ändern Sie es einfach, nämlich schneiden, einfügen und selekten):
A. Verwenden Sie die Querystatuswb -Methode von TwebBrowser.
if (querystatuswb (olecmdid_copy) = olecmdf_enabled) oder
OLECMDF_SUPPORTED) dann
ExecWB (olecmdid_copy, olecmdexecopt_dodefault,
Leerparam,
Leerparam);
B. Verwenden Sie die QueryCommandNabled -Methode von IHTMLDoCument2.
var
Doc: ihtmldocument2;
Beginnen
Doc: = webbrowser1.dokument als ihtmldocument2;
Wenn doc.queryCommandNabled ('Copy') dann
Doc.execcommand ('kopieren', false, leerparam);
Ende;
Suche: Siehe die neunte Funktion "Find".
-------------------------------------------------------------------------------------------------------------------------------------------------------------------------- ---------------------------------
4. Schriftgröße
Ähnlich wie die fünf Elemente von "Maximum" bis "Minimum" im Menü "Schriftart" (entsprechend den Ganzzahlen 0 ~ 4, größten usw., geht davon aus, dass die Namen der fünf Menüelemente wie folgt sind, tag
Die Eigenschaften werden jeweils auf 0 ~ 4 eingestellt).
A. Lesen Sie die Schriftgröße der aktuellen Seite.
var
T: olevariante;
Beginnen
Webbrowser1.execwb (olecmdid_zoom,
Olecmdexecopt_dontpromptuser,
Leerparam, t);
Fall t von
4: größtes. Überprüft: = wahr;
3: größer. Überprüft: = wahr;
2: Middle.Conted: = True;
1: Small.Conted: = True;
0: kleinste. Überprüft: = wahr;
Ende;
Ende;
B. Stellen Sie die Seitenschriftgröße ein.
Größte. Überprüft: = falsch;
Größer.bekannt: = falsch;
Middle.Conted: = falsch;
Small.Conted: = falsch;
Kleinste. Überprüft: = falsch;
TMenuitem (Absender).
T: = tMenuitem (Absender) .Tag;
Webbrowser1.execwb (olecmdid_zoom,
Olecmdexecopt_dontpromptuser,
t, t);
-------------------------------------------------------------------------------------------------------------------------------------------------------------------------- ---------------------------------
5. Favoriten hinzufügen und Favoriten organisieren
Const
Clsid_shelluihelper: tguid =
'{64AB4BB7-111E-11D1-8F79-00C04FC2FBE1}';
var
P: Verfahren (Handle: Thandle; Pfad: pchar);
procedure tform1.organizefavorit (Absender: tobject);
var
H: hwnd;
Beginnen
H: = loadlibrary (pChar ('shdocvw.dll'));
Wenn H <> 0 dann
Beginnen
P: = GetProcaddress (h, pchar ('torganizefavdlg'));
Wenn zugewiesen (p) dann P (application.Handle,
Pchar (favFolder));
Ende;
Freelibrary (H);
Ende;
procedure tform1.addfavorit (Absender: tobject);
var
Shelluihelper: Ishelluihelper;
URL, Titel: Olevariante;
Beginnen
Titel: = webbrowser1.locationName;
URL: = webbrowser1.locationurl;
Wenn URL <> '' dann
Beginnen
Shelluihelper: = CreateComObject (ClSID_Shelluihelper) als
Ishelluihelper;
Shelluihelper.addfavorite (URL, Titel);
Ende;
Ende;
Die Methode zur Verwendung der obigen Methode zum Öffnen des Dialogfelds "Zu Favoriten hinzufügen" durch die IShelluihelper -Schnittstelle ist relativ einfach, aber es gibt einen Nachteil, dh das geöffnete Fenster ist kein Modusfenster, sondern ist unabhängig von der Anwendung. Es ist denkbar, dass Sie das Modusfenster auf natürliche Weise implementieren können, wenn Sie dieselbe Methode wie die organisierende Prozedur zum Öffnen des Dialogs verwenden, da Sie das Handle des übergeordneten Fensters angeben können (der Effekt ist das gleiche wie das Öffnen des "Hinzufügens zum Favoriten". Dialog in Explorer und IE). Das Problem ist offensichtlich. Es war egal, ob es ein Musterfenster war?
Der folgende Vorgang zeigt Ihnen den Funktionsprototyp von doaddtofavdlg. Es ist zu beachten, dass das auf diese Weise geöffnete Dialogfeld die Operation "Favoriten hinzufügen" nicht ausführt. will die Internetverknüpfung platzieren.
procedure tform1.addfavorit (dh: tempbededwb);
Prozedur createurl (AurlPath, AURL: pchar);
var
URLFILE: Tinifile;
Beginnen
URLFILE: = Tinifile.create (String (AurlPath));
rlfile.writestring ('InternetshortCut', 'URL',
String (AURL));
rlfile.free;
Ende;
var
AddFav: Funktion (Handle: Thandle;
URLPATH: pchar;
Titel: pchar;
FavidList: Pitemidlist): bool;
FDOC: Ihtmldocument2;
URLPATH, URL, Titel: Array [0..max_path] von char;
H: hwnd;
PIDL: Pitemidlist;
Fretok: bool;
Beginnen
Fdoc: = ihtmldocument2 (dh Document);
Wenn fdoc = nil dann beenden;
StrpCopy (Titel, fdoc.get_title);
StrpCopy (URL, fdoc.get_url);
Wenn URL <> '' dann
Beginnen
H: = loadlibrary (pChar ('shdocvw.dll'));
Wenn H <> 0 dann
Beginnen
ShGetSpecialFolderLocation (0, csidl_favorites, PIDL);
AddFav: = getProcaddress (h, pchar ('doaddtofavdlg'));
Wenn zugewiesen (addFav) dann
Fretok: = AddFav (Handle, UrlPath, Größe (UrlPath),
Titel, sizeof (Titel), PIDL)
Ende;
Freelibrary (H);
Wenn Fretok dann
Createurl (urlPath, url);
Ende
Ende;
-------------------------------------------------------------------------------------------------------------------------------------------------------------------------- ---------------------------------
6. Webbrowser konzentrieren
Der TwebBrowser ist etwas ganz Besonderes.
Der Explorer selbst hat Verknüpfungsschlüsse, die Lösung lautet wie folgt:
Prozedur tform1.setfocustodoc;
Beginnen
Wenn webbrowser1.dokument <> nil dann
mit WebBrowser1.Application wie IoleObject tun
Doverb (Oleiverb_uiactivate, NIL, WebBrowser1, 0, Handle,
GetClientRect);
Ende;
Abgesehen davon fand ich auch einen einfacheren Weg, der hier aufgeführt ist:
Wenn webbrowser1.dokument <> nil dann
IHTMLWINDOW2 (IHTMLDOCUMENT2 (WebBrowser1.Document) .ParentWindow) .Focus
Ich fand gerade einen einfacheren Weg, vielleicht den einfachsten:
Wenn webbrowser1.dokument <> nil dann
IHTMLWINDOW4 (WebBrowser1.Document) .Focus
Außerdem müssen Sie feststellen, ob das Dokument den Fokus gewonnen hat:
Wenn iHtmlWindow4 (WebBrowser1.Document) .Hasfocus dann
-------------------------------------------------------------------------------------------------------------------------------------------------------------------------- ---------------------------------
7. Klicken Sie auf die Schaltfläche "Senden"
So wie es in jedem Formular im Programm eine "Standard" -Taste gibt, hat jedes Formular auf der Webseite auch eine "Standard" -Taste - dh eine Schaltfläche mit dem Attribut "Senden". ist gleichwertig mit dem Klicken auf "Senden" auf der Maus. Twebbrowser scheint jedoch nicht auf die Eingabetaste zu reagieren, und selbst wenn die Tastatur des Formulars, das den Twebbrowser enthält, auf TRUE eingestellt ist, können die vom Benutzer an Twebbrowser gesendeten Schlüssel nicht im Schlüsselpressereignis des Formulars abgefangen.
Meine Lösung besteht darin, die ApplicatineVent -Komponente zu verwenden oder das OnMessage -Ereignis des Tapplikationsobjekts selbst zu schreiben, den Nachrichtentyp zu beurteilen und auf die Tastaturnachricht zu antworten. Wenn Sie auf die Schaltfläche "Senden" klicken, können Sie dies tun, indem Sie den Web -Quellcode analysieren, aber ich habe eine einfachere und schnellere Methode gefunden. Jemand anderes schrieb.
A. Verwenden Sie die Funktion "Sendkeys", um den Eingabetaste an Webbrowser zu senden
In Delphi
5 Es gibt eine SndKey32.PAS -Datei im Verzeichnis info/extras/sendkeys auf der CD, das zwei Funktionen Sendkeys und AppActivate enthält. Es ist sehr einfach.
Sendkeys ('~', true); // Drücken Sie die Rückgabetaste
Die detaillierte Parameterbeschreibung der Sendkeys -Funktion usw. ist in der Datei SNDKey32.PAS enthalten.
B. Übergeben Sie die empfangene Tastaturmeldung an Webbrowser im OnMessage -Ereignis.
procedure tform1.applicationEvent1Message (var msg: tmsg;
var gehandhabt: boolean);
{Behebt die Fehlfunktion einiger Schlüssel im Webbrowser
Kontrolle}
Const
Stdkeys = [vk_tab, vk_return];
Extkeys = [vk_delete, vk_back, vk_left, vk_right];
erweiterte Schlüssel}
fextended = $ 01000000;
Beginnen
Behandelt: = falsch;
mit msg tun
if ((message> = wm_keyfirst) und (message <= wm_kelast)))
Und
((wparam in stdkeys) oder
{$ Ifdef ver120} (getKeyState (vk_control) <0) oder {$ endif}
(wparam in extkeys) und
((lparam und fextended) = fextended)) dann
versuchen
Wenn Ischild (Handle, hwnd) dann {Handle All Browser
Verwandte Nachrichten}
Beginnen
mit {$ ifdef
Ver120} Anwendung _ {$ else} application {$ endif} as
IoleinplaceActiveObject tun
Behandelt: = translateAccelerator (msg) = s_ok;
Wenn nicht gehandhabt, dann
Beginnen
Behandelt: = wahr;
TranslateMessage (MSG);
SendMessage (MSG);
Ende;
Ende;
außer
Ende;
Ende; // MessageHandler
(Diese Methode stammt von embeddedwb.pas)
-------------------------------------------------------------------------------------------------------------------------------------------------------------------------- ---------------------------------
8. Holen Sie sich den Webseiten -Quellcode und HTML direkt von TwebBrowser
Führen Sie zunächst eine extrem einfache Methode ein, um den Quellcode der Webseite zu erhalten, auf den TwebBrowser zugegriffen wird. Die allgemeine Methode besteht darin, die vom Dokumentobjekt im Twebbrowser -Steuerelement bereitgestellte Impersist -Streaminit -Schnittstelle zu verwenden, um sie speziell zu implementieren. HTML -Quellcodegröße, zuordnen den globalen Heap -Speicherblock, erstellen Sie einen Stream und schreiben Sie dann den HTML -Text in den Stream. Obwohl das Programm nicht kompliziert ist, gibt es einfachere Methoden, sodass der Implementierungscode nicht mehr angegeben ist. Grundsätzlich sollten alle IE -Funktionen TwebBrowser eine relativ einfache Möglichkeit haben, sie zu implementieren, und das gleiche gilt für den Erhalt von Webseiten -Quellcode. Der folgende Code zeigt den Quellcode für Webseiten in Memo1 an.
Memo1.lines.add (ihtmldocument2 (webbrowser1.document) .body.outerhtml);
Gleichzeitig ist es sehr einfach, HTML -Dateien als Textdateien zu speichern, wenn TwebBrowser durchsucht werden, und es sind keine Syntax -Parsen -Tools erforderlich, da TwebBrowser ebenfalls abgeschlossen ist: wie folgt:
Memo1.lines.add (ihtmldocument2 (webbrowser1.document) .body.outertext);
-------------------------------------------------------------------------------------------------------------------------------------------------------------------------- ---------------------------------
9. "Find" -Funktion
Das Suchdialogfeld kann durch Drücken des Taste Strg-F aufgerufen werden, wenn das Dokument im Programm fokussiert wird. Das Programm, um es zu erstellen.
var
Doc: ihtmldocument2;
Txtrange: ihtmltXtrange;
Beginnen
Doc: = webbrowser1.dokument als ihtmldocument2;
DOC.SELECTALL; // Dies ist Abkürzung.
// Dieser Satz ist besonders wichtig, da die Prämisse, dass die Methode des IHTMLTXTRANGE -Objekts betrieben werden kann
// Dokument hat bereits einen Textauswahlbereich. Da die folgende Erklärung ausgeführt wird, wird dies nicht
// Siehe den Prozess der Auswahl aller Dokumente.
Txtrange: = doc.Selection.createrange als ihtmltXtrange;
Txtrange.findText ('zu durchsuchender Text, 0.0);
Txtrange.select;
Ende;
Außerdem können Sie den aktuell ausgewählten Textinhalt von txt.get_text abrufen, was irgendwann nützlich ist.
-------------------------------------------------------------------------------------------------------------------------------------------------------------------------- ---------------------------------
10. Alle Links auf der Webseite extrahieren
Diese Methode stammt von einem Freund des Monopol -Forums -Hopfield -Forums, der eine Frage beantwortet.
var
doc: ihtmldocument2;
All: IhtmlelementCollection;
Len, ich: Ganzzahl;
Gegenstand: olevariante;
Beginnen
doc: = webbrowser1 .dokument als ihtmldocument2;
alle: = doc.get_links;
Len: = All.Length;
für i: = 0 bis len-1 beginnen
Artikel: = All.Item (i, varempy);
memo1.lines.add (item.href);
Ende;
Ende;
-------------------------------------------------------------------------------------------------------------------------------------------------------------------------- ---------------------------------
11. Stellen Sie die Codierung von Twebbrowser ein
Warum vermisse ich immer viele Möglichkeiten? Tatsächlich hätte ich lange darüber nachdenken sollen, aber ein Denkunterschied wird es zu einem großen Unterschied machen. Wenn ich mehr darüber nachgedacht hätte und es mehr ausprobiert hätte, wäre es nicht den 11. Platz gewesen. Hier ist eine Funktion, die unvorstellbar einfach zu lösen ist.
Prozedur SetCharSet (AwebBrowser: TwebBrowser; Acharset:
String);
var
Refreshlevel: olevariante;
Beginnen
Ihtmldocument2 (AwebBrowser.Document) .set_charset (Acharset);
Refreshlevel: = 7;
AwebBrowser.refresh2 (Refreshlevel);
Ende;