You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

在TMS WEB Core中通过HTML模板调用带参数的Delphi过程的实现问题

在TMS WEB Core中通过HTML模板调用带参数的Delphi过程的实现问题

嗨,我完全懂你现在卡在哪了——在循环里动态生成按钮,想让每个按钮点击时把自己的专属索引传给Delphi端的myFunc过程,对吧?其实核心就是要处理好JavaScript的闭包特性,同时衔接好TMS WEB Core的Delphi代码和前端事件。

先帮你补全WebFormShow的实现,这里提供两种可行的方案,你可以根据自己的习惯选:

方案一:用Delphi控件动态创建按钮(贴合VCL开发习惯)

如果你更习惯用TMS提供的可视化控件来创建按钮,完全不用写HTML,这种方式最直观:

procedure TForm1.WebFormShow(Sender: TObject);
var
  i: Integer;
  btn: TWebButton;
begin
  for i := 0 to 4 do // 示例生成5个按钮,可按需调整循环范围
  begin
    btn := TWebButton.Create(Self);
    btn.Parent := WebHTMLDiv1; // 将按钮挂载到目标Div上
    btn.Caption := '按钮 ' + IntToStr(i);
    btn.Tag := i; // 用Tag属性存储当前循环的索引
    // 绑定点击事件,取出Tag值传给myFunc
    btn.OnClick := procedure(Sender: TObject)
      begin
        myFunc(IntToStr((Sender as TWebButton).Tag));
      end;
  end;
end;

这种方式完全用Delphi代码实现,利用控件的Tag属性存索引,点击时直接读取传递,不用操心前端的闭包问题。

方案二:生成HTML按钮并绑定带参数的事件

如果你需要直接在TWebHTMLDiv里生成原生HTML按钮,要注意JavaScript闭包的坑——如果直接在循环里拼接onclick="Form1.myFunc(i)",所有按钮最后都会传递循环的最终值。正确的做法是把索引直接固化到每个按钮的事件绑定里:

procedure TForm1.WebFormShow(Sender: TObject);
var
  i: Integer;
  btnHTML: string;
begin
  WebHTMLDiv1.Element.innerHTML := ''; // 先清空Div原有内容
  for i := 0 to 4 do
  begin
    // 用JS.Format生成正确的JS调用代码,把索引作为字符串参数传入
    btnHTML := Format('<button style="margin:5px;" onclick="%s">按钮 %d</button>',
      [JS.Format('Form1.myFunc("%d")', [i]), i]);
    // 把生成的按钮HTML追加到Div中
    WebHTMLDiv1.Element.innerHTML := WebHTMLDiv1.Element.innerHTML + btnHTML;
  end;
end;

这里通过JS.Format确保生成的JavaScript代码能正确传递当前循环的索引值,每个按钮的点击事件都会携带自己对应的参数,不会串值。

另外要注意:Delphi端的myFunc必须是Public修饰的,这样TMS WEB Core才会把它暴露给前端JavaScript环境,让HTML按钮能直接调用。

测试一下这两种方案,点击每个按钮都会弹出对应的索引值,完美解决你的问题!

备注:内容来源于stack exchange,提问作者omid sistani

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.17 10:03:02