Delphi中WebBrowser例程

TWebBrowser平时用得比较多,也收集过大量杂乱无章的技巧。不过东西太多太杂,每到用的时又要重新拼凑一 番,实在是太累。于是早就有写一组WebBrowser例程,打算把常用的一些类似代码整理一下,以便查用。附带完整 工程,见文章末尾。 

这是第一篇,关于插入HTML和执行脚本的方法。程序界面如图,

先看代码:

关键代码

{ 在 WebBrowser 内执行脚本
  用法:
    Memo1.Lines.add('alert("Hello World!");');
    ExecuteScript(WebBrowser1, Memo1.Lines, 'javascript'); }
procedure TfrmSavePages.ExecuteScript(aWebBrowser: TWebBrowser; lScript: TStrings; language:  String = 'javascript');
var
  HTDoc: IHTMLDocument2;
begin
  HTDoc := (aWebBrowser.Document as IHTMLDocument2);
  if (HTDoc <> nil) then
  begin
    if HTDoc.parentWindow <> nil then
      HTDoc.parentWindow.ExecScript(lScript.Text, Olevariant(language)) ;
  end;
end;

{ 向目标页面加入HTML
  用法:
    Memo1.Lines.add('<div>AppendToWB()演示</div>');
    AppendToWB(WebBrowser1, Memo1.Lines); }
procedure AppendToWB(aWebBrowser: TWebBrowser; lHTML: TStrings) ;
var
  HTDoc: IHTMLDocument2;
  Range: IHTMLTxtRange;
begin
  HTDoc := (aWebBrowser.Document as IHTMLDocument2);
  if (HTDoc <> nil) then
  begin
    Range := (HTDoc.body AS IHTMLBodyElement).createTextRange;
    Range.Collapse(False);
    Range.PasteHTML(lHTML.Text);
  end;
end;

{ 另一种加入HTML内容的方法,和之前插入方式不同,这个可以执行脚本
  用法:WBLoadHTML(WebBrowser1, Memo1.Lines);}
procedure WBLoadHTML(WebBrowser: TWebBrowser; lHTML: TStrings);
var
  ms: TMemoryStream;
begin
  // 转到一个空页面
  WebBrowser.Navigate('about:blank');
  while WebBrowser.ReadyState < READYSTATE_INTERACTIVE do
    Application.ProcessMessages;

  if Assigned(WebBrowser.Document) then
  begin
    ms := TMemoryStream.Create;
    try
      // 将页面内容写入内存流
      lHTML.SaveToStream(ms);
      ms.Seek(0, soFromBeginning);
      (WebBrowser.Document as IPersistStreamInit).Load(TStreamAdapter.Create(ms));
    finally
      ms.Free;
    end;
  end;
end;

总结了一下,在已经载入的页面中执行脚本,最短的代码就是上面贴的这个了:

ExecuteScript(WebBrowser1, Memo1.Lines, 'javascript');

将要执行的脚本内容读取到Memo1中,然后调用这个就可以了。后面的 javascript 也可以换成 vbscript。

关于两个写入HTML,第一个 AppendToWB() 方法虽然简单,但是不能执行脚本。而 WBLoadHTML() 通过 IPersistStreamInit接口写入HTML数据,相当于重载页面,所以附加<script>标签也是可行的,推荐使用。 具体区别下载完整工程感受下吧。

时间: 2025-01-19 17:23:03

Delphi中WebBrowser例程的相关文章

Delphi中动态链接库两种调用方式的比较

一.动态链接库的概念 动态链接库(Dynamic Link Library,缩写为DLL)是一个可以被其它应用程序共享的程序模块,其中封装了一些可以被共享的例程和资源.动态链接库文件的扩展名一般是dll,也有可能是drv.sys和fon,它和可执行文件(exe)非常类似,区别在于DLL中虽然包含了可执行代码却不能单独执行,而应由Windows应用程序直接或间接调用. 动态链接是相对于静态链接而言的.所谓静态链接是指把要调用的函数或者过程链接到可执行文件中,成为可执行文件的一部分.换句话说,函数和

Delphi中取得系统支持的颜色数的方法

