zoukankan      html  css  js  c++  java
  • delphi 单元 MSHTML 之Ihtmldocument2

    delphi : Ihtmldocument2接口的利用

    MSHTML是微软公司的一个COM组件,该组件封装了HTML语言中的所有元素及其属性,穿越其供给的规范接口,能够访问指定网页的所有元素.

      MSHTML对象模型是由一些对象和聚集构成的.处于根部的是HTML,描写了敞开版面的1个窗口,包括一系列聚集和对象。如Frames聚集,History,Location,Navigator,Document,Vi—sum,Event对象等.其中描写涌目前客户窗口切实网页的是Document对象。由一系列的属性、措施、对象和聚集构成.其中All聚凑近包括网页中所有符号(Tag)元素,其重要的措施和属性有:

      (1)Length(长度):即符号揭示的个数,能够把符号的集有会意为从0开始的一维数组,其次序按照符号在网页位置编排;

      (2)Tags(符号):用于过滤出给定符号的聚集,如Doc.Al1.Tags(P)获得所有分段符号P;

      (3)Item(项目):用于抉择聚凑近的某1个元素,如object.item(0)获得聚集的第1个元素,而object.item(i)获得第i+1个元素.

      另外,IHTMLElement也是个常用的聚集对象,代表网页中指定符号的聚集,穿越这个聚集对象,能够获得网页上特定符号的内容.IHTMLElement有4个重要属性:

      (1)InnerText:开始符号和告终符号之间的文本;

      (2)InnerHTML:开始符号和告终符号之间的文本和HTML;

      (3)OuterText:对象的文本;

      (4)OuterHTML:对象的文本和HTML.

    注意:使用前必须加入单元mshtml

    演示表单提交

    procedure TForm1.Button1Click(Sender: TObject);
    var
     Doc:IHTMLDocument2;
     input:OleVariant;
     userinputelement,pwdinputelement: ihtmlinputelement;
    begin
      doc:=webbrowser1.document as ihtmldocument2;
      userinputelement:=(doc.all.item('user'(也即便网页管用户名控件的名字),0) as ihtmlinputelement);
      userinputelement.value:=edit1.text;(也即便你要向网页输入的东西)
      pwdinputelement:=(doc.all.item('password',0) as ihtmlinputelement);
      pwdinputelement.value:=edit2.text;
      input:=doc.all.item('submit',0);
      input.click;
    end;

    如果有验证码怎么办?

    Delphi自动提交网页表单和获取框架网页源码

    参考:http://apps.hi.baidu.com/share/detail/32863592

    这两个问题的实现原理其实是差不多的,所以放在一起介绍,单元MSHtml封装了我们需要的功能。

    首先,新建一个DELPHI工程,在USES部分添加MSHtml单元的引用。

    然后,在窗体上放置一个TWebBrowser控件和四个按钮。

    最后,编写四个按钮的响应代码:

    1. 自动提交网页表单

    procedure TForm1.Button1Click(Sender: TObject);
    begin
      WebBrowser1.Navigate('http://www.baidu.com');
    end;

    procedure TForm1.Button2Click(Sender: TObject);
    var
      doc: IHTMLDocument2;
      oleObj: OleVariant;
    begin
      doc := WebBrowser1.Document as IHTMLDocument2;
      if doc = nil then Exit;
      oleObj := doc.all.item('wd', 0) as IHTMLElement2;
      //网页有一个名为“wd”的文本框:<input type="text" name="wd" id="kw" maxlength="100">
      oleObj.Value := 'Delphi'; //为文本框赋值
      oleObj := doc.all.item('su', 0) as IHTMLElement2;
      //网页有一个ID为“su”的按钮:<input type="submit" value="百度一下" id="su">
      oleObj.Click;  //点击按钮,提交表单
    end;

    2. 获取框架网页源码

     procedure TForm1.Button3Click(Sender: TObject);
    begin
      WebBrowser1.Navigate('http://含有框架的网页URL');
    end;

    procedure TForm1.Button4Click(Sender: TObject);
    var
      doc, framedoc: IHTMLDocument2;
      frame_dispatch: IDispatch;
      ole_index: OleVariant;
      i: Integer;
    begin
      doc := WebBrowser1.Document as IHTMLDocument2;
      if doc = nil then Exit;
      for i := 0 to doc.frames.length - 1 do
      begin
        ole_index := i;
        frame_dispatch := doc.frames.item(ole_index);
        if frame_dispatch = nil then Continue;
        framedoc := (frame_dispatch as IHTMLWindow2).document;
        if framedoc = nil then Continue;
        ShowMessage(framedoc.body.innerHTML);
      end;
    end;

    3. 获取网页所有链接

    procedure TForm1.Button1Click(Sender: TObject);
    var
      elem: IHTMLElement;
      coll: IHTMLElementCollection;
      i: integer;
      url, title: string;
    begin
      coll := (WebBrowser1.Document as IHTMLDocument2).all;
      coll := (coll.tags('a') as IHTMLElementCollection);
      for i := 0 to coll.Length - 1 do
         begin //   循环取出每个链接
          elem := (coll.item(i, 0) as IHTMLElement);
          url := Trim(string(elem.getAttribute(WideString('href'), 0)));
          title := elem.innerText;
          ShowMessage(Format('链接标题:%s,链接网址:%s', [title, url]));
         end;
    end;

    焦点设置

    参考:http://topic.csdn.net/t/20010610/23/154240.html

    当TWebbrowser中的内容是一个html文件时,可用下面的方法设置焦点,
    IHTMLWindow2(IHTMLDocument2(Webbrowser1.Document).ParentWindow).focus;
    但当TWebbrowser中的内容是一个本地目录时,再用上述方法设置焦点就会出错。

  • 相关阅读:
    Templet
    linux command
    Codeforces Daily
    Programming Contest Challenge Book
    STL
    Struct
    Some of GDUFE
    [屯题] DP系列
    [颓废]ws_fqk省选前刷题记录
    [SDOI2009][BZOJ1876] SuperGCD|高精度|更相减损术
  • 原文地址:https://www.cnblogs.com/guorongtao/p/4647494.html
Copyright © 2011-2022 走看看