【Delphi】在Webview2中扩展javascript函数:携带参数和结果

        为了在 JavaScript 和 Delphi 之间传递参数和返回结果,您可以进一步扩展之前的 COM 对象,实现参数传递和结果返回。以下是具体的实现步骤和代码示例。

1. 扩展 COM 接口

首先,我们需要扩展 ICustomHelper 接口,使其能够接受参数并返回结果。

type
  ICustomHelper = interface(IDispatch)
    ['{8B41D0F7-36B4-4978-BDEF-69DB435E52D4}']
    procedure CloseProgram; safecall;
    function ShowMessage(const Msg: WideString): WideString; safecall;
  end;

  TCustomHelper = class(TInterfacedObject, ICustomHelper)
  public
    procedure CloseProgram; safecall;
    function ShowMessage(const Msg: WideString): WideString; safecall;
  end;

2. 实现接口方法

接着,实现 ShowMessage 方法,该方法将接受一个字符串参数,并返回一个字符串结果。

procedure TCustomHelper.CloseProgram;
begin
  Application.Terminate; // 关闭程序
end;

function TCustomHelper.ShowMessage(const Msg: WideString): WideString;
begin
  Result := 'Delphi received: ' + Msg;
  MessageDlg(Msg, mtInformation, [mbOK], 0);  // 弹出消息框显示信息
end;

3. 将对象添加到 WebView2

在表单的 FormCreate 事件中,将扩展后的 COM 对象添加到 WebView2 的脚本中。

procedure TForm1.FormCreate(Sender: TObject);
begin
  // 初始化 WebView2
  WebView21.CreateWebView2(nil);

  // 创建并注册自定义对象
  WebView21.CoreWebView2.AddHostObjectToScript('Helper', TCustomHelper.Create);
end;

4. 在 JavaScript 中调用方法并传递参数

现在可以在 JavaScript 中调用 ShowMessage 方法,并传递参数,同时接收返回值。

let result = window.Helper.ShowMessage("Hello from JavaScript!");
console.log(result); // 将打印 "Delphi received: Hello from JavaScript!"

5. 详细说明

  • ShowMessage 方法:这个方法接受一个字符串参数,并在 Delphi 中显示该消息,同时返回一个带有附加文本的字符串。
  • 参数传递和结果返回:JavaScript 调用 ShowMessage 时,可以传递一个参数给 Delphi,而 Delphi 处理后会返回结果给 JavaScript。

6. 使用 JSON 进行复杂数据传递

如果需要在 JavaScript 和 Delphi 之间传递更复杂的数据结构(例如对象或数组),可以考虑使用 JSON。以下是一个简单的例子:

Delphi 代码

uses
  System.JSON;

function TCustomHelper.ProcessData(const JsonData: WideString): WideString;
var
  JSONObject: TJSONObject;
  Response: TJSONObject;
begin
  JSONObject := TJSONObject.ParseJSONValue(JsonData) as TJSONObject;
  try
    // 处理传入的 JSON 数据
    Response := TJSONObject.Create;
    try
      Response.AddPair('status', 'success');
      Response.AddPair('received', JSONObject.GetValue('message').Value);
      Result := Response.ToString;
    finally
      Response.Free;
    end;
  finally
    JSONObject.Free;
  end;
end;

JavaScript 代码:

let data = JSON.stringify({ message: "Hello from JavaScript!" });
let response = JSON.parse(window.Helper.ProcessData(data));
console.log(response.status);  // 将打印 "success"
console.log(response.received); // 将打印 "Hello from JavaScript!"

总结

通过扩展 COM 接口,可以实现 Delphi 和 JavaScript 之间的双向数据传递。使用上述方法,您可以在 JavaScript 中调用 Delphi 方法,传递参数并接收返回结果,实现更复杂的交互。

WebView窗口从Python调用JavaScript函数,通常是通过在Python代码嵌入WebView组件,并通过该组件提供的接口与JavaScript进行交互。具体实现依赖于你使用的WebView组件和相应的Python库。以常用的Python库`webview`为例,你可以通过以下步骤实现这一功能: 1. 安装`webview`库(如果尚未安装): ```bash pip install pywebview ``` 2. 在Python创建一个简单的WebView应用,并在其嵌入JavaScript代码。 3. 使用`webview`提供的`evaluate_js`方法或者通过其他与JavaScript交互的API调用JavaScript函数。 下面是一个简单的示例代码: ```python import webview def hello_from_js(): # 这是一个在WebView运行的JavaScript函数,用于返回一个问候语 return "Hello from JavaScript!" # 创建WebView窗口 window = webview.create_window('My App', '<html><body><h1>Hello, World!</h1></body></html>') # 在显示窗口前,先加载包含JavaScript的HTML内容 webview.set_html(window, f""" <html><body> <h1>Hello, World!</h1> <button id="callJs">Call JavaScript</button> <script type="text/javascript"> document.getElementById('callJs').addEventListener('click', function() {{ window.pywebview.call('hello_from_js')(); }}) </script> </body></html> """) # 启动WebView webview.start() # 监听JavaScript调用的Python函数 def on_js_call(name): print(f"{name} function was called from JavaScript") webview.on_call(None, on_js_call) # 显示窗口 webview.show() ``` 在这个示例,我们创建了一个按钮,当点击按钮时,JavaScript会调用Python的`hello_from_js`函数
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

海纳老吴

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值