在自己的软件中经常需要得知运行本软件的系统支持的颜色数.例如有的软件在16Bits的颜色数的计算机上开发而成,程序的颜色调试得非常漂亮,但是到了一台只支持16色的计算机上,程序变得非常难看.这就需要得到系统的颜色数. Delphi中如何取得系统的颜色数呢?下面的程序就解决这个问题. function GetSysColorNum:Integer; Var ScreenDc:HDC; NumBitsPixel:Integer; begin Result:=0; ScreenDc:=GetDC(0)

Delphi中TApplication类的用法

在Delphi中TApplication是一个有着十分重要作用的类.TApplication类是用于描述Delphi编制的应用程序的一个类.通过对这个类的灵活应用可以编制许多有特点的程序.. 1) 检测当前Windows程序是否被激活: TApplication类有一个属性--Active,这个属性就可以描述当前运行的程序是否被激活,成为Windows的焦点.检 测的代码如下: If Application.Active=False then ShowMessage('当前窗口没有被激活');

Delphi中利用钩子实现QQ聊天窗口的修改

有人曾为公司不让用QQ.MSN等聊天工具而烦恼吗?看了下面的小程序你就会打消这种看法了. 当初公司做校园一卡通的项目时,里面的机房客户端需要用到系统的低级键盘钩子WH_KEYBOARD_LL,这也是我第一次接触到Windows中的Hook,因为WH_KEYBOARD_LL和其他钩子不一样,在Delphi的Windows帮助以及windows.pas文件中都没有定义,但microsoft的msdn中确有WH_KEYBOARD_LL的介绍,所以一路解决后就对Windows的系统钩子产生了兴趣.之后相

Delphi中如何取得系统支持的颜色数

在自己的软件中经常需要得知运行本软件的系统支持的颜色数.例如有的软件在16Bits的颜色数的计算机上开发而成,程序的颜色调试得非常漂亮,但是到了一台只支持16色的计算机上,程序变得非常难看.这就需要得到系统的颜色数. Delphi中如何取得系统的颜色数呢?下面的程序就解决这个问题. function GetSysColorNum:Integer; Var ScreenDc:HDC; NumBitsPixel:Integer; begin Result:=0; ScreenDc:=GetDC(0)

Delphi中的消息处理

1.windows的消息驱动体系 在windows系统中,消息传递是实现对乡间通信和控制的主要手段.可以额系统都以消息驱动的方式工作.系统中发生的用户输入操作.显示信息的改变.系统环境参数变化等所有时间都以系统定义消息的形式出现在相关的应用程序和窗口.所以程序设计的主要任务就是为这些消息的处理设计代码. 在应用程序中,发送者可以通过发送消息要求接收者完成相应的处理.当程序运行时,windows系统为每个应用程序实例建立一个消息队列,一次保存发送给该程序实例的消息,在应用程序的主控部分,需要设置一

初探Delphi中的插件编程

前言 我写Delphi程序是从MIS系统入门的,开始尝试子系统划分的时候采用的是MDI窗体的结构.随着系统功能的扩充,不断有新的子系统加入系统中,单个工程会变得非常大,每次做一点修改都要重新编译,单个工程的形式也不利于团队协作.为了提高工作效率,我希望利用DLL动态链接库的形式实现插件结构的编程. 插件结构的编程需要一个插件容器来控制各DLL的运行情况,将划分好的每个子系统安排到一个DLL库文件中.对每个DLL程序需要为容器预留接口函数,一般接口函数包括:启动调用DLL库的函数.关闭DLL库的函

Delphi中实现让TListView接收文件拖放

在使用Delphi开发应用程序时常常要使用到TListView列表视控件,但是仅仅使用TListView的原有属性.方法和事件是不够的,常常需要在程序开发过程中对列表视的功能进行扩展, 比如对列表视添加任意列组合排序.ListItem拖动.CustomDraw自绘制.加入背景图等功能,由此可见Delphi自带的TListView列表视控件功能有限,并不让人感到满意.为了让列表视具有更多的功能,我们只有求助于第三方控件,或者自己编写代码对TListView进行改造. 最近我在用Delphi开发一个

在Delphi中的Access技巧集

1.DELPHI中操作ACCESS数据库(建立.mdb文件,压缩数据库) 以下代码在WIN2K,D6,MDAC2.6下测试通过, 编译好的程序在WIN98第二版无ACCESS环境下运行成功. //在之前uses ComObj,ActiveX //声明连接字符串 Const SConnectionString = 'Provider=Microsoft.Jet.OLEDB.4.0;Data Source=%s;' +'Jet OLEDB:Database Password=%s;'; //====