使用TWebBrowser组件可以直接显示网页的内容, 因此在用delphi开发程序时,我们可以使用TWebBrowser来展示一些数据,获得更美观专业的效果,提高应用程序的挡次。
通常的做法时,做一些静态的页面,TWebBrowser装载这些页面后,再通过delphi填写数据。故需要用到的技
术就是如何通过delphi读取或者控制TWebBrowser中内容。其实TWebBrowser就是一个ActiveX控件的封装,由此可以预见,对TWebBrowser的控制是非常简单的事情。
以下是获取页面元素及内容的代码:
//有关页面操作的变量定义全部在MsHtml中,别忘了uses MsHtml
var
doc:IHTMLDocument2;
win:IHTMLWindow2;
Dispatch:IDispatch;
el:IHTMLElement;
begin
doc2 := WBrowser.Document as IHTMLDocument2; //获取页面的文档对象
el := doc2.getElementById('zjgnpanel'); //通过ID获取页面元素
label1Caption := el.innerHTML; //这就是元素所包含的内容
el.innerHTML := '元素的新内容'; //这样就可以设置元素的新内容
{不同页面元素有不同的属性和方法,这些知识可以参考其它文挡,或者直接阅读MsHtml中的代码
例如,如果是Input元素,可以通过value属性获取或者设置它的值}
//对于含有框架的页面稍微麻烦点
doc2 := WBrowser.Document as IHTMLDocument2; //获取页面总文档对象
Dispatch := doc2.frames.item('leftFrame'); //通过名称获取框架接口
Dispatch.QueryInterface(IhtmlWindow2,win2); //获取框架的窗口对象
doc3 := win2.Document as IHTMLDocument3; //获取框架的文档对象
el := doc2.getElementById('zjgnpanel'); //通过ID获取页面元素
......
end;
以下是一个应用程序中,在页面的左边矿架中显示当前操作员最近几次使用的功能代码片段:
......
doc2 := WBrowser.Document as IHTMLDocument2;
Dispatch := doc2.frames.item('leftFrame');
Dispatch.QueryInterface(IhtmlWindow2,win2);
doc3 := win2.Document as IHTMLDocument3;
sHtml:='';
//下面的代码根据数据集的内容构造HTML文本
while not cdsMenu.Eof do begin
sHtml:=sHtml+
'<div style="border:0px solid #5c77d7; margin:1px 1px 0px 1px; padding:2px 0px 0px 2px">'+
' <img align="absmiddle" src="i_drafts.gif">'+
' <a href=" onMouseOut="doMouseOut(this);" onClick="">'+
cdsMenu.FieldByName('FUN_NAME').AsString+
'</a></div>';
cdsMenu.Next;
end;
el := doc3.getElementById('zjgnpanel');
el.innerHTML := sHtml; //把HTML文本设置到页面中显示
......
如果想通过点击页面的连接来打开程序的功能,需要响应TWebBrowser的OnBeforeNavigate2事件,
下面是示例:
procedure TMainForm.WBrowserBeforeNavigate2(Sender: TObject;
const pDisp: IDispatch; var URL, Flags, TargetFrameName, PostData,
Headers: OleVariant; var Cancel: WordBool);
var
pURL:String;
k,j:Integer;
begin
pURL:=URL;
//URL是点击链接后,TWebBrowser需要访问的下个地址,因此对于通过分析地址来决定调用那些功能
pURL:=UpperCase(ExtractFileName(pURL));
pURL:=Trim(StringReplace(pURL,'/',' ',[rfReplaceAll])); //地址可能包含有//,把它替换掉
k := Pos('FUN',pURL); //如果地址中包含特别的字符串,本例子中为FUN,表示是需要打开功能链接
if k > 0 then
begin
Cancel:=True; {Cancel设置为True,告诉TWebBrowser,此链接有特别用处,TWebBrowser不需要
再去获取pURL页面}
pURL:=Copy(pURL,k+3,Length(pURL)-k-2); //去掉FUN,后面的内容就是功能标识
CallHytEx(pURL,Handle); //函数CallHytEx根据pURL打开不同的功能
end;
end;
该文章转载自网络大本营: