使用WebBrowser控件的IHTMLDocument2接口的问题(100分)

  • 主题发起人 主题发起人 Langzii
  • 开始时间 开始时间
L

Langzii

Unregistered / Unconfirmed
GUEST, unregistred user!
以下两行代码不知道有何错误,请各位帮忙看看.
doc:=WebBrowser1.Document as IHTMLDOcument2;
all:=doc.Get_all;//执行此句出现"Access violation at address 0045B515"
(其中WebBrowser1是微软的WebBrowser控件)
 
估计是WebBrowser1.Document 是nil
doc是nil所以会"Access violation at address 0045B515"
试图编译,未遂, IHTMLDOcument2 哪里来的?
 
同意Kangxy的说法,
WebBrowser在浏览实际的网页之前Document是nil。
如果用来浏览本地文件夹也会这样
 
应该加上uses mshtml(d5) uses mshtml_tlb(d4)
wuwu,如果你有如何击败情敌的36计,告诉我下载地点
//wawl
 
应该为
var
all:IHtmlelementcollection;
doc:Ihtmlelementdocument2;
begin
webbrowser1.navigate('dkfja');//必须已经有页面浏览了
doc:=webbrowser1.document as ihtmldocument2;
all:=webbrowser1.get_all;
end;
 
Sorry!
我的程序里那两句前面就是Webbrowser1.navigate(...),只是提问时省略了.
 
Get_all是干什么? 想实现什么功能?
 
var
all:IHtmlelementcollection;
doc:Ihtmlelementdocument2;
a,b,c,d:OleVariant;
begin
webbrowser1.navigate('dkfja',a,b,c,d);//必须已经有页面浏览了
doc:=webbrowser1.document as ihtmldocument2;
<b>all:=webbrowser1.all;</b>

end;
 

doc:=WebBrowser1.Document as IHTMLDOcument2;
all:=doc.Get_all;
放在
procedure Tform1.WebBrowserDocumentComplete(Sender: TObject;
const pDisp: IDispatch; var URL: OleVariant);
里就可以了。
因为只有等LOAD完了才能调用DOCUMENT。
 
if doc <> nil then
all = doc.all
 
按我的做,没错的。
我已经试过了。
 
Get_all可以做些什么?
 
>>以下两行代码不知道有何错误,请各位帮忙看看.
>>doc:=WebBrowser1.Document as IHTMLDOcument2;
>>all:=doc.Get_all;//执行此句出现"Access violation at address0045B515"
>>(其中WebBrowser1是微软的WebBrowser控件)

问题是应该将all:=doc.Get_all;
改成all:=doc.all;
 
你的问题和NAVIGATE()函数的调用有关
NAVIGATE()函数调用后,WebBrowser不能够马上获得Document
下面是我的一小段原码,好用的哟!
/*************************************
WebB.Navigate(DLLURL + sUrl,vFlag);

while WebB.Busy do
Application.ProcessMessages ;

Doc:=webb.document as ihtmldocument2;
ScrCol:=Doc.get_scripts;
**************************************/
在你的程序中加上
while WebB.Busy do
Application.ProcessMessages ;
再四一下
 
同意qf0421和tomyang,调用 navigate 方法后是立即返回的,这时
Doc:=webb.document as ihtmldocument2 返回 nil ,必须等待下载完毕才能
使用 Doc:=webb.document as ihtmldocument2; 所以要么像qf0421那样在 WebBrowserDocumentComplete
事件里触发,要么像tomyang那样做一个循环直到下载完毕,再调用Doc:=webb.document as ihtmldocument2
 
tomyang:
你的方法是无效的.
while WebB.Busy do //-------false,不执行
Application.ProcessMessages ;
如elan所言,调用 navigate 方法后是立即返回的,webb根本不会busy,上面这段也就没有执行.
应为先循环后判断才可:
repeat
Application.ProcessMessages ;
until(not WebB.Busy);
doc:=webbrowser1.document as ihtmldocument2;
if doc<>nil then //链接出错则doc=nil
all:=webbrowser1.all;
撞上这个问题,折腾了我一天.
 
有时候要等一会,才会变busy的。
 
后退
顶部