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中的内容是一个本地目录时,再用上述方法设置焦点就会出错。

delphi 单元 MSHTML 之Ihtmldocument2的更多相关文章

  1. Delphi单元文件引用名称问题

    Delphi新版本的单元文件格式变化了,如windows变成了winapi.windows,如果想在单元引用中使用简称,则需要在工程选项中配置: 这样就可以使用全名或简写来引用单元了.

  2. DELPHI 单元文件结构

    unit Unit1; interface {接口部分开始} uses {引用单元列表,这是可选的,如果包含必须紧跟interface关键字} {接口部分声明常量/类型/变量/过程和函数,这些声明对引 ...

  3. Delphi单元文件之-防止程序重复执行

    //工程引用此单元就能防止同时出现多个实例unit MultInst;interfaceuses Windows ,Messages, SysUtils, Classes, Forms;impleme ...

  4. Delphi 单元

    单元(unit)是组成Pascal程序的单独的源代码模块,单元有函数和过程组成,这些函数和过程能被主程序调用.一个单元至少要有unit语句,interface,和implementation三部分,也 ...

  5. Delphi单元文件之-简体繁体互转

    Function GBCht2Chs(GBStr: String): AnsiString; {GBK繁体转简体} Var   len:integer;   pGBCHTChar: PChar;   ...

  6. Delphi窗体创建释放过程及单元文件小结(转)

    Delphi窗体创建释放过程及单元文件小结 Delphi中的窗体,有模式窗体与非模式窗体两种.两种窗体的调用方式不同,模式窗体使用ShowModal显示,非模式窗体使用Show显示.当显示模式窗体的时 ...

  7. delphi基础篇之单元文件

    Delphi单元文件 unit MainFrm; {库单元文件头} interface        {接口部分由Interface开始implementation结束.声明引用的单元,常量,数据类型 ...

  8. Delphi WebBrowser控件的使用(大全 good)

    Delphi WebBrowser控件的使用 WebBrowser控件属性:1.Application      如果该对象有效,则返回掌管WebBrowser控件的应用程序实现的自动化对象(IDis ...

  9. Delphi TWebBrowser

    Delphi WebBrowser控件的使用 WebBrowser控件属性:1.Application      如果该对象有效,则返回掌管WebBrowser控件的应用程序实现的自动化对象(IDis ...

随机推荐

  1. 热修复框架Tinker的从0到集成之路(转)

    转自:http://blog.csdn.net/lisdye2/article/details/54411727 热修复框架Tinker的从0到集成之路 转载请标明出处: http://blog.cs ...

  2. grpc协议--客户端构造

    由于服务端不在构造,已经构造完成不做构造 gRPC 接口名字为service,proto文件内有定义 1.本目录生成grpc文件 python -m grpc_tools.protoc -I. --p ...

  3. 分布式项目中增加品牌前端页面出现Uncaught Error: [$injector:modulerr] bug后的原因以及改正方式

    分布式查询品牌页面时 controller路径正确访问,比如输入 http://localhost:8081/brand/findPage.do?page=3&rows=6 是可以正常显示数据 ...

  4. Vlan的相关知识点收纳

    Q.思科Vlan的上限个数是多少? VLAN的范围:根据平台和软件版本不同,Cisco交换机最多支持4096个VLAN.VLAN号共有4096个,0-4095    0,4095:这两个号保留,仅限系 ...

  5. CTSC2019

    (upd:随机立方体AC) 太菜了只会部分分.以后慢慢补坑吧…… 随机立方体: 30分: 正常人都能想到的的转移状态(我的确是弱智),从大往小填数,记录有多少个极大值点和三个方向上各占了多少.转移可以 ...

  6. Luogu P2269 [HNOI2002]高质量的数据传输

    这题给大家提供一下思路~ (为不想贴代码找借口) 声明:两个思路都是正确的,并且都AC了.(逃) 总体布局 求传输失败率\(1-\prod(1-p_{i})\)最小就是求 传输成功率\(\prod(1 ...

  7. NX二次开发-NXOpenC++ Example

    NxOpenC++ Example NXOpen::WCS wcs坐标系 https://www.cnblogs.com/nxopen2018/p/11368763.html NXOpen::Draw ...

  8. 找关键字,分割字符串,输出一个vector

    vector<string> split(const string& str, const string& delim) { vector<string> re ...

  9. docker包含哪些内容(1)

    包含哪些内容? 如下图,三大块: 下面分别介绍各部分包含的内容. 启程 “启程”会介绍容器的生态系统,让大家先从整体上了解容器都包含那些技术,各种技术之间的相互关系是什么,然后再来看我们的教程都会涉及 ...

  10. 14、testng.xml 设置用例执行顺序

    目录如下: TestGroup.java 代码如下: package com.testng.cn; import org.testng.annotations.*; import static org ...