delphi webbrowser(delphi控件介绍)
一、如何用Delphi在TWebBrowser中调用JavaScript
在TWebBrowser中调用脚本的办法是调用Html文档相关的对象窗口中的execScript方法。至于什么是和Html Document相关的对象窗口,后面的代码中用到的IHTMLWindow2就是。execScript函数定义如下:
function execScript(const code: WideString; const language: WideString): OleVariant;
参数code是一个脚本函数的完整调用形式的字符串,例如有一个JavaScript函数定义为:
function foo(param1),则 code="foo(param1)"。
参数language表示脚本的类型,例如 language="JavaScript"
首先,获取浏览器组件的文档对象;然后通过该文档对象的ParentWindow属性来获取窗口对象。最后通过该窗口对象来调用execScript即可。下面就给出一个简单的实现示例。
实现示例
uses
MSHTML;
procedure TForm1.CallFoo(S: string; I: Integer);
{ Calls JavaScript Foo() function}
var
Doc: IHTMLDocument2;// current HTML document
HTMLWindow: IHTMLWindow2;// parent window of current HTML document
JSFn: string;// stores JavaScipt function call
begin
// Get reference to current document
Doc:= WebBrowser1.Document as IHTMLDocument2;
if not Assigned(Doc) then
Exit;
// Get parent window of current document
HTMLWindow:= Doc.parentWindow;
if not Assigned(HTMLWindow) then
Exit;
// Run JavaScript
try
JSFn:= Format('Foo(''%s'',%d)', [S, I]);// build function call
HTMLWindow.execScript(JSFn,'JavaScript');// execute function
except
// handle exception in case JavaScript fails to run
end;
end;
实例演示
整个实例包括两部分:
网页文件test.html:文件内有一个JavaScript函数SetFont。该函数通过下拉框来选择字体,然后点击”set font“按钮来改变页面字体。
Delphi端程序:通过TWebbrowser来显示页面,并演示如何调用页面内的Javascript函数。
Test.html:
<html>
<head>
<title> Demo for call Javascript from Delphi
</title>
<script type="text/javascript">
<!--
function SetFont(fontname)
{
document.body.style.fontFamily= fontname;
}
-->
</script>
</head>
<body>
demo of calling Javascript from Delphi
<form>
<select size=1 name="selfont">
<option value="Verdana" selected>Verdana</option>
<option value="Arial">Arial</option>
<option value="Courier New">Courier New</option>
<option value="Tahoma">Tahoma</option>
</select>
<input type="button" value="set font" name="btn1"
onclick="SetFont(selfont.value)">
</form>
</body>
</html>
Delphi控制Javascript
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, OleCtrls, SHDocVw, StdCtrls, Mshtml;
type
TForm1= class(TForm)
btnCallJS: TButton;
cmbFonts: TComboBox;
WebNav: TWebBrowser;
procedure FormShow(Sender: TObject);
procedure WebNavDocumentComplete(Sender: TObject;
const pDisp: IDispatch; var URL: OleVariant);
procedure btnCallJSClick(Sender: TObject);
private
{ Private declarations}
public
{ Public declarations}
end;
var
Form1: TForm1;
implementation
{$R*.dfm}
procedure TForm1.FormShow(Sender: TObject);
begin
// Disable button
btnCallJS.Enabled:= false;
// Load the Html page
WebNav.Navigate(ExtractFilepath(Application.ExeName)
+'test.html');
end;
procedure TForm1.WebNavDocumentComplete(Sender: TObject;
const pDisp: IDispatch; var URL: OleVariant);
begin
// When complete loading Html page, enable button
btnCallJS.Enabled:= true;
end;
// Call the Javascript in Html page
procedure TForm1.btnCallJSClick(Sender: TObject);
var
// current Html document
Doc: IHtmlDocument2;
// parent window of current Html document
HtmlWnd: IHtmlWindow2;
// Javascript function name including arguments
JsFnc: string;
begin
// Get reference to current document
Doc:= WebNav.Document as IHtmlDocument2;
if not assigned(Doc) then
exit;
// Get parent window of current Html document
HtmlWnd:= Doc.parentWindow;
if not assigned(HtmlWnd) then
exit;
// Run Javascript
try
JsFnc:='SetFont('''+ trim(cmbFonts.Text)+''')';
HtmlWnd.execScript(JsFnc,'JavaScript');
except
Showmessage('Call JavaScript failed!');
end;
end;
end.
二、delphi 怎么判断webbrowser打开网页成功
在同一个WebBrowser里显示,可以这样:
再放一个小的WebBrowser2,设置它在WebBrowser1下面(设置Visible为False好象无效),
//在WebBrowser1的OnNewWindow2事件中:
procedure TForm1.WebBrowser1NewWindow2(Sender: TObject;
var ppDisp: IDispatch; var Cancel: WordBool);
begin
ppDisp:= WebBrowser2.Application;//新的窗口先指向WebBrowser2
end;
//在WebBrowser2的OnBeforeNavigate2事件中:
procedure TForm1.WebBrowser2BeforeNavigate2(Sender: TObject;
const pDisp: IDispatch; var URL, Flags, TargetFrameName, PostData,
Headers: OleVariant; var Cancel: WordBool);
begin
WebBrowser1.Navigate(string(URL));//再指回WebBrowser1
Cancel:= True;
end;
可以这样,窗体中放置两个PANEL,其中PANEL1中放WebBrowser1,PANEL2中放WebBrowser2,PANEL1和PANEL2、WebBrowser1和WebBrowser2的LEFT,TOP等所有属性设为一样。PANEL2的VISIBLE设为FALSE。然后添加代码如下即可:
procedure TForm1.WebBrowser1NewWindow2(Sender: TObject;
var ppDisp: IDispatch; var Cancel: WordBool);
begin
ppDisp:=WebBrowser2.Application;
panel1.Visible:=false;
panel2.Visible:=true;
end;
procedure TForm1.WebBrowser2NewWindow2(Sender: TObject;
var ppDisp: IDispatch; var Cancel: WordBool);
begin
ppDisp:=WebBrowser1.Application;
panel2.Visible:=false;
panel1.Visible:=true
我只回答第一个问题,看你给多少分:
1 NewWindow2的在接口中定义的原形:
procedure NewWindow2(Sender: TObject; var ppDisp: IDispatch;
var Cancel: WordBool);
2通过传递一个WebBrowser的控制借口给ppDisp可以让新网页在指定的Wb中浏览
ppDisp:=WebBrowser1.Browser.ControlInterface;
3在刚才传递的WebBrowser的OnBeforeNavigate2事件中就可以获得将要打开的
URL了!
function SaveToStream(AStream: TStream): HRESULT;
var
IpStream: IPersistStreamInit;
begin
with browser1 do
begin
while ReadyState<> READYSTATE_COMPLETE do
Forms.Application.ProcessMessages;
if Assigned(Document) then
begin
IpStream:= Document as IPersistStreamInit;
Result:= IpStream.save(TStreamAdapter.Create(AStream), TRUE);
end else Result:= S_FALSE;
end;
end;
function Loadfromstream(AStream:TStream):hresult;
begin
with browser1 do
begin
if not Assigned(Document) then
begin
navigate2('about:blank',0,0,0,0);
while readystate<> READYSTATE_COMPLETE do Forms.Application.ProcessMessages;
end;
AStream.seek(0, 0);
Result:=(Document as IPersistStreamInit).Load(TStreamadapter.Create(AStream));
end;
end;
三、delphi webbrowser版本怎么修改
WebBrowser控件默认使用的版本是 IE7兼容模式,无论本机当前 windows系统安装的是 IE9或是 IE10,都会使用 IE 7版本。
如果想要使 WebBrowser使用其它版本,可以通过设置注册表中的相关条目来完成:
HKEY_LOCAL_MACHINE(orHKEY_CURRENT_USER)
SOFTWARE
Microsoft
InternetExplorer
Main
FeatureControl
FEATURE_BROWSER_EMULATION
编译生成的文件.exe=(DWORD)指定的版本号
如果是 64位系统,注册表条目如下:
HKEY_LOCAL_MACHINE\SOFTWARE\WOW6432Node\Microsoft\Internet Explorer\Main\FeatureControl\FEATURE_BROWSER_EMULATION
其中指定的版本号为:
11001(0x2EDF)InternetExplorer11.
11000(0x2AF8):InternetExplorer11.
10000(0x2710):InternetExplorer10.
10001(0x2AF7):InternetExplorer10.
9999(0x270F):InternetExplorer9.
9000(0x2328):InternetExplorer9.
8888(0x22B8):WebpagesaredisplayedinIE8Standardsmode
实例截图: