Dnes si opět budeme hrát s OLE a tentokrát bude cílem Internet Explorer. S jeho pomocí se naučíme získat ze zadané webové stránky všechny odkazy, které obsahuje.
Bez zbytečných úvodů se pustíme hned do práce. Cílem našeho dnešního snažení bude jednoduchá aplikace, jejíž hlavní formulář obsahuje pouze tlačítko, ListBox a Edit. Do editačního pole vložíme webovou adresu, tlačítkem ji odešleme a v ListBoxu se nám postupně zobrazí všechny odkazy, které na dané stránce jsou.
Nejprve tedy založíme nový projekt a uložíme jej. V následujícím kroku potřebujeme importovat HTML knihovnu. V menu Project vybereme položku Import Type Library. V zobrazeném seznamu najdeme a označíme položku Microsoft Object HTML Library a klikneme na tlačítko Create Unit. Nyní musíte být trpěliví, protože import knihovny a tvorba unitu chvíli potrvá. Výsledný soubor MSHTML_TLB.pas má úctyhodnou velikost 12 MB a bude automaticky přidán do našeho projektu. I následná (první) kompilace bude kvůli velikosti knihovny poněkud delší než obvykle, ale je to jen pro poprvé a nemusíte se samozřejmě ani bát velikosti výsledného exe souboru (s velikostí importované knihovny moc nesouvisí a je tak velký jako obvykle).
Když se nám podařilo úspěšně importovat HTML knihovnu, můžeme se pustit do práce. Základem je funkce WebBrowserDocumentComplete, která je aktivovaná po načtení celého dokumentu a obsahuje většinu kódu našeho příkladu. Princip je vlastně jednoduchý. Stránku rozdělíme na jednotlivé elementy a z nich si odfiltrujeme pouze tagy A. Ty pak rozdělíme na část s popisem a část s vlastní adresou a přidáme do připraveného ListBoxu.
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, OleCtrls, SHDocVw, OleServer;
type
TForm1 = class(TForm)
Edit1: TEdit;
Button1: TButton;
ListBox1: TListBox;
procedure FormCreate(Sender: TObject);
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
FInternetExplorer: TInternetExplorer;
procedure WebBrowserDocumentComplete(Sender: TObject; var pDisp: OleVariant; var URL: OleVariant);
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
uses MSHTML_TLB, ComObj;
{$R *.dfm}
procedure TForm1.WebBrowserDocumentComplete(Sender: TObject; var pDisp: OleVariant; var URL: OleVariant);
var
Doc: IHTMLDocument2;
ElementCollection: IHTMLElementCollection;
HtmlElement: IHTMLElement;
I: Integer;
AnchorString: string;
begin
ListBox1.Clear;
Doc := FInternetExplorer.Document as IHTMLDocument2;
if Doc = nil then raise Exception.Create(`Chyba pri nacitani dokumentu!`);
ElementCollection := Doc.all;
for I := 0 to ElementCollection.length - 1 do
begin
HtmlElement := ElementCollection.item(I, ``) as IHTMLElement;
if HTMLElement.tagName = `A` then
begin
AnchorString := HtmlElement.innerText;
if AnchorString = `` then AnchorString := `(bez titulku)`;
AnchorString := AnchorString + ` - ` + (HtmlElement as IHTMLAnchorElement).href;
ListBox1.Items.Add(AnchorString);
end;
end;
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
FInternetExplorer := TInternetExplorer.Create(Self);
FInternetExplorer.OnDocumentComplete := WebBrowserDocumentComplete;
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
FInternetExplorer.Navigate(Edit1.Text, EmptyParam, EmptyParam, EmptyParam, EmptyParam);
end;
end.
Jak vidíte, příklad by se dal snadno upravit pro odfiltrování libovolného tagu prostou úpravou řetězce u podmínky HTMLElement.tagName.
Po spuštění tedy stačí do připraveného Editu vložit webovou adresu, stisknout tlačítko a po nějakém čase (stránka se musí načíst a zpracovat) se do připraveného ListBoxu vypíše seznam všech odkazů na dané stránce, přičemž odkazy budou rozděleny na titulkovou část a vlastní odkaz.