delphi中Webbrowser的使用技巧Word下载.docx
《delphi中Webbrowser的使用技巧Word下载.docx》由会员分享,可在线阅读,更多相关《delphi中Webbrowser的使用技巧Word下载.docx(25页珍藏版)》请在冰点文库上搜索。
![delphi中Webbrowser的使用技巧Word下载.docx](https://file1.bingdoc.com/fileroot1/2023-5/9/34d76a1e-51f6-4836-9c5f-c8f7d38642cc/34d76a1e-51f6-4836-9c5f-c8f7d38642cc1.gif)
因为Web应用中如果出错的一般是采用错误页面的方式呈现给最终用户,所以我们也无法抓到Http错误,只能通过在webBeforeNavigate2事件中将URL参数记录到全局变量中,然后在webDocumentComplete事件中根据URL参数和全局变量中的URL参数来判断执行结果是否正确.当然,这样需要将页面地址编码到代码中,降低了灵活性,但是这也是我能想到的唯一的方法,如果大家有什么好的方法,请告诉我哦.
5.屏蔽鼠标右键和某些快捷键
本功能需要在webBrowser的窗口中加入ApplicationEvents组件,设置它的OnMessage事件代码如下即可.
procedureTwebAdapterForm.ApplicationEvents1Message(varMsg:
tagMSG;
varHandled:
Boolean);
const
_KeyPressMask=$80000000;
//禁用右键
withMsgdo
ifnotIsChild(web.Handle,hWnd)thenExit;
Handled:
=(message=WM_RBUTTONDOWN)or(message=WM_RBUTTONUP)or(message=WM_CONTEXTMENU);
//禁止Ctrl+N
//禁止Ctrl+F
//禁止Ctrl+A
ifMsg.message=WM_KEYDOWNthen
if((Msg.lParamand_KeyPressMask)=0)and
(GetKeyState(VK_Control)<
0)and((Msg.wParam=Ord('
N'
))
or(Msg.wParam=Ord('
F'
))or(Msg.wParam=Ord('
A'
)))then
=True;
6.在页面关闭的时候,同时关掉包含页面的VCLForm.(仅限InternetExplorer6.0)
本功能需要卸载掉Delphi自带的WebBrowser组件,安装ActionX组件(MicrosoftInternetControlsV1.1),而且以后的程序只能运行在安装有InternetExplorer6.0的环境下.具体方法如下:
在WebBrowser组件的OnWindowClosing事件中,输入self.close;
代码即可.如果需要阻止窗口的关闭,设置CanClose参数的值为Flase.
7.如何将页面中超链接新开的页面窗口包到指定的VCL窗口中.
procedureTForm1.webNewWindow2(Sender:
TObject;
varppDisp:
IDispatch;
varCancel:
WordBool);
var
form:
TForm1;
=TForm1.Create(nil);
ppDisp:
=form.web.DefaultDispatch;
form.Show;
8.在WebBrowser加载html页面完成后,在页面顶端插入HTML代码,下面两种方式斗可以.
{1.----------------------------------------------------------------}
procedureTForm1.Button1Click(Sender:
TObject);
var
Range:
IHTMLTxtRange;
begin
Range:
=((WebBrowser1.DocumentasIHTMLDocument2).bodyas
IHTMLBodyElement).createTextRange;
Range.collapse(False);
Range.pasteHTML('
<
br/>
b>
Hello!
/b>
'
{2.----------------------------------------------------------------}
procedureTForm1.WebBrowser1DocumentComplete(Sender:
constpDisp:
varURL:
OleVariant);
WebDoc:
HTMLDocument;
WebBody:
HTMLBody;
WebDoc:
=WebBrowser1.DocumentasHTMLDocument;
WebBody:
=WebDoc.bodyasHTMLBody;
WebBody.insertAdjacentHTML('
BeforeEnd'
'
h1>
HelloWorld!
/h1>
9.将页面中显示的内容全部选中,然后粘贴到Word文档中.
WebBrowser1.ExecWB(OLECMDID_SELECTALL,OLECMDEXECOPT_DODEFAULT);
//全选网页
WebBrowser1.ExecWB(OLECMDID_COPY,OLECMDEXECOPT_DODEFAULT);
//复制网页
WordDocu.Range.Paste;
//word文档粘贴
WebBrowser1.ExecWB(OLECMDID_UNDO,OLECMDEXECOPT_DODEFAULT);
//取消全选
注:
WebBrowser的Document属性值和WordDocument的Document属性值必须都不为nil.
10.如何解决网页不响应回车事件
public
{Publicdeclarations}
procedureMsgHandle(varMsg:
TMsg;
varHandled:
Boolean);
Form1:
FOleInPlaceActiveObject:
IOleInPlaceActiveObject;
implementation
{$R*.DFM}
procedureTForm1.MsgHandle(varMsg:
iOIPAO:
Dispatch:
IDispatch;
ifWebBrowser1=nilthen
=False;
Exit;
=(IsDialogMessage(WebBrowser1.Handle,Msg)=True);
if(Handled)and(notWebBrowser1.Busy)then
ifFOleInPlaceActiveObject=nilthen
=WebBrowser1.Application;
ifDispatch<
>
nilthen
Dispatch.QueryInterface(IOleInPlaceActiveObject,iOIPAO);
ifiOIPAO<
=iOIPAO;
ifFOleInPlaceActiveObject<
if((Msg.message=WM_KEYDOWN)or(Msg.Message=WM_KEYUP))and((Msg.wParam=VK_BACK)or(Msg.wParam=VK_LEFT)or(Msg.wParam=VK_RIGHT))then
else
FOleInPlaceActiveObject.TranslateAccelerator(Msg);
procedureTForm1.FormCreate(Sender:
Application.OnMessage:
=MsgHandle;
procedureTForm1.FormDestroy(Sender:
=nil;
11.如何在WebBrowser中调用当前页面中的javascript函数SayHello()
WebBrowser1.OleObject.
Document.parentWindow.execScript('
SayHello()'
javascript'
//or
(WebBrowser1.DocumentasIHTMLDocument2
).parentWindow.execScript('
)
webrowser1.document.script.SayHello();
1.获取网页中变量的值
例如:
htm中<
script>
varcurrIDS=123<
/script>
程序中可以这样调用id:
=Form1.WebBrowser1.OleObject.Document.script.currIDS
备注:
变量可以是javascript定义的,也可以是vbscript定义的,如果Webbrowser1中找不到该变量,调用会触发一个异常事件,即变量currIDS不存在。
2.执行网页中的函数
tmpf:
='
currID=getNextID(currID)'
+#13#10;
Form1.WebBrowser1.OleObject.Document.parentWindow.execScript(tmpf,'
JavaScript'
调用函数的方法就是execScript接口,同样,如果函数不存在,或者运行错误也会触发脚本错误异常
3.设置网页背景
背景图片WebBrowser1.OleObject.Document.body.background
:
;
背景颜色WebBrowser1.OleObject.Document.body.bgcolor
#eeeeee'
4.调用网页中已知对象
src:
=WebBrowser1.OleObject.Document.getElementByID('
img1'
).src
该方法其实就是javascript中的getElementByID
5.获取页面中所有的frame
使用DHTML。
frames:
=wb.OleObject.document.frames;
fori:
=0toframes.lengthdo
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:
begin
SetNoteStr:
='
bodybgcolor=222222align=center>
br>
palign=center>
fontsize=+2color=#FFFFFF>
点点博客<
/font>
/p>
=SetNoteStr+'
点击左边按钮可查看对应图片<
=TStringStream.Create(SetNoteStr);
WebBrowser1.Navigate('
about:
blank'
try
StrStream.Position:
=0;
(WebBrowser1.DocumentasIPersistStreamInit).Load(TStreamadapter.Create(StrStream));
finally
StrStream.Free;
end;
8.前进,后退,刷新
self.WebBrowser1.GoBack
self.WebBrowser1.GoForward
self.WebBrowser1.Refresh
9.捕捉NewWindow2事件,即新开窗口事件
procedureTForm1.WebBrowser1NewWindow2(Sender:
varCancel:
NewWindow:
TForm2;
//exit;
=TForm2.Create(nil);
NewWindow.Show;
ppDisp:
=NewWindow.Webbrowser1.DefaultDispatch;
值得一题的是该方法不能获得新开窗口的URL,退一步的方法只能是等到在新的Webbrowser中触发BeforeNavigate2事件判断了
10.网页中存在iframe时判断页面是否下载结束
procedureTForm1.WebBrowser1DocumentComplete(Sender:
constpDisp:
ifWebBrowser1.Application=pDispthenshowmessage('
页面已全部下载完毕'
)
每个iframe下载完毕都会触发DocumentComplete事件,所以一个页面在真正下载完毕前可能被触发多次
Delphi中使用WebBrowser控件中载入的页面的script
使用如下语句即可:
webrowser1.OleObject.document.script.doSomething(parameter);
在网上看到还可以如下使用,不过我没用过。
usesMSHTML;
//useIHTMLDocument2
procedureTForm1.BitBtn1Click(Sender:
WebBrowser1.OleObject.
//or
(WebBrowser1.DocumentasIHTMLDocument2).parentWindow.execScript('
用WebBrowser实现HTML界面的应用
HTML的界面有以下特点:
图文混排,格式灵活,可以包含Flash、声音和视频等,实现图文声像的多媒体界面,而且易于建立和维护。
另外,HTML的显示环境一般机器上都具备,通常不需要安装额外的软件。
当然,HTML界面也有它欠缺的方面,即:
界面控制能力有限,代码调试不便----虽然DHTML提供了比较强的编程特性,但是比起Delphi的传统的开发语言和工具来,对界面的控制能力,尤其是和数据交互时的控制能力还是稍逊一筹。
了解了这些特点,我们就可以在实际应用开发中,适时地选择HTML技术。
下面举个例子:
一种仪器的管理程序,需要显示该仪器的操作方法文档,包含文字和图片,并要求可以隐藏或显示文档,并能安要求打印。
这个应用中,图文显示、隐藏/显示部分文档、图文打印等需求,都是HTML界面所擅长的,用传统的表单控件实现几乎无法想像。
用什么实现HTML的界面
用Delphi实现HTML界面的应用主要有两种选择:
WebBrowserControl或MSHTML。
为了弄清两者如何选择,我们先来看看InternetExporer4.0及其后续版本的体系结构:
IE浏览器是建立在SHDOCVW.DLL组件之上的,而SHDOCVW.DLL则建立在MSHTML.DLL组件之上,底层则包括脚本引擎等。
SHDOCVW.DLL提供了对活动文档(ActiveDocument)的支持----例如Word等文档可以在IE中显示,并提供导航、in-place*连接、收藏夹、浏览历史和分级内容选择(PICS:
PlatformforInternetContentSelection)等功能。
SHDOCVW.DLL组件虽然也提供了很多接口可以单独使用,但是通常所指的SHDOCVW.DLL就是WebBrowserControl。
MSHTML.DLL是实行HTML解析和表现的组件。
它通过DHTML对象模型提供对HTML文档的访问。
它实现了活动文档服务器接口,可以通过COM接口调用。
不难看出,WebBrowser在比较高的层次上,提供了更为丰富的功能,因此一般通常编程都采用WebBrower控件。
MSHTML只有在需要解析HTML这样的特殊应用中,才推荐使用。
微软的MSDN网站上提供了一个使用MSHTML的例子:
WalkAllSampleSourcePage。
(*注:
In-place链接,是指点击HTML连接时,在相同的WebBrowser实例中显示连接的HTML文档。
如果仅使用MSHTML.DLL,点击链接将导致在新的浏览器实例中打开链接的文档。
如何访问HTML页面的内容
首先,在Delphi7.0组件面板的Internet页上,把TWebBrowser组件放到表单上,并手动把MSHTML加入到Uses列表中。
通过执行以下语句装载HTML文档到WebBrowser中进行显示:
WebBrowser1.Navigate(GetCurrentDir+'
\index.htm'
隐藏/显示HTML元件代码示例:
Doc:
IHTMLDocument2;
element:
IHTMLElement;
=IHTMLDocument2(WebBrowser1.Document);
ifnil<
Docthen
element:
=Doc.all.item('
T1'
0)asIHTMLElement;
elementthenbegin
if'
=element.style.displaythen
element.style.display:
none'
else
elemen