首页 > 解决方案 > 如何使用动态创建的按钮在 onclick 事件上运行过程,并通过变量传递

问题描述

这是在德尔福帕斯卡

我动态地创建了一个二维按钮数组。我希望当您单击这些按钮时,按下的按钮将消失。(这是为了制作一个扫雷风格的游戏)。

目前我有这些按钮的数组,并试图将 onclick 事件设置为一个过程,并将此按钮的 x 和 y 索引传递给该过程,以便它可以隐藏正确的按钮。

这是我用来链接到该过程的内容: buttons[x,y].OnClick := buttonClicked(x,y);

x 和 y 由 for 循环组成,以便 i 可以拥有一个二维数组。

这是我得到的错误。

E2010 Incompatible types: 'TNotifyEvent' and 'procedure, untyped pointer or untyped parameter'

这是程序:

过程 TMainPage.buttonClicked(buttonx: Integer; buttony: Integer);
开始
   按钮[buttonx,buttony].Visible:=False;
结尾;

我假设问题是您无法通过 OnClick 事件发送变量。我不确定一种方法可以做我想做的事,因此将不胜感激。

标签: delphibuttondynamic

解决方案


目前我有这些按钮的数组,并试图将 onclick 事件设置为一个过程,并将此按钮的 x 和 y 索引传递给该过程,以便它可以隐藏正确的按钮。

您将无法使用输入参数将该信息直接传递给事件处理程序。OnClick事件被声明为 a TNotifyEvent,因此它可以接受的唯一输入参数是TObject触发事件的对象的 a 。

但是,该对象本身就是被单击的对象TButton,因此您可以按原样使用它:

procedure TMainPage.buttonClicked(Sender: TObject);
begin
  TButton(Sender).Visible := False;
end;

如果出于某种原因,您实际上需要数组中的 XY 索引,则必须将这些值间接传递给事件处理程序,例如使用按钮的Tag属性:

buttons[x,y].Tag := Integer(SmallPoint(x, y));

...

procedure TMainPage.buttonClicked(Sender: TObject);
var
  pt: TSmallPoint;
begin
  pt := TSmallPoint(TButton(Sender).Tag);
  // use pt.x and pt.y as needed...
end;

不过,更安全的选择是只从中派生一个新类TButton,然后您可以添加任何您想要的内容:

type
  TMyButton = class(TButton)
  public
    ArrayX, ArrayY: Integer;
  end;

...

buttons[x,y] := TMyButton.Create(...);
buttons[x,y].ArrayX := x;
buttons[x,y].ArrayY := y;

...

procedure TMainPage.buttonClicked(Sender: TObject);
var
  Btn: TMyButton;
begin
  Btn := TMyButton(Sender);
  // use Btn.ArrayX and Btn.ArrayY as needed...
end;

推荐阅读