Tipy a triky v Delphi, díl 134. - dolujeme Internet Explorer

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.

Diskuze (4) Další článek: Nové paměti s taktem 550 MHz

Témata článku: , , , , , , , , , , , ,