首页 技术 正文
技术 2022年11月11日
0 收藏 418 点赞 3,324 浏览 4481 个字

ScriptGate是一个实现TWebBrowser上的JavaScript和Delphi代码相互调用的库,具体在这里:https://bitbucket.org/freeonterminate/scriptgate

用ScriptGate,我们可以轻松实现JavaScript在Delphi上的使用了,目前支持最新的Delphi tokyo 10.2.3版,注意,属于FMX类型的控件,作者说支持Windows,MacOS,Android及iOS.

我该怎么办?


例如,您可以从Delphi调用以下JavaScript方法。

<head>
<script type = “text / javascript” >
function helloJS ()
{
alert (“Hello,JavaScript!” );
}
</ script>
</ head>
procedure TForm1.Button1Click(Sender: TObject);
begin
FScriptGate.CallScript('helloJS()');
end;

看清了吧,在Delphi中调用JavaScript的helloJS。

反之,再看看从JavaScript调用Delphi方法:

procedure TForm1.HelloDelphi()
begin
ShowMessage('Hello, Delphi!');
end;
<body>
<a href="delphi:HelloDelphi()" rel="external nofollow" >Call Delphi</a>
</body>

注意这里的“delphi:”字符串,是TScriptGate构造函数指定的方案,不明白,那继续往下看。

尝试使用ScriptGate


准备工作


首先,从BitBucket下载代码。

接下来,在新建中的“多设备应用程序”中选择“空应用程序”。
*当然可以将其合并到现有项目中,但仅限于FireMonkey应用项目。
将下载并解压的代码目录添加到搜索路径。

如果Android包含在开发目标中,请将SGWebClient.jar添加到Android的库中。

至此,准备工作完成。

建立TScriptGate


这里我们将ScriptGate与WebBrowser1,TForm1结合使用。

unit Unit1;interfaceuses
{...}
SG.ScriptGate; //手工引用此单元type
TForm1 = class(TForm)
WebBrowser1: TWebBrowser;
Layout1: TLayout;
Button1: TButton;
procedure FormCreate(Sender: TObject);
procedure Button1Click(Sender: TObject);
private var
FScriptGate: TScriptGate; // 增加一个FScriptGate对象
public
procedure HelloDelphi; // 增加一个准备在JS中调用的Delphi方法
end;

利用Form1的OnCreate事件,先建一个TScriptGate的实例对象FScriptGate

implementationprocedure TForm1.FormCreate(Sender: TObject);
begin
FScriptGate := TScriptGate.Create(Self, WebBrowser1, 'delphi');
end;

TScriptGate.Create原型:

constructor Create(
const iReceiver: TObject;
const iWebBrowser: TWebBrowser;
const iScheme: String); reintroduce;
  • iReceiver

iReceiver是一个从JavaScript接收响应的实例。
这里TForm1被指定,但它可以是类的任何实例。
这里指定的实例的方法可以被JavaScript调用。

如:

type
TReceiver = class
public
procedure Foo;
procedure Bar(const msg: String);
end;

如果您指定名为TReceiver 的类的实例,则可以从JavaScript调用Bar方法。
这里需要注意的是,暴露给JavaScript的方法的访问级别必须是Public的或更高级别的。
它使用RTTI进行方法查找。

  • iWebBrowser

指定TScriptGate所关联的TWebBrowser的一个实例。
您可以调用指定WebBrowser加载的JavaScript方法。

  • IScheme

调用第一个示例中附加的iScheme ScriptGate方法“delphi:”的参数。
这与指定本地文件时使用JavaScript或“file:”时指定的“JavaScript:”具有相同的含义。
无论你在这里指定什么,你还必须在JavaScript端指定相同的字符串。
请注意,传递给参数的字符串不需要冒号“:”。

然后编写一个调用JavaScript的方法和一个从JavaScript调用的方法。

//在JavaScript中调用helloJS()。
//你也可以使用匿名函数检索返回值。
procedure TForm1.Button1Click(Sender: TObject);
begin
FScriptGate.CallScript(
'helloJS()',
procedure(const iResult: String)
begin
ShowMessage(iResult);
end
);
end;
//允许JavaScript调用的方法,JavaScript中的方法被称为HelloDelphi。
procedure TForm1.HelloDelphi;
begin
ShowMessage('Hello, Delphi!');
end;

加载到WebBrowser1中的HTML如下所示。

