首页系统delphi webbrowser(delphi控件介绍)

delphi webbrowser(delphi控件介绍)

编程之家2024-02-10117次浏览

一、如何用Delphi在TWebBrowser中调用JavaScript

在TWebBrowser中调用脚本的办法是调用Html文档相关的对象窗口中的execScript方法。至于什么是和Html Document相关的对象窗口,后面的代码中用到的IHTMLWindow2就是。execScript函数定义如下:

delphi webbrowser(delphi控件介绍)

function execScript(const code: WideString; const language: WideString): OleVariant;

参数code是一个脚本函数的完整调用形式的字符串,例如有一个JavaScript函数定义为:

function foo(param1),则 code="foo(param1)"。

参数language表示脚本的类型,例如 language="JavaScript"

首先,获取浏览器组件的文档对象;然后通过该文档对象的ParentWindow属性来获取窗口对象。最后通过该窗口对象来调用execScript即可。下面就给出一个简单的实现示例。

delphi webbrowser(delphi控件介绍)

实现示例

uses

MSHTML;

procedure TForm1.CallFoo(S: string; I: Integer);

{ Calls JavaScript Foo() function}

delphi webbrowser(delphi控件介绍)

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

实例截图:

resultset(ResultSet详解)messagebox确定取消(messagebox确定取消按钮怎么实现)