delphi TWebBrowser组件概述

该组件是一个浏览器组件,可以显示一个指定地址的网页、设置网页打开时的主页以及对网页进行相关的操作,同时也可以对HTML文件进行剪切、复制、粘贴、删除等操作。该 组件在Internet组件页中。
1.属性
(1)AddressBar属性
设置是否显示地址栏,在TWebBrowser中没有用。
语法:
property AddressBar: WordBool;
(2)Busy属性
确定Web浏览器组件是否正在导航到一个新的URL地址或正在下载文档。
语法:
property Busy: WordBool;
示例:
如果该属性值为True,则在开始一个新的操作前,可用Stop方法中止当前操作,然后再导航到其他的页面,代码如下:
procedure TForm1.BitBtn1Click(Sender: TObject);
begin
if WebBrowser1.Busy then
WebBrowser1.Stop;
WebBrowser1.Navigate(‘www.mingrisoft.com’);
end;
(3)Container属性
访问Web浏览器父类或容器的接口。
语法:
property Container: IDispatch;
示例:
如果Web浏览器没有一个具有Automation接口的容器,则该属性的值为空。否则可以通过返回的接口,访问Web浏览器父类或容器,代码如下:
if WebBrowser1.Container <> nil then
begin
WebBrowser1.Stop;
end
else
ShowMessage(‘Web浏览器没有一个具有Automation接口的容器’);
(4)ControlInterface属性
访问WebBrowser组件接口,这个接口允许一个Automation控制器访问Web浏览器的属性、方法和事件。
语法:
property ControlInterface: IWebBrowser2;
示例:
显示WebBrowser1组件的名称,代码如下:
Showmessage(WebBrowser1.ControlInterface.Name);
(5)FullName属性
指定主机上Web浏览器组件的可执行文件的完整的合法路径名。
语法:
property FullName: WideString;
示例:
显示Web浏览器组件所在的可执行文件的名称,并且包含路径,代码如下:
ShowMessage(‘Web组件所在的可执行文件为:’+WebBrowser1.FullName);
(6)LocationName属性
获得当前在Web浏览器组件中显示的资源名。
语法:
property LocationName: WideString;
示例:
显示网页标题的名称,代码如下:
ShowMessage(‘网页标题名:’+WebBrowser1.LocationName);
(7)LocationURL属性
确定当前显示文档、文件夹的URL或路径。
语法:
property LocationURL: WideString;
示例:
显示地址的完整路径,代码如下:
ShowMessage(‘Web浏览器组件连接的URL为:’+WebBrowser1.LocationURL);
(8)Name属性
指定计算机上的TWebBrowser的名称。
语法:
property Name: WideString;
(9)Offline属性
指定Web浏览器是否从本地缓存中获取文档。该属性为True时,表示Web浏览器以脱机方式工作,否则为在线方式。
语法:
property Offline: WordBool;
注意:可以使用IE浏览器保存HTML网页到本地缓存,浏览器可以脱机方式工作。
(10)Path属性
指定主机上Web浏览器组件可执行文件的路径名,不包括文件名。
语法:
property Path: WideString;
示例:
Str := WebBrowser1.Path;
(11)ReadyState属性
获得指定Web浏览器组件的状态信息,使用这个信息可避免Web浏览器执行未准备的操作。
语法:
property ReadyState: TOleEnum;
(12)RegisterAsBrowser属性
设置该属性为True时,当前使用的Web浏览器组件成为最高级别浏览器。
语法:
property RegisterAsBrowser: WordBool;
(13)RegisterAsDropTarget属性
指出是否允许用户拖放HTML文档到当前Web浏览器。
语法:
property RegisterAsDropTarget: WordBool;
示例:
该属性为True时,允许用户拖放HTML文档到当前Web浏览器;否则拖放操作无效,代码如下:
procedure TForm1.ToolButton4Click(Sender: TObject);
begin
if not WebBrowser1.RegisterAsDropTarget then
WebBrowser1.RegisterAsDropTarget:=true;
end;
(14)Silent属性
指定TWebBrowser是否显示对话框。该属性为True时,该对话框不再显示脚本错误。
语法:
property Silent: WordBool;
(15)Type_属性
指定包含的文档对象的类型名称,读取该属性以确定Automation对象的类型,该对象的接口通过Document属性表示。
语法:
property Type_: WideString;
示例:
显示文件的类型,代码如下:
ShowMessage(‘Automation对象的类型为:’+WebBrowser1.Type_);
2.方法
(1)ClientToWindow方法
IE使用该方法转换客户坐标与窗口坐标。一般不要使用该方法。
语法:
procedure ClientToWindow(var pcx: SYSINT; var pcy: SYSINT);
pcx:坐标点X。
pcy:坐标点Y。
(2)ExecWB方法
允许用户用IOleCommandTarget接口传递一个命令到当前Web浏览器组件。Microsoft定义了一些常量来表示这些命令,但是Web浏览器不全部支持这些命令,可用QueryStatusWB方法使用这些命令。
语法:
procedure ExecWB(cmdID: OLECMDID; cmdexecopt: OLECMDEXECOPT); overload;
procedure ExecWB(cmdID: OLECMDID; cmdexecopt: OLECMDEXECOPT; var pvaIn: OleVariant);
overload;
procedure ExecWB(cmdID: OLECMDID; cmdexecopt: OLECMDEXECOPT; var pvaIn: OleVariant;
var pvaOut: OleVariant); overload;
示例:
调用ExecWB方法能够完成许多功能,例如停止网页浏览,代码如下:
WebBrowser1.ExecWB(OLECMDID_STOP,OLECMDEXECOPT_PROMPTUSER);
(3)GoBack方法
返回到历史列表中的上一个文档。如果历史列表中没有包含另外的文档,该方法将无效。
语法:
procedure GoBack;
示例:
返回当前页的上一页,代码如下:
WebBrowser1.GoBack();
(4)GoForward方法
返回到历史列表中的下一个文档,与最后调用GoBack方法的效果相反。
语法:
procedure GoForward;
示例:
返回当前页的下一页,但是如果历史列表中没有下一个文档,则产生异常,代码如下:
try
WebBrowser1.GoForward();
except
exit;
end;
(5)GoHome方法
返回已注册主页或开始页,在注册表中指定主页的注册项为:HKEY_CURRENT_USER\Sof- tware\Microsoft\IE\Main下的SStartpage名称栏。可用TRegistry、TRegistryIniFile对象或IE 浏览器“工具”中的Internet选项改变注册主页。
语法:
procedure GoHome;
示例:
返回主页,代码如下:
if WebBrowser1.Busy then
WebBrowser1.Stop;
WebBrowser1.GoHome;
(6)GoSearch方法
打开已注册的搜索网页,在注册表中指定搜索网页的注册项为:HKEY_CURRENT_USER\ Sof- ware\Microsoft\IE\Main下的SearchPage名称栏。可用TRegistry、TRegistryIniFile对象或IE浏览器中“工具”中的Internet选项改变注册搜索网页。
语法:
procedure GoSearch;
示例:
打开已注册的搜索网页,代码如下:
if WebBrowser1.Busy then
WebBrowser1.Stop;
WebBrowser1.GoSearch();
(7)Navigate方法
定位或下载指定的资源,发送HTTP消息到指定的URL并显示指定文件的内容,也可用来显示指定的文件。
语法:
procedure Navigate(const URL: WideString); overload;
procedure Navigate(const URL: WideString; var Flags: OleVariant); overload;
procedure Navigate(const URL: WideString; var Flags: OleVariant;var TargetFrameName:
OleVariant); overload;
procedure Navigate(const URL: WideString; var Flags: OleVariant; var TargetFrameName:
OleVariant; var PostData: OleVariant); overload;
procedure Navigate(const URL: WideString; var Flags: OleVariant; var TargetFrameName:
OleVariant; var PostData: OleVariant; var Headers: OleVariant); overload;
Navigate方法语法中各参数的说明如表26.14所示。
示例:
Navigate方法是TWebBrowser组件中最重要的方法之一,使用该方法能够将当前TWebBrowser组件导航到任何存在的链接上,代码如下:
if WebBrowser1.Busy then
WebBrowser1.Stop;
WebBrowser1.Navigate(URL); //URL为网址
(8)Navigate2方法
定位或下载指定的资源,发送HTTP消息到指定的URL并显示指定文件的内容,或导航到不能表达为URL的资源。
语法:
procedure Navigate2(var URL: OleVariant); overload;
procedure Navigate2(var URL: OleVariant; var Flags: OleVariant); overload;
procedure Navigate2(var URL: OleVariant; var Flags: OleVariant; var TargetFrameName:
OleVariant); Overload;
procedure Navigate2(var URL: OleVariant; var Flags: OleVariant; var TargetFrameName:
OleVariant; var PostData: OleVariant); overload;
procedure Navigate2(var URL: OleVariant; var Flags: OleVariant; var TargetFrameName:
OleVariant; var PostData: OleVariant; var Headers: OleVariant); overload;
示例:
Navigate2方法与Navegate方法类似,能够将当前TWebBrowser组件导航到指定的资源,代码如下:
procedure TForm1.GoUrl2(URL: String); //URL为指定的资源的网址
var
oUrl:Olevariant;
oPost,oFram,oflag:Olevariant;
begin
oUrl:=Url;
oFram:=0;
oFlag:=navOpenInNewWindow; //在新窗口中打开资源
oPost:=”;
if WebBrowser1.Busy then
WebBrowser1.Stop;
WebBrowser1.Navigate2(oUrl,oFlag,oFram,oPost); //WebBrowser1.Navigate2(‘.\a.html’,oFlag:=1);打开本目录的a.html,在浏览器显示
end;
(9)QueryStatusWB方法
确定可以使用ExecWB方法执行的命令,即Web浏览器支持的命令信息,该方法使用IOleCommandTarget接口的QueryStatus方法来得到命令状态的信息。
语法:
function QueryStatusWB(cmdID: OLECMDID): OLECMDF;
cmdID:指定要获取其信息的命令。
(10)Refresh方法
重新载入当前文档。Web浏览器正在显示的URL指定的资源可能已经发生变化时,这个方法非常有用。该方法总是发送一个参数,即非缓存标题,通知服务器不要返回缓存的复制,这对于某些服务器可能是一个问题。为阻止发送这个非缓存标题参数或只是刷新过期的网页,可用Refresh2方法。
语法:
procedure Refresh;
示例:
该方法完成了IE浏览器的刷新功能,可以使用该方法来重新载入当前页面,如果当前TWebBrowser组件没有载入任何的网页,则会产生异常,代码如下:
if WebBrowser1.LocationURL<>” then
WebBrowser1.Refresh;
(11)Refresh2方法
调用Refresh2方法重新装入当前文档,与Refresh方法不同的是,该方法可指定要完成的刷新级别。
语法:
procedure Refresh2; overload;
procedure Refresh2(var Level: OleVariant); overload;
Level:指定要被刷新信息的类型,其取值如表7所示。
示例:
Refresh2方法提供了更加复杂的刷新方式,提供了多种刷新方法,通过该方法同样能够实现Refresh方法完成的任务,代码如下:
procedure TForm1.ToolButton7Click(Sender: TObject);
var
Level:Olevariant;
begin
Level:=REFRESH_IFEXPIRED;
if WebBrowser1.LocationURL<>” then
WebBrowser1.Refresh2(Level);
end;
(12)Stop方法
终止任何未完成的导航或下载操作,并终止任何动态的网页元素,如背景音乐和动画等。
语法:
procedure Stop;
示例:
该方法实现了IE中的停止功能,即停止了一切载入工作,代码如下:
WebBrowser1.Stop;
3.事件
(1)OnBeforeNavigate2事件
Web浏览器导航到一个新的资源前被触发。
语法:
property OnBeforeNavigate2: TWebBrowserBeforeNavigate2;
type TWebBrowserBeforeNavigate2 = procedure(Sender: TObject; const pDisp: IDispatch; var URL: OleVariant; var Flags: OleVariant; var TargetFrameName: OleVariant; var PostData: OleVariant; var Headers: OleVariant; var Cancel: WordBool) of object;
(2)OnCommandStateChange事件
当执行TWebBrowser组件的某个方法的功能改变时被触发,其状态取值决定于执行Web浏览器中某个方法的功能。
语法:
property OnCommandStateChange: TWebBrowserCommandStateChange;
type TWebBrowserCommandStateChange = procedure(Sender: TObject; Command: Integer; Enable: WordBool) of object;
Sender:指出其功能已变化的Web浏览器组件。
Enable:指定CSC_NAVIGATEFORWARD或CSC_NAVIGATEBACK命令是否可用,其值为True时,可用;否则不可用。
示例:
OnCommandStateChange事件提供了一个命令状态改变后的处理功能,通过该事件能够判断执行某个命令后的当前浏览器状态,例如控制“后退”、“前进”或“停止”按钮是否可用,代码如下:
procedure TForm1.WebBrowser1CommandStateChange(Sender: TObject;
Command: Integer; Enable: WordBool);
begin
case Command of
CSC_NAVIGATEBACK: ToolButton5.Enabled := Enable; //“后退”按钮
CSC_NAVIGATEFORWARD: ToolButton4.Enabled := Enable; //“前进”按钮
CSC_UPDATECOMMANDS: ToolButton2.Enabled := TWebBrowser(Sender).Busy; //“停止”按钮
end;
end;
(3)OnDownloadBegin事件
Web浏览器开始下载一个文档时被触发,编写其事件处理程序可以指定Web浏览器定位到一个文档后下载该文档前应采取的操作。
语法:
property OnDownloadBegin: TNotifyEvent;
type TNotifyEvent = procedure (Sender: TObject) of object;
(4)OnDownloadComplete事件
导航操作完成、暂停或操作失败时被触发,编写其事件处理程序可以指定应采取的操作。
语法:
property OnDownloadComplete: TNotifyEvent;
type TNotifyEvent = procedure (Sender: TObject) of object;
(5)OnNavigateComplete2事件
当Web浏览器成功地导航到一个新的位置时被触发,编写其事件处理程序可以指定应执行的操作。这个事件可能产生在当前文档下载完成前,但是事件结束时,至少已经接收到部分文档并产生了文档视图。
语法:
property OnNavigateComplete2: TWebBrowserNavigateComplete2;
type TWebBrowserNavigateComplete2 = procedure(Sender: TObject; const pDisp:
IDispatch; var URL: OleVariant) of object;
Sender:导航到新的资源的Web浏览器。
pDisp:浏览器的Automation接口。
示例:
当TWebBrowser组件成功地导航到一个新的位置后触发该事件,利用该事件能够获得当前状态或URL地址,代码如下:
if WebBrowser1.Offline then
Statusbar1.Panels[Statusbar1.Panels.Count-1].Text:=’脱机’;
else
Statusbar1.Panels[Statusbar1.Panels.Count-1].Text:=’在线’;
ComboBox1.Text:=WebBrowser1.LocationURL;
(6)OnProgressChange事件
当更新下载操作的进度时被触发,编写其事件处理程序可以提供一个关于下载进度的可视化的反馈。
语法:
property OnProgressChange: TWebBrowserProgressChange;
type TWebBrowserProgressChange = procedure(Sender: TObject; Progress: Integer;
ProgressMax: Integer) of object;
Sender:正在下载文档处理进程中的Web浏览器。
Progress:指出有多少文档已经下载,取值范围在0~ProgressMax之间。当其参数为−1时,操作结束。
PropressMax:指示下载操作的最大值。
示例:
利用该事件能够设计一个准确的网页载入进度条,该进度条表示了当前网页的载入进度,代码如下:
procedure TForm1.WebBrowser1ProgressChange(Sender: TObject; Progress,
ProgressMax: Integer);
begin
ProgressBar1.Max:=ProgressMax;
if Progress = -1 then
ProgressBar1.Visible:=false
else
begin
ProgressBar1.Position := Progress;
ProgressBar1.Visible := True;
end;
if ProgressBar1.Position = ProgressMax then
ProgressBar1.Visible:=False;
end;

