当前位置: 首页 > article >正文

Delphi7中WebBrowser控件的bug及解决方案

  Delphi语言,无论是从开发速度、还是运行速度、还是编译速度、还是编译之后的执行文件体积,都是数一数二的。因此被作为共享软件、开发产品、制作“绿色软件”的首选。但是,由于诸多原因,Delphi中,有一些控件,存在一些bug。不论广大技术人员如何反应,Delphi官方就是“视而不见”。有问题,人家虽然不给解决,但是,总不能不用这种语言吧,毕竟优点还是大于缺点的。还是“自己动手,丰衣足食”吧。

  最近笔者在开发泛东协同管理系统客户端的时候,使用了Delphi中的WebBrowser控件,相信这个控件,是使用最广泛的控件之一,几乎所有与Internet相关的产品,都离不开这个控件。但是这Delphi中的WebBrowser控件,在使用过程中,发现三个Bug。

  1、如果打开的页面中,有通过javascript关闭页面的,只会把控件关闭,包含控件的窗口仍然存在,并且手工关闭窗口时,出现问题;

  2、打开的页面,通过鼠标选定的内容,不能复制,无论是通过右键菜单复制,还是通过Ctrl+C快捷键复制,都不可以;

  3、打开有WebBrowser控件的窗口,关闭窗口之后,内存得不到释放(此Bug在其他语言中也存在)。

 

  以上三个问题,是必须解决的。通过查找资料及自己的试验,终于找到了解决办法,将解决方案总结如下:

 

问题1解决方案:

先声明消息处理函数:
procedure   ApplicationMessage(var   Msg:   TMsg;   var   Handled:   Boolean);

 

在form   create时   
Application.OnMessage   :=   ApplicationMessage;

 

函数内容如下:

procedure   tfrmhtmlbrowser.ApplicationMessage(var   Msg:   TMsg;   var   Handled:   Boolean);  
  var  
      wb:   tembeddedwb;  
  begin  
      WB   :=   GetVisibleWebBrowser;   //取当前webbrowser控件  
      if   (Msg.message   =   WM_CLOSE)   and   (Msg.hwnd   =   Wb.Handle)   then  
      begin   
          Self.Close ();//关闭webbrowser后,把相应的窗口关闭

      end  
      else  
          inherited;  
  end;

 

问题2解决方案:

引用:uses Activex;

 

把以下代码放在有WebBrowser控件的窗口最后一个End前面:

initialization
    oleinitialize(nil);
finalization
    oleuninitialize;

 

问题3解决方案:

修改Delphi的控件源码:OleCtrls.pas

 

修改此文件中的函数:GetIDispatchProp、GetIUnknownProp

修改如下:

 

function TOleControl.GetIDispatchProp(Index: Integer): IDispatch;
var
  Temp: TVarData;
begin
  GetProperty(Index, Temp);
  //Result := IDispatch(Temp.VDispatch);
  Pointer(Result) := Temp.VDispatch;
end;

 

function TOleControl.GetIUnknownProp(Index: Integer): IUnknown;
var
  Temp: TVarData;
begin
  GetProperty(Index, Temp);
  //Result := IUnknown(Temp.VUnknown);
  Pointer(Result) := Temp.VUnknown;
end;

 

修改之后,重新编译。

 

以上是Delphi中WebBrowser控件Bug的解决办法,希望对大家有帮助!

文章原文:http://www.oku4.com/article/2010/0117/article_1138.html

http://www.lryc.cn/news/2416853.html

相关文章:

  • 硬盘显示容量和实际容量不符合_让小小白变大白的笔记本电脑知识科普(硬盘篇)...
  • 工具分享:易读文档下载器(同时支持百度/豆丁)
  • 在网页上漫步太空,谷歌推出谷歌天空网页版
  • 微信红包助手:自动抢红包,智能更轻松
  • H264/H265 PS 流分析
  • 解决 java.sql.SQLException: ORA-01688: unable to extend table XXX partition YYY by 1024 in tablespace
  • 三种常见中文内码的转换方法
  • 如何捕获access violation异常
  • c3p0详细配置
  • 实例表现ibatis的基础用法(不断更新)
  • 为intellij idea添加YUI Compressor支持
  • 详细解释PHP中header
  • JavaScript的数组操作
  • 软件工程相关知识点
  • IIS启动不了解决方法
  • Java API 使用文档中文版下载
  • LangChain搭建Agent | 使用initialize_agent
  • Android学习笔记(十) 主题样式的设置
  • 渗透中寻找突破口的那些事
  • 解决QQ在线客服代码提示对方“QQ在线状态”服务尚未启用
  • VM12即VMware Workstation 12 序列号
  • linux修改vcf编码格式,飞翔vcf文件编码转换
  • [转]灰度共生矩阵(超简单理解)
  • web网页死链接检查工具——“Scrutiny 8”
  • 修改framework-res.apk的内容
  • u盘安装ubuntu 11.10的惨痛经历
  • webim--web端即时通讯的实现
  • 推荐两个软件下载网站:多特和绿盟
  • Spring源码中的工具类
  • python爬取discuz_爬虫技术实践(二)Discuz! 按板块爬取帖子内容实战