<总结>delphi WebBrowser控件的使用中出现的bug
Delphi WebBrowser控件的使用中出现的bug:
补充:WebBrowser的OnVisible事件 控制窗口的可见或隐藏,用法同上(经测试Visual属性改变时不会激发)
上述补充参考原网址: http://www.tuicool.com/articles/2ai6fi
delphi中WebBrowser控件打开的网页,不能复制、粘贴,包括右键菜单及快捷键。
解决办法如下:
引用:uses Activex;
把以下代码放在有WebBrowser控件的窗口最后一个End前面:
initialization
oleinitialize(nil);
finalization
oleuninitialize;
转载于:http://blog.sina.com.cn/s/blog_62dcdf1a0100qu7d.html
4、webbrowser控件显示网页遇到页面内有关闭窗口脚本问题
问题讨论网址: http://bbs.csdn.net/topics/390229795
解决办法网址:http://www.cnblogs.com/dlwang2002/archive/2007/04/14/713499.html
代码:
//webbrowser控件显示网页遇到页面内有关闭窗口脚本问题。运行完后执行Window Close的提示
var
vDefInetExplorerServerProc: Pointer;
function InetExplorerServerWndProc(
hwnd: HWND; Msg: UINT; wParam: WPARAM; lParam: LPARAM): LRESULT; stdcall;
begin
Result := CallWindowProc(vDefInetExplorerServerProc,
hwnd, Msg, wParam, lParam);
case Msg of
WM_DESTROY:
begin
SetWindowLong(hwnd, GWL_WNDPROC, Integer(vDefInetExplorerServerProc));
ShowMessage('Window Close'); //执行语句
end;
end;
end;
procedure TForm1.WebBrowser1DocumentComplete(Sender: TObject;
const pDisp: IDispatch; var URL: OleVariant);
var
vShellDocObjViewHandle: THandle;
vInetExplorerServerHandle: THandle;
begin
vShellDocObjViewHandle := GetWindow(TWebBrowser(Sender).Handle, GW_CHILD);
vInetExplorerServerHandle := GetWindow(vShellDocObjViewHandle, GW_CHILD);
if Integer(@InetExplorerServerWndProc) <>
GetWindowLong(vInetExplorerServerHandle, GWL_WNDPROC) then
begin
Integer(vDefInetExplorerServerProc) :=
GetWindowLong(vInetExplorerServerHandle, GWL_WNDPROC);
SetWindowLong(vInetExplorerServerHandle, GWL_WNDPROC,
Integer(@InetExplorerServerWndProc));
end;
end;
//分割线
下面为从网页转载的web控件bug和解决办法参考
url:http://bbs.51cto.com/thread-656975-1.html
简介: Delphi语言,无论是从开发速度、还是运行速度、还是编译速度、还是编译之后的执行文件体积,都是数一数二的。因此被作为共享软件、开发产品、制作“绿色软件”的首选。但是,由于诸多原因,Delphi中,有一些控件,存在一些bu ...
关键字:delphi WebBrowser 控件 Bug 复制 内存 泄漏 javascript close
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的解决办法,希望对大家有帮助!
<总结>delphi WebBrowser控件的使用中出现的bug的更多相关文章
- Delphi WebBrowser控件的使用(大全 good)
Delphi WebBrowser控件的使用 WebBrowser控件属性:1.Application 如果该对象有效,则返回掌管WebBrowser控件的应用程序实现的自动化对象(IDis ...
- delphi WebBrowser控件上网页验证码图片识别教程(一)
步骤一:获取网页中验证码图片的url地址 在delphi中加入一个BitBtn和一个memo以及WebBrowser控件实现网页中验证码图片的url地址的获取 程序如下:procedure TForm ...
- Delphi中WebBrowser控件打开部分网站报"Invalid floating point operation”解决
Delphi中WebBrowser控件打开部分网站报"Invalid floating point operation”解决 EmbeddedWBWebBrowserDelphi 最近用E ...
- Delphi中代替WebBrowser控件的第三方控件
这几天,接触到在delphi中内嵌网页,用delphi7自带的TWebBrowser控件,显示的内容与本机IE8显示的不一样,但是跟装IE8之前的IE6显示一个效果.现在赶脚是下面两个原因中的一个: ...
- 使用WebBrowser控件时在网页元素上绘制文本或其他自定义内容
原文:使用WebBrowser控件时在网页元素上绘制文本或其他自定义内容 第一次在CNBlogs上发Post是提出一个有关使用WebBrowser控件时对SELECT网页元素操作的疑惑,这个问题至今也 ...
- 浏览器自动化的一些体会2 webBrowser控件之ajax
上个帖子简要讨论了浏览器自动化的几种方法.现在讨论webBrowser控件使用中的一些问题.基本的操作就不详细说了,随便网上找个帖子或找本书都有介绍的.这里只写点网上似乎少有人总结过的内容,以及自己的 ...
- C#中的WebBrowser控件的使用
0.常用方法 Navigate(string urlString):浏览urlString表示的网址 Navigate(System.Uri url):浏览url表示的网址 Navigate(st ...
- C# WebBrowser控件使用教程与技巧收集
常用的方法 Navigate(string urlString):浏览urlString表示的网址 Navigate(System.Uri url):浏览url表示的网址 Navigate(strin ...
- C# 指定Webbrowser控件所用IE内核版本
如果电脑上安装了IE8或者之后版本的IE浏览器,Webbrowser控件会使用IE7兼容模式来显示网页内容.解决方法是在注册表中为你的进程指定引用IE的版本号. 比如我的程序叫做a.exe,以64位机 ...
随机推荐
- C#多线程编程
一.使用线程的理由 1.可以使用线程将代码同其他代码隔离,提高应用程序的可靠性. 2.可以使用线程来简化编码. 3.可以使用线程来实现并发执行. 二.基本知识 1.进程与线程:进程作为操作系统执行程序 ...
- 实用的CSS3属性和使用技巧
CSS可以改进网站的设计并且开拓网站设计更多的可能性,可以令你的网页更具吸引力.对于前端开发者.网站设计师来说,掌握并熟练应用CSS是一项必不可少的技能. 下面列出了一些非常实用的CSS3属性和使用技 ...
- 10个调试Java的技巧
调试不仅可以查找到应用程序缺陷所在,还可以解决缺陷.对于Java程序员来说,他们不仅要学会如何在Eclipse里面开发像样的程序,更需要学会如何调试程序.本文介绍了Java程序员必知的10个调试技巧, ...
- 一个简单的WPF字体选择器实现
很久没有写博客了. 这是放暑假中的第一篇博客,以后会多多更新!!! 这就是我写的一个字体选择器,界面如下: 本程序用到的技术比较简单,仅仅是用了Font类的几个方法和数据绑定而已. 首先建一个四行两列 ...
- 零基础如何学习java更有效呢?
零基础学java,不知道该如何入手?也不知道学习的方向,很多人会问零基础怎么样学习,有没有什么入门的书籍推荐:只要方法正确,零基础学好java也是有机会的哦. 一.理解Java思想 Java是一门面向 ...
- (Spring4 json入门)Spring4+SpringMVC+页面数据发送与接收(json格式)
jar包(Maven仓库): Spring4 jar包(Maven仓库): 在测试过程中我查看了网上的一些教程,但是那些教程都是在Spring3环境下的,Spring3和Spring4解析json需要 ...
- python基础之异常处理
Python3 错误和异常 作为Python初学者,在刚学习Python编程时,经常会看到一些报错信息,在前面我们没有提及,这章节我们会专门介绍. Python有两种错误很容易辨认:语法错误和异常. ...
- B/S结构的流程简单概述
在介绍appl ication 对象之前,先简单介绍一些Web 服务器的实现原理. 对于大部分浏览器而言,它通常负责完成三件事情: (1)向远程服务器发送请求. (2)读取远程服务器返 ...
- OData V4 学习目录
开放数据协议(Open Data Protocol,缩写OData)是一种描述如何创建和访问Restful服务的OASIS标准. Open Data Protocol (开放数据协议,OData)是用 ...
- CSS属性简写
盒模型简写: 如果top.right.bottom.left的值相同,如下面代码:margin:10px 10px 10px 10px; 缩写为:margin:10px; 如果top和bottom值相 ...