递归查询网页Frame

来源:互联网 发布:宁波行知小学怎么样 编辑:程序博客网 时间:2024/05/17 03:33
function GetFrame(ADoc:IHTMLDocument2 ; FrameNo:Integer):IWebbrowser2;
var
  OleContainer:IOleContainer;
  enum:IEnumUnknown;
  unk:IUnknown;
  Fetched:PLongint;
begin
  Result:=nil;
  try
    if Assigned(ADoc)then begin
      Fetched:= nil;
      OleContainer:= ADoc as IOleContainer;
      OleContainer.EnumObjects(OLECONTF_EMBEDDINGS,enum);
      Enum.Skip(FrameNo);
      Enum.Next(OLECONTF_EMBEDDINGS,Unk,Fetched);
      Result:=Unk as IWebbrowser2;
    end
    else
      Result:=nil;
  except
   ;
  end;
end;


function EnumFrame(ADoc:IHTMLDocument2; ElemrntID:string):IDispatch;
var
  i:Integer;
  frm: IHTMLDocument2;
  iw : IWebbrowser2;
  Ele : IHTMLElement;
begin
  Result:=nil;
  if(Assigned(ADoc)) then begin
    for i:=0 to ADoc.frames.length-1 do begin
      try
        iw:=GetFrame(ADoc, i);
        frm:=iw.Document as IHTMLDocument2;


        Ele:=nil;
        try
          Ele:=frm.all.item(ElemrntID, 0) as IHTMLElement;
        except
          Ele:=nil;
        end;
//        Form1.Memo1.Lines.Add( '==============Frame '+ IntToStr(i)+ '==================');
//        Form1.Memo1.Lines.Add(frm.body.outerHTML);


        if(Assigned(Ele)) then begin
//          Form1.Memo1.Lines.Add('找到 '+ElemrntID+' 啦');


          Result:=Ele;
          break;
        end;


        Result:=EnumFrame(frm, ElemrntID);
        if(Assigned(Result)) OR (Result<>nil) then break;
      except
       ;
      end;
    end;
  end;
end;


procedure TForm1.btn2Click(Sender: TObject);
var
  IsFindBackBtn:Boolean;
  wt:Integer;
  doc2: IHTMLDocument2;
  Ele : IHTMLElement;
  Ele2: IHTMLElement2;
begin
  IsFindBackBtn:=false;
  while (wb1.ReadyState <> READYSTATE_COMPLETE) do begin
    Application.ProcessMessages;
  end;


  doc2:= wb1.Document as IHTMLDocument2;
  Ele:=EnumFrame(doc2, 'aaaaaa') as IHTMLElement;
  if(Assigned(Ele)) then begin
    try
      Ele.setAttribute('value', Edit1.Text, 0);
    except
      ;
    end;
  end;


end;
0 0