<html>
<header>
<script type="text/JavaScript">
function helloJS() { alert("Hello, JavaScript!"); return "Hello !!"; }
</script>
</head> <body>
<br><br>
<a href="delphi:HelloDelphi()" rel="external nofollow" >Call Delphi procedure</a>
<body>
</html>;

下面是作者写的完整的例子,演示了Delphi与JavaScript间如何互相调用以及在调用时,如何传递参数。

unit Unit1;interfaceuses
System.SysUtils, System.Types, System.UITypes, System.Classes, System.Variants,
FMX.Types, FMX.Controls, FMX.Forms, FMX.Graphics, FMX.Dialogs,
FMX.Controls.Presentation, FMX.StdCtrls, FMX.Layouts, FMX.WebBrowser,
SG.ScriptGate;type
TForm1 = class(TForm)
WebBrowser1: TWebBrowser;
Layout1: TLayout;
Button1: TButton;
Layout2: TLayout;
Button2: TButton;
procedure FormCreate(Sender: TObject);
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
private var
FScriptGate: TScriptGate;
public
procedure HelloDelphi(const iStr: String);
procedure Add(const Msg: String; const A, B: Integer);
end;var
Form1: TForm1;implementation{$R *.fmx}const
SampleHTML =
'<html>' +
'<header>' +
'<script type="text/JavaScript">' +
'function helloJS(msg, msg2) { alert(msg + msg2); return "Hello Delphi ! I am JavaScript !"; }' + // Call from Delphi
'</script>' +
'</head>' +
'<body>' +
'<br><br>' + // Call Delphi Method
'<a href="YourOrgScheme:HelloDelphi(''call by JS'')" rel="external nofollow" >Call Delphi noparam procedure</a>' +
'<br><br>' +
'<a href="YourOrgScheme:Add(''Calc: 30 + 12 = '', 30, 12)" rel="external nofollow" >Call Delphi procedure</a>' +
'<body>' +
'</html>';procedure TForm1.FormCreate(Sender: TObject);
begin
WebBrowser1.LoadFromStrings(SampleHTML, '/'); // The method of the object specified by the first argument is
// called from JavaScript.
FScriptGate := TScriptGate.Create(Self, WebBrowser1, 'YourOrgScheme');
end;procedure TForm1.Button1Click(Sender: TObject);
begin
FScriptGate.CallScript(
'helloJS("Hello JS ! ", "I am Delphi !")',
procedure(const iResult: String)
begin
ShowMessage(iResult);
end
);
end;procedure TForm1.Button2Click(Sender: TObject);
begin
FScriptGate.Eval(
'document.getElementsByTagName("html")[0].outerHTML',
procedure(const iResult: String)
begin
ShowMessage(iResult);
end
);
end;procedure TForm1.Add(const Msg: String; const A, B: Integer);
begin
ShowMessage(Msg + (A + B).ToString);
end;procedure TForm1.HelloDelphi(const iStr: String);
begin
ShowMessage('Hello ! ' + iStr);
end;end.
相关推荐
python开发_常用的python模块及安装方法
adodb:我们领导推荐的数据库连接组件bsddb3:BerkeleyDB的连接组件Cheetah-1.0:我比较喜欢这个版本的cheeta…
日期:2022-11-24 点赞:878 阅读:9,496
Educational Codeforces Round 11 C. Hard Process 二分
C. Hard Process题目连接:http://www.codeforces.com/contest/660/problem/CDes…
日期:2022-11-24 点赞:807 阅读:5,909
下载Ubuntn 17.04 内核源代码
zengkefu@server1:/usr/src$ uname -aLinux server1 4.10.0-19-generic #21…
日期:2022-11-24 点赞:569 阅读:6,743
可用Active Desktop Calendar V7.86 注册码序列号
可用Active Desktop Calendar V7.86 注册码序列号Name: www.greendown.cn Code: &nb…
日期:2022-11-24 点赞:733 阅读:6,496
Android调用系统相机、自定义相机、处理大图片
Android调用系统相机和自定义相机实例本博文主要是介绍了android上使用相机进行拍照并显示的两种方式,并且由于涉及到要把拍到的照片显…
日期:2022-11-24 点赞:512 阅读:8,134
Struts的使用
一、Struts2的获取  Struts的官方网站为:http://struts.apache.org/  下载完Struts2的jar包,…
日期:2022-11-24 点赞:671 阅读:5,298