我搜遍了大富翁和本论坛,找到的方法是:webbrowser1.oleobject.document.documentelement.document.frames.item(i)去操作其中的元素,但当框架中的连接是一个网址时,如:HTTP://www.XXX.com/df.htm这类时就会被EoleException类拒绝访问,无法操作该框架,无法取得该框架的内容。而当框架中的连接只是一个网页时(如df.htm)则没问题。谁能解决,这个问题只要解决了我给300分,决不食言!

解决方案 »

  1.   

    在页面的webbrower控件的documentcomplete事件这样写:
    procedure TForm.WebBrowser1DocumentComplete(Sender: TObject;
          const pDisp: IDispatch; var URL: OleVariant);
    begin
      webbrowser1.OleObject.document.all.[页面控件name].value :=[赋值];
      ...       
    end;
    比如说你是通过点击button1就连接到HTTP://www.XXX.com/df.htm填写网页,那么还需要在button1.onclick事件中这样写:
    procedure TForm.Button1Click(Sender: TObject);
    const regurl='HTTP://www.XXX.com/df.htm';
    begin
      ..
      WebBrowser1.Navigate(regurl);
      ..
    end;
    这样写就能设置该框架的内容,获取类似吧,给你做个参考
      

  2.   

    呵呵看看我的代码,试过可以的。
    uses mshtml;var
      frame: IHTMLElement;
      coll: IHTMLElementCollection;
      i: integer;
    begin
      try
        coll := (WebBrowser1.Document as IHTMLDocument2).all;
        coll := (coll.tags('frame') as IHTMLElementCollection);
        for i := 0 to coll.Length - 1 do begin
          frame := (coll.item(i, 0) as IHTMLElement);
          ShowMessage(frame.getAttribute(WideString('src'), 0));
        end;
      except
      end;
    end;
      

  3.   

    to sysu(死树):不行呀老兄,这样只能看到该框架的SCR,能不能帮我把该框架的页面的内容给弄出来,如用innerhtml之类得到框架里面的页面的信息呀。我实在搞不了,请帮忙好吗,谢谢了
      

  4.   

    OnDocumentComplete事件,下面代码把每个框架的内容添加到Memo1中:procedure TForm1.WebBrowser1DocumentComplete(Sender: TObject;
      const pDisp: IDispatch; var URL: OleVariant);
    var
      Frame, Bod, Doc: Variant;
    begin
      Frame:=IWebBrowser(pDisp).Document;
      Bod:=Frame.Body;
      memo1.Text:= memo1.Text + #13#10 + '<!-- NEW FRAME --!>'+ #13#10 + Bod.InnerHTML;
      memo1.Update;
      Doc:=WebBrowser1.Document;
      if CompareText(String(doc.ReadyState),'complete')=0
      then begin
        if ( pos('res://', Doc.URL)=1 )
        then ShowMessage('Error:'+#10+Doc.Title)
        else ShowMessage('Document complete');
      end;
    end;
      

  5.   

    谢谢你,老兄,你的技术真高,只是我还有一个问题(我技术太差了,希望你不要觉得烦):我要在一个按钮的onclick事件里去点击框架里的一个链接(假如链接的元素文本为“点击这里”,该如何做呢?
    我又该如何设置这个pDisp呢?
    在你的例子里直接用了事件传入的参数,在按钮事件里有该怎么设它?我刚才想把它在MEMO中显示出来,可惜也没成功。
      

  6.   

    查了以前写过的代码,不用在OnDocumentComplete事件也可以做到:uses mshtml, ActiveX;// 获取框架对象
    function GetFrame(wb: TWebBrowser; FrameNo: Integer): IWebbrowser2;
    var
      OleContainer: IOleContainer;
      enum: IEnumUnknown;
      unk: IUnknown;
      Fetched: PLongint;
    begin
      if Assigned(wb.Document) then
      begin
        Fetched := nil;
        OleContainer := wb.Document as IOleContainer;
        OleContainer.EnumObjects(OLECONTF_EMBEDDINGS, Enum);
        Enum.Skip(FrameNo);
        Enum.Next(1, Unk, Fetched);
        Result := Unk as IWebbrowser2;
      end else Result := nil;
    end;procedure TForm1.Button1Click(Sender: TObject);
    var
      link, frame: IHTMLElement;
      coll, coll1: IHTMLElementCollection;
      doc: IHTMLDocument2;
      i,j: Integer;
    begin
      try
        coll := (WebBrowser1.Document as IHTMLDocument2).all;
        coll := (coll.tags('frame') as IHTMLElementCollection);
        for i := 0 to coll.Length - 1 do begin
          frame := (coll.item(i, 0) as IHTMLElement);
          doc := (GetFrame(WebBrowser1, i).Document as IHTMLDocument2);
          // 框架的源地址
          Memo1.Lines.Add(frame.getAttribute(WideString('src'), 0));
          // 框架的内容
          Memo1.Lines.Add(doc.Body.innerhtml);
          // 查找‘点击这里’的链接并点击
          coll1 := doc.links;
          for j := 0 to coll1.Length - 1 do begin
            link := (coll1.item(j, 0) as IHTMLElement);
            if link.outerText = '点击这里' then begin
              link.Click;
              Exit;
            end;
          end;
        end;
      except
      end;
    end;
      

  7.   

    这个IWebbrowser2是什么?
    问题已经解决,请 sysu(死树)到下面几个帖子发个领分贴,谢谢了:
    http://expert.csdn.net/Expert/topic/1386/1386036.xml?temp=.8232233   (100分)
    http://expert.csdn.net/Expert/topic/1394/1394223.xml?temp=.1435968   (100分)
    http://expert.csdn.net/Expert/topic/1412/1412989.xml?temp=.6315729   (50分)
    http://expert.csdn.net/Expert/topic/1394/1394225.xml?temp=.8195001   (100分贴,给你50)