browser 编程中 Delphi 如何返回数组给 javascript

在 Delphi 中使用免费的一个程序 TEmbeddedWB 替换常规的 TWebBrowser 组件。
创建一个自动化对象 MyExternal,以实现 IDispatch 接口。

添加一个 Hello 方法,输出类型设置为 Variant *, 其代码如下:

function TMyExternal.Hello: OleVariant;
var
  arr: OleVariant;
begin
  arr :
= VarArrayCreate([09], varVariant);

  arr[
0] := '1';
  arr[
1] := 432.3;
  arr[
2] := '你好';
  arr[
3] := '哈哈fjsd3435';
  
  result :
= arr;
end;

在主窗体中写如下代码,主要目的是关联 window.external 的扩展实现:

procedure TForm1.FormCreate(Sender: TObject);
var
  path: 
string;
begin
  myBrowser.OnGetExternal :
= BrowserGetExternal;
  Application.ProcessMessages;

  path :
= ExtractFilePath(Application.ExeName) + 'default.htm';
  myBrowser.Go(path);
end;

function TForm1.BrowserGetExternal(
out idisp: IDispatch): HRESULT;
var
  myExternal: TMyExternal;
begin
  myExternal :
= TMyExternal.Create;
  idisp :
= myExternal;
  result :
= S_OK;     
end;

在 HTML 中,记住要用 js 里的 VBArray 来取得返回数组,再转换为 js 的数组:

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN"
        "http://www.w3.org/TR/html4/strict.dtd"
>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html;charset=gb2312">
<title> New Document </title>
<meta name="Generator" content="EditPlus">
<meta name="Author" content="Neil Chen(木野狐)">
<meta name="keywords" content="">
<meta name="description" content="">
<SCRIPT LANGUAGE="JavaScript">
<!--
function test() {
    
var result = window.external.Hello();
    alert(result.length);
    
var vbarr = new VBArray(result);
    
var arr = vbarr.toArray();
    alert(arr.length);

    
for (var i = 0; i < arr.length; i++)
        txtResult.value 
+= arr[i] + '\n'; 
}

//-->
</SCRIPT>
</head>
<body>
Hello World!
<button onclick="test();">Test</BUTTON>

<textarea id="txtResult" rows="10" cols="60"></textarea>
</body>
</html>

posted on 2005-09-06 18:04  NeilChen  阅读(1226)  评论(0编辑  收藏  举报

导航