高分求助TWEBBROWSER问题 帮顶有分

时间:2022-05-07 19:50:14
用TWEBBROWSER做了一个浏览器,调用本机的两个网页文件
网页中有大量的JAVESCRIP脚本,
在来回切换时出现三种错误,这三种错误不经常出,但总有,
   一个是MSHTML。DLL异常

  二是弹出一个对话框,标题为“实时调试”
   最上方是:“请选择一个调试器”
   下面是一个列表框,标题为“可能的调试器”
   列表框中有一个“新实例Mircosoft script editor”
     下方是一个复选框,内容是将当前的调试器设为默认调试器,对后最下方是,是否希望用选定的调试器进行调试然后是按钮

   三是 出现一个对话框,从英文看是告诉我在调试状态下

  第一个问题是测试时在所有机器上都会出现
  第二个问题和第三个问题,在有的机器上不出现,
  第三个问题出现后,会直接关闭程序

开发环境 D7 XP 
网页   javascrip,加MP7是由工具软件生成的
请高手解决

我的代码是这样
    我有一个单元,定义了一个类,这个类从数据库中读出参数,生成实例,然后在界面上生成按钮
    每个按钮对应这个类的一个实例
    点击一个按钮则会打开相应的网页,这些网页都是存在本地的,是由软件生成的MP7课件
    包含视频和PPT,并由网页中的javaSCRIPt 脚本负责视频和PPT的播放,同步问题,
    网页内的脚本是由软件生成的,而且单独播放一个是没有问题的
    问题都出在我不停的按按钮的时候,也就是我打开一个网页之后,马上又打开一个网页
    我想是WEBBROWSER调入了新的网页,但原网页中的脚本没有释放干净,或者还在运行,造成了冲突,所以出现了这个问题
    主要代码如下,
    unit define;

//
     TPowerCtl = class(TObject)
  private
    but: Boolean;
    Fobj: Tcontrol;
    FCtlInfo: TCtlFieldINfo;
    oldx: Integer;
    oldy: Integer;
    procedure objClick(Sender:Tobject);
    procedure objenter(sender:Tobject);

procedure TPowerCtl.objClick(Sender:Tobject);
var
  i:integer;
  doc:IHTMLDOCUMENT2;
// temp:integer;
begin
 // temp:=0;
  For i:=0 to TControl(sender).Parent.ControlCount-1 do
  begin

    if TControl(TControl(sender).Parent.Controls[i]).Tag =9999 then  //网页控件的TAG
    begin
      while  TWebBrowser(TControl(sender).Parent.Controls[i]).ReadyState <>4  do
       Application.ProcessMessages;// 完成后再执行

      TWebBrowser(TControl(sender).Parent.Controls[i]).Stop ;

      doc:=TWebBrowser(TControl(sender).Parent.Controls[i]).document as IhtmlDOCument2;
      doc.close ;
      doc.clear ;

      TWebBrowser(TControl(sender).Parent.Controls[i]).Navigate(MainPath+self.FCtlInfo.FINdexPage);    //调入相应的网页

      doc._Release;
    end;
  end;


end;

由主窗体调用这个单元,
在这个单元的初始化事件中初始化了OLE控件//这点我有疑问,到底在那初始化好
                                 //  WEB是办面上固定的,是否应当写在PRJ的初始化事件
                                 //或是主窗体单元的初始化事件中

12 个解决方案

#1


顶一下
上一贴上帮过忙的兄弟,上一贴已结贴给分,但如有空,请继续帮忙,

#2


顶顶~

#3


顶了,看...

#4


你得把两个网页给出来吧

#5


估计是因为:objClick还没执行完,新的objClick又执行了
需要想办法避免这样的情况

方案1
procedure TPowerCtl.objClick(Sender:Tobject);
//。。
begin
  Enabled := False; // 还没处理完的时候别让用户切换
//打开网页
  Enabled := True; // 处理完后才允许切换
end;

方案2
别用while do
通过事件WebBrowser1.OnDocumentComplete处理文档下载完的事件

#6


伴水兄,
由于网页打开一个新的网页之后,会自已去调用网页,所以我觉得用ONDOCUMENTCOMPLETE靠不住,,
我现在用readystate=4 来控制控件的enabled,
但是问题还是一样,
有没有办法在我中止网页的同时,中止网页中脚本的执行

#7


剪兄
  两个网页加起来300多M,我估计发不出来,含视频和PPT的,脚本也不是我写的,

#8


沒遇到過,我幫頂!

#9


初始化一定要加,很重要,格式:
uses ActiveX;


Initialization
   OleInitialize(nil);
finialization
   OleUnInitialize;

#10


两个网页加起来300多M,我估计发不出来,含视频和PPT的,脚本也不是我写的,


大汗,给出网页代码就可以吧!ppt和视频都是本地调用。
不过新手,不会webbrowser的异常处理。

#11


初始化应当加在那个单元?

#12


结帐给分

#1


顶一下
上一贴上帮过忙的兄弟,上一贴已结贴给分,但如有空,请继续帮忙,

#2


顶顶~

#3


顶了,看...

#4


你得把两个网页给出来吧

#5


估计是因为:objClick还没执行完,新的objClick又执行了
需要想办法避免这样的情况

方案1
procedure TPowerCtl.objClick(Sender:Tobject);
//。。
begin
  Enabled := False; // 还没处理完的时候别让用户切换
//打开网页
  Enabled := True; // 处理完后才允许切换
end;

方案2
别用while do
通过事件WebBrowser1.OnDocumentComplete处理文档下载完的事件

#6


伴水兄,
由于网页打开一个新的网页之后,会自已去调用网页,所以我觉得用ONDOCUMENTCOMPLETE靠不住,,
我现在用readystate=4 来控制控件的enabled,
但是问题还是一样,
有没有办法在我中止网页的同时,中止网页中脚本的执行

#7


剪兄
  两个网页加起来300多M,我估计发不出来,含视频和PPT的,脚本也不是我写的,

#8


沒遇到過,我幫頂!

#9


初始化一定要加,很重要,格式:
uses ActiveX;


Initialization
   OleInitialize(nil);
finialization
   OleUnInitialize;

#10


两个网页加起来300多M,我估计发不出来,含视频和PPT的,脚本也不是我写的,


大汗,给出网页代码就可以吧!ppt和视频都是本地调用。
不过新手,不会webbrowser的异常处理。

#11


初始化应当加在那个单元?

#12


结帐给分