我搜遍了大富翁和本论坛,找到的方法是:webbrowser1.oleobject.document.documentelement.document.frames.item(i)去操作其中的元素,但当框架中的连接是一个网址时,如:HTTP://www.XXX.com/df.htm这类时就会被EoleException类拒绝访问,无法操作该框架,无法取得该框架的内容。而当框架中的连接只是一个网页时(如df.htm)则没问题。谁能解决,这个问题只要解决了我给300分,决不食言!
调试欢乐多
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;
这样写就能设置该框架的内容,获取类似吧,给你做个参考
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;
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;
我又该如何设置这个pDisp呢?
在你的例子里直接用了事件传入的参数,在按钮事件里有该怎么设它?我刚才想把它在MEMO中显示出来,可惜也没成功。
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;
问题已经解决,请 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)