procedure TForm1.Button3Click(Sender: TObject);
var
  Doc:IHTMLDocument2;
  UserName:IHTMLInputElement;
  Password: IHTMLInputElement;
begin
  wb.Navigate('http://www.xxx.com/login/');
  while wb.ReadyState<>4 do
    Application.ProcessMessages;  FUserName := GetUserName; //获取用户名
  if FUserName <> '' then
  begin
    Doc := wb.Document as IHTMLDocument2;
    UserName := Doc.all.item('username',varEmpty) as IHTMLInputElement;
    UserName.value:=FUserName;
    Password := Doc.all.item('password',varEmpty) as IHTMLInputElement;
    Password.value := '530251';
  end;
  Wb.OleObject.document.getElementsByTagName('input').item(2).click;  //登录的序号  wb.Navigate('www.xxx.com/xxxx');  //转到其他页面
  Wb.OleObject.document.getElementsByTagName('input').item(3).click; //新页面的button的序号
end;执行会出现错误:Access violation at address 004657CDF in module 'test.exe'. Read of address 00000000如果把上面最后一句:
Wb.OleObject.document.getElementsByTagName('input').item(3).click;
放在另一个Button里执行就不会出错。请问放在同一个Button的单击事件里,要怎么写才不会出错

解决方案 »

  1.   

    wb.Navigate('www.xxx.com/xxxx'); //转到其他页面
    没有加载完成,你就直接用Wb.OleObject.document.getElementsByTagName('input').item(3).click肯定出错了
    得等待wb.Navigate('www.xxx.com/xxxx')加载完成后在执行Wb.OleObject.document.getElementsByTagName('input').item(3).click
    可以考虑在OnDocumentComplete中做相应的处理
      

  2.   

    procedure TfrmWebClient.wbNoticeDocumentComplete(Sender: TObject;
      const pDisp: IDispatch; var URL: OleVariant);根据URL判断下试试
      

  3.   

    Navigate后,你没有保证网页已经下载完毕,这样就找不到按钮,访问必然出错,你最好在documentcomplete事件中判断一下是否完成,然后再点击
      

  4.   

    if url = ''www.xxx.com/xxxx' then
      Wb.OleObject.document.getElementsByTagName('input').item(3).click
    错误提示跟前面的一样?能否写下判断代码,谢谢!
      

  5.   

    要判断一下转向后的网页是否下载完毕:
    if not(web.busy) then begin 
    if   Web.ReadyState   =   READYSTATE_COMPLETE     then 
    if Web.Application = pDisp then
    ......根据情况定另外要获得转向后的网页地址,URL :=(web.Document as IHTMLDocument2).url;
    与www.xxx.com/xxxx比较,如果完全相同再执行你的点击代码。
      

  6.   

      if (Wb.ReadyState = READYSTATE_COMPLETE) then
      begin
        URL :=(wb.Document as IHTMLDocument2).url;
        if URL = 'www.xxx.com/xxxx' then
        begin
          Wb.OleObject.document.getElementsByTagName('input').item(3).click;
        end;
      end;  也是一样的错误的提示,会不会跟www.xxx.com/xxxx页面会播放一段flash视频有关,如果这样要怎么写代码才能让Wb.OleObject.document.getElementsByTagName('input').item(3).click;顺利执行?
      

  7.   

    Wb.OleObject.document.getElementsByTagName('input').item(2).click; //登录的序号
    如果上面一行是执行登录操作,下面的一行就不必要要了。因为执行完上面的操作,页面就要自动转向下一页面。
    wb.Navigate('www.xxx.com/xxxx'); //转到其他页面 把这行删了//看看你转向后的页面对不对?showmessage(url);看是不是你要执行Wb.OleObject.document.getElementsByTagName('input').item(3).click的页面
      

  8.   

    登录的后转向的页面是所有flash列表的界面,我在登录后用wb.Navigate('www.xxx.com/xxxx')某个特定用户的Flash页面
      

  9.   

    要不你可以试试加个Timer,在页面加载完成后延迟几秒在执行Wb.OleObject.document.getElementsByTagName('input').item(2).click
      

  10.   

    加Timer延迟确实可以,有没有其他什么更好的方法可以直接判断呢?documentcomplete事件里
    if (Wb.ReadyState = READYSTATE_COMPLETE) then
       begin
       URL :=(wb.Document as IHTMLDocument2).url;
       if URL = 'www.xxx.com/xxxx' then
       begin
         Application.message('', '', mb_ok);
         //Wb.OleObject.document.getElementsByTagName('input').item(3).click;
       end;
       end;执行时弹出对话框,关闭之后马上就能显示网页,换成Wb.OleObject.document.getElementsByTagName('input').item(3).click就是出错
      

  11.   

    以前用WEBBROWSER写网络程序 也是用LZ这招用一个Timer1 里边
    检测 if Web.ReadyState = 4 then  
    再检测 URL= ‘目标网址’  然后timer1 停止
    然后进行后续操作。老是要判断网页是否完全加载 不方便
    有空 直接学习IDHTTP