我在TMS Web Core中有一个简单的项目.

我想在运行时在我的TWebHTMLDiv组件内的循环中创建一系列按钮,并根据每个按钮的循环索引调用德尔菲myFunc函数.

德尔菲端的myFunc函数接受输入并发送带有按钮索引的ShowMessage.

我的问题是我不知道如何从模板端调用带有参数的函数

我的单位代码:

unit Unit1;

interface

uses
  System.SysUtils, System.Classes, JS, Web, WEBLib.Graphics, WEBLib.Controls,
  WEBLib.Forms, WEBLib.Dialogs, Vcl.Controls, WEBLib.WebCtrls;

type
  TForm1 = class(TWebForm)
    WebHTMLDiv1: TWebHTMLDiv;
    procedure WebFormShow(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
    procedure myFunc(ACode: string);
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}
{ TForm1 }

procedure TForm1.myFunc(ACode: string);
begin
  ShowMessage(ACode);
end;

procedure TForm1.WebFormShow(Sender: TObject);
var
  i: integer;
begin
  WebHTMLDiv1.HTML.Text := '';
  for i := 1 to 5 do
    WebHTMLDiv1.HTML.Text := WebHTMLDiv1.HTML.Text +
      '<button type="button" onclick="myFunc(' + i.ToString +
      ')" class="btn btn-primary btn-sm">BtnNum' + i.ToString + '</button>';
end;

end.

我的HTML模板代码:

<html>
  <head>
    <meta http-equiv="Content-type" content="text/html; charset=utf-8" />
    <title>TMS Web Project</title>
    <style>
    </style>
  </head>
  <body>
  <div id = "htmlDiv">
  </div>
  </body>
</html>

推荐答案

Method 1

在您的示例中,要从JavaScript代码调用delphimyFunc过程,您只需在JavaScript中这样调用该过程:

pas.Unit1.TForm1.myFunc('1998');

这会起作用.因此,您的完整WebFormShow代码将是:

procedure TForm1.WebFormShow(Sender: TObject);
var
  i: integer;
begin
  WebHTMLDiv1.HTML.Text := '';
  for i := 1 to 5 do
    WebHTMLDiv1.HTML.Text := WebHTMLDiv1.HTML.Text +
      '<button type="button" onclick="pas.Unit1.TForm1.myFunc(' + i.ToString +
      ')" class="btn btn-primary btn-sm">BtnNum' + i.ToString + '</button>';
end;

Method 2

作为替代方法.您还可以 for each 按钮分配click eventListener.

我修改了<button>以包含data_code属性,并添加了MyBtnClick类.然后我还修改了您的myFunc函数以包含Sender: TJSEvent参数.

这是完整代码:

unit Unit1;

interface

uses
  System.SysUtils, System.Classes, JS, Web, WEBLib.Graphics, WEBLib.Controls,
  WEBLib.Forms, WEBLib.Dialogs, Vcl.Controls, WEBLib.WebCtrls, Vcl.StdCtrls,
  WEBLib.StdCtrls;

type
  TForm1 = class(TWebForm)
    WebHTMLDiv1: TWebHTMLDiv;
    procedure WebFormShow(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
    procedure myFunc(Sender: TJSEvent);
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.myFunc(Sender: TJSEvent);
var
  ACode: String;
begin
  ACode := Sender.targetElement.getAttribute('data_code');
  ShowMessage(ACode);
end;

procedure TForm1.WebFormShow(Sender: TObject);
var
  i: integer;
  MyBtnClick: TJSHTMLCollection;
begin
  WebHTMLDiv1.HTML.Text := '';
  for i := 1 to 5 do
    WebHTMLDiv1.HTML.Text := WebHTMLDiv1.HTML.Text +
      '<button type="button" data_code="' + i.ToString +
      '" class="btn btn-primary btn-sm MyBtnClick"' +
      '>BtnNum' + i.ToString + '</button>';


  MyBtnClick := document.getElementsByClassName('MyBtnClick');
  for I := 0 to MyBtnClick.length-1 do
  begin
    MyBtnClick.Items[I].addEventListener('click', @myFunc);
  end;
end;

end.

Javascript相关问答推荐

在卡信息之间切换

添加/删除时React图像上传重新渲染上传的图像

在JS中获取名字和姓氏的首字母

如何将拖放功能添加到我已自定义为图像的文件输入HTML标签中?

禁用从vue.js 2中的循环创建的表的最后td的按钮

使用AJX发送表单后,$_Post看起来为空

如何将连续的十六进制字符串拆分为以空间分隔的十六进制块,每个十六进制块包含32个二元组?

单击子元素时关闭父元素(JS)

jQuery提交按钮重新加载页面,即使在WordPress中使用preventDefault()

空的结果抓取网站与Fetch和Cheerio

连接到游戏的玩家不会在浏览器在线游戏中呈现

在使用位板时,如何在Java脚本中判断Connect 4板中中柱的对称性?

未加载css colored颜色 ,无法将div设置为可见和不可见

如何在Bootstrap中减少网格系统中单个div的宽度

在JS/TS中将复杂图形转换为数组或其他数据 struct

Node.js错误: node 不可单击或不是元素

如果NetSuite中为空,则限制筛选

我无法在Api Reaction本机上发出GET请求

rxjs在每次迭代后更新数组的可观察值

输入数据覆盖JSON文件