附加:

1.获得网页中变量值
htm中
程序中可以这么调用 id := Form1.WebBrowser1.OleObject.Document.script.currID
值得说明的是,变量可以是javascript定义的,也可以是vbscript定义的,如果Webbrowser1中找不到该变量,调用会触发一个异常事件,即变量currID不存在

2.执行网页中的函数
tmp := ‘currID = getNextID(currID)’+#13#10;
Form1.WebBrowser1.OleObject.Document.parentWindow.execScript(tmp,’JavaScript’);
调用函数的方法就是execScript接口,同样,如果函数不存在,或者运行错误也会触发脚本错误异常

3.设置网页背景
背景图片 WebBrowser1.OleObject.Document.body.background := ‘http://seelearn.com/bg.gif’
背景颜色 WebBrowser1.OleObject.Document.body.bgcolor := ‘#eeeeee’

4.调用网页中已知对象
src := WebBrowser1.OleObject.Document.getElementByID(‘img1’).src
该方法其实就是javascript中的 getElementByID

5.获取页面中所有的frame
使用DHTML。
frames:=wb.OleObject.document.frames;
for i:=0 to frames.length do
memo1.lines.Add(frames[i].document.body.innerHTML);
6.BorderStyle=bsNone后Webbrowser会被重新初始化
这是一个让人很意外的一个问题,Delphi在窗口控件的控制方面做得非常好,很少出现这种BUG
根据分析,出现这个现象有很多情况 改变FormStyle也会出现 ; 如果 webbrowser.parent 由panel1 改到panel2.也会导致webbrowser重新
初始化。

