您的位置:首页 > 编程语言 > Delphi

Delphi中WebBrowser控件的3个bug及解决方案

2013-10-13 12:48 232 查看
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;

修改之后,重新编译。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: