Živě.cz o počítačích a internetu

Tipy a triky v Delphi, díl 118. - Automatické vyplňování formulářů v IE část 2.

Jan Šindelář - 26.11.2003

Jelikož se na webových stránkách (obzvlášť těch hodně graficky vyšperkovaných) často setkáme s tím, že prakticky všechny ovládací prvky jsou tvořeny obrázky, naučíme se dnes "klikat" i na obrázková tlačítka.

Na rozdíl od minulého příkladu dneska nebudeme vyplňovat formulář žádnými údaji a soustředíme se pouze na simulaci stisku obrázkového tlačítka. Rovněž se soustředíme pouze na komponentu WebBrowser a Internet Explorer tentokrát ponecháme stranou. Vše podstatné se dočtete v minulém a předminulém dílu.

Umístíme si tedy na formulář WebBrowser a dvě tlačítka. První tlačítko načte do komponenty příslušnou stránku s nějakým formulářem s obrázkovým tlačítkem. Druhé tlačítko na formuláři pak nasimuluje odeslání toho formuláře "kliknutím" na obrázek.

Postup je velmi obdobný jako v minulých příkladech. Nejdříve zjistíme, zda je v komponentě WebBrowser platný HTML dokument a pak se snažíme zjistit, zda obsahuje nějaký formulářový element prostřednictvím "klíčového slova" INPUT. Pak již jen zjistíme, zda se jedná o obrázek, zkontrolujeme jeho název (pro případ více tlačítek) a metodou Click jej aktivujeme. V HTML kódu stránky musí být u obrázkového tlačítka atribut NAME definován a my jej musíme znát (případně postup nějak vhodně parametrizovat), jinak nebude dnešní příklad fungovat, protože hledáme konkrétní tlačítko určené názvem.

unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, OleCtrls, SHDocVw, MSHTML;

type
  TForm1 = class(TForm)
    WebBrowser1: TWebBrowser;
    Button1: TButton;
    Button2: TButton;
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
begin
  WebBrowser1.Navigate(`c:\test.html`);
end;

procedure TForm1.Button2Click(Sender: TObject);
var
  iDoc: IHtmlDocument2;
  i: integer;
  ov: OleVariant;
  iDisp: IDispatch;
  iColl: IHTMLElementCollection;
  InputImage: HTMLInputImage;
begin
  try
    WebBrowser1.ControlInterface.Document.QueryInterface(IHtmlDocument2, iDoc);
  except
  end;
  if not Assigned(iDoc) then Exit;
  ov := `INPUT`;
  iDisp := iDoc.all.tags(ov);
  if Assigned(IDisp) then
  begin
    IDisp.QueryInterface(IHTMLElementCollection, iColl);
    if Assigned(iColl) then
      for i := 1 to iColl.Get_length do
      begin
        iDisp := iColl.item(pred(i), 0);
        iDisp.QueryInterface(HTMLInputImage, InputImage);
        if (Assigned(InputImage))and(InputImage.Name = `obrazek`) then InputImage.Click;
      end;
  end;
end;

end.

Nezapomeňte si při testování příkladu upravit příslušné parametry. Předně je to načtená HTML stránka (viz. událost stisku prvního tlačítka) a dále hledaný název obrázku (parametr InputImage.Name).