zoukankan      html  css  js  c++  java
  • <总结>delphi WebBrowser控件的使用中出现的bug

    Delphi WebBrowser控件的使用中出现的bug:


     

     1、WebBrowser.Visible=false;Visible属性不能使WebBrowser控件不可见,暂时用 WebBrowser.Hide的方法代替,WebBrowser.Hide隐藏浏览器, WebBrowser.Show显示浏览器;
        补充:WebBrowser的OnVisible事件 控制窗口的可见或隐藏,用法同上(经测试Visual属性改变时不会激发)
        上述补充参考原网址:   http://www.tuicool.com/articles/2ai6fi    
        
     2、使用WebBrowser1.Quit;方法退出浏览器,系统报错“未指定目标”,解决办法暂无;
        
     3、Delphi中webbrowser 不能复制粘贴 
             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中WebBrowser控件的bug及解决方案
    简介:  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的解决办法,希望对大家有帮助!
  • 相关阅读:
    poj1113--凸包(Andrew)
    php变量内存完全释放
    php的内存分配还是很智能的
    git 忽略权限记录一下
    开启事务处理插入多条数据 速度也可以
    var_dump(is_writeable(ini_get("session.save_path")));
    要注意一下xss攻击啊
    select *," as A from B union ...
    多次踩坑
    js instanceof运算符
  • 原文地址:https://www.cnblogs.com/CQ-LQJ/p/5165326.html
Copyright © 2011-2022 走看看