我想取得一个网页里的所有链接,但是网页由四个框架组成,即:
    doc:=wb1.document as IHTMLDocument2;
    len:=doc.frames.length;此时len=4
那么,请问:此时,我如何能够依次取得每个框架里的内容?急用!谢谢

解决方案 »

  1.   

    procedure TForm1.Button1Click(Sender: TObject);
    var
      doc,frm: IHTMLDocument2;
      iw: IWebbrowser2;
      i: integer;
    begin
      doc := WebBrowser1.Document as IHTMLDocument2;
      for i := 0 to doc.frames.length-1 do
      begin
        iw := GetFrame(i);
        frm := iw.Document as IHTMLDocument2;
        Memo1.Lines.Add('============== Frame ' + IntToStr(i) +' ==================');
        Memo1.Lines.Add(frm.body.outerHTML);
      end;
    end;function TForm1.GetFrame(FrameNo: Integer): IWebbrowser2;
    var
      OleContainer: IOleContainer;
      enum: IEnumUnknown;
      unk: IUnknown;
      Fetched: PLongint;
    begin
      while Webbrowser1.ReadyState <> READYSTATE_COMPLETE do
        Application.ProcessMessages;
      if Assigned(Webbrowser1.document) then
      begin
        Fetched := nil;
        OleContainer := Webbrowser1.Document as IOleContainer;
        OleContainer.EnumObjects(OLECONTF_EMBEDDINGS, enum);
        Enum.Skip(FrameNo);
        Enum.Next(OLECONTF_EMBEDDINGS, Unk, Fetched);
        Result := Unk as IWebbrowser2;
      end
      else
        Result := nil;
    end;
      

  2.   

    谢谢,但是IOleContainer要调用哪个单元啊?
      

  3.   

    看看这个方法是不是比较容易理解一些:procedure TMainForm.ToolButton56Click(Sender: TObject);
    var
      Index:      Integer;
      Document:   IHTMLDocument2;
      FrameIdx:   OleVariant;
      FrameDis:   IDispatch;
      FrameWin:   IHTMLWindow2;
    begin
      while Webbrowser1.ReadyState <> READYSTATE_COMPLETE do
        Application.ProcessMessages;  if WebBrowser1.Document = nil then Exit;
      if WebBrowser1.Document.QueryInterface(IHTMLDocument2, Document) <> 0 then Exit;
      if Document.frames.length > 0 then
      begin
        for Index := 0 to Document.frames.length - 1 do
        begin
          FrameIdx := Index;
          FrameDis := Document.frames.item(FrameIdx);
          if FrameDis.QueryInterface(IHTMLWindow2, FrameWin) <> 0 then Exit;
          ShowMessage(FrameWin.document.body.outerHTML);  
          //FrameWin.document 就是你要的每个 Frame 的文档
        end;
      end;
    end;参考:http://msdn.microsoft.com/library/default.asp?url=/workshop/browser/mshtml/reference/ifaces/document2/onclick.asp
      

  4.   

    谢谢,但是现在有新问题!我已进入框架并找到所需要的链接,但是在webbrowse组件里我用
    item:IHTMLElement;item.click后.为什么他会跑到webbrowse外面去用IE打开链接?而在IE里打开时他就是在本窗口内打开的!
      

  5.   

    为什么不转换个思路?用带有 PostData 的 Navigate ,实际 Click 过程最后就是触发了一个 Navigate 的函数调用。模拟点击往往还跟麻烦一些。
    供参考。至于你上面说的现象,我测试倒是没有问题。
      

  6.   

    也可以啊,现在这个网页里有四个frame
    也就是:doc.frames.length=4         //doc:IHTMLDocument2;
    那我如何让第三个frame转到一个网页呢?
      

  7.   

    一个frame转到一个网页呢? 什么意思啊?能说详细点吗?
      

  8.   

    如一个网页不是由三个frame组成吗?
    通常点击一个frame里的链接时,另外一个frame会打开你所点的链接,我要作的就是,不点击,如何让一个frame转到指定的链接.
      

  9.   

    试试这个方法 IHTMLWindow2::navigate