直接访问webbrowser控件中的html源码


      但是在实际编程过程中,这个控件提供的功能有很多限制,比如对html文档的浏览,只能通过指定url或文件名来实现,不能像以往使用thtml控件那样直接读写html源码。因此如果程序动态生成了一段html文本,就必须把文本内容先写到一个临时文件,然后再将此文件的文件名传递给webbrowser控件,实现显示。走这一个弯路使程序响应速度受到很大影响,而且容易遗留下一些"垃圾"(临时文件)。 

      在考察了一些使用了webbrowser控件的程序后,发现大部分程序,如着名国产软件foxmail,都是使用的通过临时文件传递html文档的方法;但一些国外的软件,如ms自己的outlook express则不存在这个问题,而因为其无需产生临时文件,因此对html文档的显示速度明显超过foxmail。 

      其实,webbrowser控件中的document对象,这个对象提供了一个ipersiststreaminit接口,通过此接口,我们可以方便地实现对html源码的读写。 

      接着在系统全局堆里分配一块内存,将需要显示的html源码复制进去。

      值得注意的是,每个关于com接口的函数调用,也就是那些返回类型为hresult的函数,都必须以olecheck包装,因为一个不检查返回状态的com接口操作实在太危险了;此外接口的释放,虽然delphi可以在后台自动完成,但作为一个好的编程习惯,还是应该显式地手工释放,释放只需将接口设为nil即可。 

      此函数有一个参数webbrowser指定从那个控件读取html源码,返回一个字符串为此控件中的html源码。首先还是要先检查webbrowser.document对象是否有效,无效则退出;然后取得ipersiststreaminit接口;接着取得html源码的大小:本来应该使用ipersiststreaminit接口的getsizemax函数,但在我的机器上测试,这个函数范围值衡为0,无效。因此只能先定义一个足够大的缓冲区,如bufsize = $10000字节(注意此缓冲区应该足够大);然后同样地分配全局堆内存块,建立流,然后将html文本写到流中。因为此html文本在流中是以#0结尾的字符串,因此可以用size := strlen(pchar(hhtmltext))取得实际长度,用setlength(result, size);设置返回字符串长度为html源码实际长度,最后复制字符串到返回字符串中。 

      至此,直接访问webbrowser控件中的html源码所需的两个函数全部解析完毕。 

      不过需要注意的时,在使用这两个函数前,最好对webbrowser.document对象进行初始化。下面提供一个函数,通过显示一个空白页面实现webbrowser.document对象初始化。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值