| Blog信息 |
|
blog名称:注册会计师(注会)练习软件 日志总数:398 评论数量:116 留言数量:27 访问次数:3297982 建立时间:2005年6月6日 |

| |
|
[delpih编程]Webbrowser 技巧集(转贴) 软件技术
吕向阳 发表于 2009/3/12 12:12:11 |
| 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 domemo1.lines.Add(frames[i].document.body.innerHTML);---------------------------------------------------------------------------6.BorderStyle=bsNone后Webbrowser会被重新初始化,这是一个让人很意外的一个问题,Delphi在窗口控件的控制方面做得非常好,很少出现这种BUG。根据分析,出现这个现象有很多情况 改变FormStyle也会出现 ; 如果 webbrowser.parent 由panel1 改到panel2.也会导致webbrowser重新初始化。---------------------------------------------------------------------------7.直接向Webbrowser中写入html代码,不需要Navigate到实际存在的文件 varStrStream:TStringStream;SetNoteStr: string; begin SetNoteStr :='align=center>
点点博客 http://seelearn.com';SetNoteStr :=SetNoteStr+'
点击左边按钮可查看对应图片';StrStream:=TStringStream.Create(SetNoteStr);WebBrowser1.Navigate('about:blank');tryStrStream.Position:=0;( WebBrowser1.Document as IPersistStreamInit).Load(TStreamadapter.Create(StrStream));finallyStrStream.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事件,所以一个页面在真正下载完毕前可能被触发多次11. 获取网页中图片//使用DOM模型,什么都能读下来 uses MSHtml, ActiveX; var html_doc: IHTMLDocument2; doc_all: IHtmlElementCollection; vI : IHtmlImgElement; begin html_doc := WebBrowser1.Document as IHTMLDocument2; doc_all := html_doc.images; for I := 0 to doc_all.length - 1 do begin vI := doc_all.item(I, EMPTYPARAM) as IHtmlImgElement; //读取vI.src Memo1.Lines.Add(vI.src); end; end;12. 下面函数获得ISomeControl接口var html_doc: IHTMLDocument2; doc_all: IHtmlElementCollection; vI : IHtmlElement; vD : IDispatch; begin html_doc := WebBrowser1.Document as IHTMLDocument2; doc_all := html_doc.all; for I := 0 to doc_all.length - 1 do begin vI := doc_all.item(I, EMPTYPARAM) as IHtmlElement; if vI.tagName='OBJECT' then begin //读取Classid Memo1.Lines.Add((vI as IHtmlObjectElement).classid); //读取包容的对象接口 vD := (vI as IHtmlObjectElement).object_; ... end; end; end;——————————————————————————————————————————Twebbrowser里如何保存里面的网页内容?WebBrowser1.ExecWB(OLECMDID_SAVEAS,OLECMDEXECOPT_DODEFAULT, EmptyParam,EmptyParam);---------------------------------------------------------------------------直接从TWebBrowser得到网页源码及Html 下面先介绍一种极其简单的得到TWebBrowser正在访问的网页源码的方法。一般方法是利用TWebBrowser控件中的Document对象提供的IPersistStreamInit接口来实现,具体就是:先检查WebBrowser.Document对象是否有效,无效则退出;然后取得IPersistStreamInit接口,接着取得HTML源码的大小,分配全局堆内存块,建立流,再将HTML文本写到流中。程序虽然不算复杂,但是有更简单的方法,所以实现代码不再给出。其实基本上所有IE的功能TWebBrowser都应该有较为简单的方法来实现,获取网页源码也是一样。下面的代码将网页源码显示在Memo1中。 Memo1.Lines.Add(IHtmlDocument2(WebBrowser1.Document).Body.OuterHtml); 同时,在用TWebBrowser浏览HTML文件的时候要将其保存为文本文件就很简单了,不需要任何的语法解析工具,因为TWebBrowser也完成了,如下: Memo1.Lines.Add(IHtmlDocument2(WebBrowser1.Document).Body.OuterText);---------------------------------------------------------------------------提取网页中所有链接 这个方法来自大富翁论坛hopfield朋友的对一个问题的回答,我本想自己试验,但总是没成功。 var doc:IHTMLDocument2; all:IHTMLElementCollection; len,i:integer; item:OleVariant; begin doc:=WebBrowser1 .Document as IHTMLDocument2; all:=doc.Get_links; //doc.Links亦可 len:=all.length; for i:=0 to len-1 do begin item:=all.item(i,varempty); //EmpryParam亦可 memo1.lines.add(item.href); end; end;---------------------------------------------------------------------------在WebBrowser加载html页面完成后,在页面顶端插入HTML代码, 下面两种方式斗可以. {1. ----------------------------------------------------------------} procedure TForm1.Button1Click(Sender: TObject); var Range: IHTMLTxtRange; begin Range := ((WebBrowser1.Document as IHTMLDocument2).body as IHTMLBodyElement).createTextRange; Range.collapse(False); Range.pasteHTML(’Hello!’); end; {2. ----------------------------------------------------------------} procedure TForm1.WebBrowser1DocumentComplete(Sender: TObject; const pDisp: IDispatch; var URL: OleVariant); var WebDoc: HTMLDocument; WebBody: HTMLBody; begin WebDoc := WebBrowser1.Document as HTMLDocument; WebBody := WebDoc.body as HTMLBody; WebBody.insertAdjacentHTML(’BeforeEnd’, ’
Hello World!’); end; ---------------------------------------------------------------------------如何将页面中超链接新开的页面窗口包到指定的VCL窗口中. procedure TForm1.webNewWindow2(Sender: TObject; var ppDisp: IDispatch; var Cancel: WordBool); var form : TForm1; begin form := TForm1.Create(nil); ppDisp := form.web.DefaultDispatch; form.Show; end; ---------------------------------------------------------------------------打开某个页面: web.Navigate(ExtractFilePath(Application.ExeName) + ’Template/login.html’); |
|
|