delphi与网页交互

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
pDisp: IDispatch; var URL: OleVariant);
var
hr: HResult;
CustDoc: ICustomDoc;
begin
hr := WebBrowser1.Document.QueryInterface(ICustomDoc, CustDoc);
if hr = S_OK then
了解了这些特点,我们就可以在实际应用开发中,适时地选择HTML技术。下面举个例子:
一种仪器的管理程序,需要显示该仪器的操作方法文档,包含文字和图片,并要求可以隐藏或显示文档,并能安要求打印。
这个应用中,图文显示、隐藏/显示部分文档、图文打印等需求,都是HTML界面所擅长的,用传统的表单控件实现几乎无法想像。
begin
ShowMessage('成功从HTML中调用Delphi的过程。');
end;
procedure TForm1.WebBrowser1DocumentComplete(Sender: TObject;
const pDisp: IDispatch; var URL: OleVariant);
var
Form1: TForm1;
FDocHostUIHandler: TDocHostUIHandler;
...
implementation
...
procedure TForm1.FormCreate(Sender: TObject);
begin
FDocHostUIHandler := TDocHostUIHandler.Create;
var
Doc : IHTMLDocument2;
Element : IHTMLElement;
begin
Doc := IHTMLDocument2(WebBrowser1.Document);
if nil <> Doc then
begin
//找到HTML元件
Element := Doc.all.item('B3', 0) as IHTMLElement;
用什么实现HTML的界面
用Delphi实现HTML界面的应用主要有两种选择:WebBrowser Control或MSHTML。为了弄清两者如何选择,我们先来看看Internet Exporer 4.0及其后续版本的体系结构:
IE浏览器是建立在SHDOCVW.DLL组件之上的,而SHDOCVW.DLL则建立在MSHTML.DLL组件 之上,底层则包括脚本引擎等。SHDOCVW.DLL提供了对活动文档(Active Document)的支持----例如Word等文档可以在IE中显示,并提供导航、in-place*连接、收藏夹、浏览历史和分级内容选择 (PICS: Platform for Internet Content Selection)等功能。SHDOCVW.DLL组件虽然也提供了很多接口可以单独使用,但是通常所指的SHDOCVW.DLL就是 WebBrowser Control。MSHTML.DLL是实行HTML解析和表现的组件。它通过DHTML对象模型提供对HTML文档的访问。它实现了活动文档服务器接 口,可以通过COM接口调用。
var
Doc : IHTMLDocument2;
Element : IHTMLElement;
begin
Doc := IHTMLDocument2(WebBrowser1.Document);
Assert(nil <> Doc);//一定要先加载HTML
Element := Doc.all.item('ShowMessage', 0) as IHTMLElement;
if nil <> Element then
begin
Element.innerText := Msg;
Element.click;
end;
end;
我发现在Delphi中用Browser显示HTML,如果你的表单是作为EXE运行,然后嵌入到了别的表单的组件上显示的,例 如,Form1.Parent := Form2.Panel1,即Form1显示在Form2中Panel1所占据的位置,当你用ShowMessage显示提示信息时,HTML的内容依然 可以被操作,这显然不太好。使用JavaScript中的alert函数则可避免这种现象。
如何禁止右键菜单(如何禁止用户查看源代码)
默认情况下,在显示HTML的WebBrowser上点击鼠标右键,会显示一个弹出菜单,和IE中看到的一样。通过这个菜单用户可以查看 HTML的源代码。因此有时候我们需要屏蔽该菜单。和该菜单相关的接口是IEDocHostUIHandler。已经用人对它进行了封装,详见ieConst.pas 和 IEDocHostUIHandler.pas。使用方法如下:
end;
procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
EventSink.Free;
end;
procedure TForm1.DemoEventSink(Sender: TObject);
var
Doc : IHTMLDocument2;
inputText : IHTMLInputTextElement;
begin
Doc := IHTMLDocument2(WebBrowser1.Document);
if nil <> Doc then
begin
//如果T1不是IHTMLInputTextElement类型将出错
隐藏/显示HTML元件代码示例:
var
Doc : IHTMLDocument2;
element: IHTMLElement;
begin
Doc := IHTMLDocument2(WebBrowser1.Document);
if nil <> Doc then
begin
element := Doc.all.item('T1', 0) as IHTMLElement;
if nil <> element then begin
if '' = element.style.display then
element.style.display := 'none'
else
element.style.display := '';
end;
end; end; Nhomakorabea设置/取值代码示例:
不难看出,WebBrowser在比较高的层次上,提供了更为丰富的功能,因此一般通常编程都采用WebBrower控件。MSHTML只有在需要解析HTML这样的特殊应用中,才推荐使用。微软的MSDN网站上提供了一个使用MSHTML的例子:WalkAll Sample Source Page。
(*注:In-place链接,是指点击HTML连接时,在相同的WebBrowser实例中显示连接的HTML文档。如果仅使用MSHTML.DLL,点击链接将导致在新的浏览器实例中打开链接的文档。)
HTML事件的响应方式有两种:一种是JavaScript,一种是在Delphi中响应。一些简单的功能可以在JavaScript中实现, 这样易于修改。但是从功能、安全性等方面考虑,通常还是要在Delphi中实现。例如当用户点击HTML上的一个按钮时,需要访问数据库,这是就得用 Delphi了。
在Delphi中响应HTML事件,实际上就是响应ActiveX事件的问题,这通过事件槽(Event Sink)来实现,有些繁琐。还好前人已经为我们作了很多工作。利用Experts Exchange网站的Cynna封装的TDHTMLEvent类(该源码请看本文的附件),实现就简单多了。实现代码如下:
var
Form1: TForm1;
EventSink: TDHTMLEvent;
...
implementation
...
procedure TForm1.FormCreate(Sender: TObject);
begin
EventSink:= TDHTMLEvent.Create;
CustDoc.SetUIHandler(FDocHostUIHandler);
end;
有时你可能还需要定制自己的右键菜单,这是还是要借助于IEDocHostUIHandler,具体实现方法可以看看MSDN Library。
如何响应HTML的事件(如何在HTML中调用Delphi的代码)
inputText := Doc.all.item('T1', 0) as IHTMLInputTextElement;
inputText.value := Edit1.Text;
Edit2.Text := inputText.value;
end;
end;
提示:关于哪些HTML元件(标记)应该采用什么MSHTML接口进行访问,请参考MSDN Library中的Web Development > Programming and Reusing the Browser > MSHTML Reference > Interfaces and Scripting Objects。
end;
procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
FDocHostUIHandler.Free;
end;
procedure TForm1.WebBrowser1NavigateComplete2(Sender: TObject;
如何能在HTML控件上输入回车
含有多行文本输入框(textarea )或提交(submit)按钮的HTML表单在TWebBrowser中显示时,对回车键不响应。另外,Delphi表单上按钮的快捷字母键也无法在HTML表单上输入,因为一输入就触发相应按钮的单击事件。解决代码如下:
如何访问HTML页面的内容
首先,在Delphi 7.0组件面板的Internet页上,把TWebBrowser组件放到表单上,并手动把MSHTML加入到Uses列表中。
通过执行以下语句装载HTML文档到WebBrowser中进行显示:
WebBrowser1.Navigate(GetCurrentDir + '\index.htm');
delphi与网页交互
HTML的界面有以下特点:图文混排,格式灵活,可以包含Flash、声音和视频等,实现图文声像的多媒体界面,而且易于建立和维 护。另外,HTML的显示环境一般机器上都具备,通常不需要安装额外的软件。当然,HTML界面也有它欠缺的方面,即:界面控制能力有限,代码调试不便 ----虽然DHTML提供了比较强的编程特性,但是比起Delphi的传统的开发语言和工具来,对界面的控制能力,尤其是和数据交互时的控制能力还是稍 逊一筹。
下面我们就用Delphi调用JavaScript的alert函数来实现消息提示框。首先在HTML中加入:
<span style="display:none" ></span>
Delphi中的调用代码如下:
procedure TForm1.Alert(const Msg : string);
//使HTML元件的click事件和DemoEventSink过程关连
Element.onclick := EventSink.HookEventHandler(DemoEventSink);
end;
end;
点击HTML页面中ID为'B3'的按钮,就会调用DemoEventSink过程。
如何调用JavaScript函数(兼谈消息提示框)
知道了访问HTML内容的方法,就可以通过间接方式调用HTML页面上包含的JavaScript代码。具体实现方式是:在HTML中插 入<span></span>等不可见元件,利用它的click事件调用响应的JavaScript函数,然后再Delphi中 调用该元件的click过程。
相关文档
最新文档