7.直接向Webbrowser中写入html代码,不需要Navigate到实际存在的文件
var
StrStream:TStringStream;
SetNoteStr: string;
begin
SetNoteStr :=’

点点博客 http://seelearn.com

‘;
SetNoteStr :=SetNoteStr+’

点击左边按钮可查看对应图片

‘;
StrStream:=TStringStream.Create(SetNoteStr);
WebBrowser1.Navigate(‘about:blank’);
try
StrStream.Position:=0;
( WebBrowser1.Document as IPersistStreamInit).Load(TStreamadapter.Create(StrStream));
finally
StrStream.Free;
end;

8.前进,后退,刷新
self.WebBrowser1.GoBack
self.WebBrowser1.GoForward
self.WebBrowser1.Refresh

9.捕捉NewWindow2事件,即新开窗口事件
procedure TForm1.WebBrowser1NewWindow2(Sender: TObject;
var ppDisp: IDispatch; var Cancel: WordBool);
var
NewWindow: TForm2;
begin
//exit;
NewWindow:= TForm2.Create(nil);
NewWindow.Show;
ppDisp:= NewWindow.Webbrowser1.DefaultDispatch;
end;
值得一题的是该方法不能获得新开窗口的URL,退一步的方法只能是等到在新的Webbrowser中触发BeforeNavigate2事件判断了

10.网页中存在iframe时判断页面是否下载结束
procedure TForm1.WebBrowser1DocumentComplete(Sender: TObject;
const pDisp: IDispatch; var URL: OleVariant);
begin
if WebBrowser1.Application = pDisp then showmessage(‘页面已全部下载完毕’)
end;
说明一下,每个iframe下载完毕都会触发DocumentComplete事件,所以一个页面在真正下载完毕前可能被触发多次



发表评论

您的电子邮箱地址不会被公开。

+ 86 = 90