delphi - 如何使用动态创建的按钮在 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 事件发送变量。我不确定一种方法可以做我想做的事,因此将不胜感激。
解决方案
目前我有这些按钮的数组,并试图将 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;
推荐阅读
- json - Mongo 嵌入式文档不是 JSON 可序列化的 - Python
- function - 我如何能够从有状态小部件传递 setState 在无状态小部件中
- python - 在简单的 2D Python 游戏中更新角色的位置
- laravel - 在 twilio laravel 中按区号阻止呼叫
- php - 运行异步while函数或多线程
- ios - 使用蓝牙时如何设置超时间隔
- python - 使用大量“if”语句的替代方法
- java-8 - 带有 RadixSort、BucketSort、Java 8 的比较器接口
- javascript - 如何编写一个可以接受一个或多个参数并返回加法的函数
- java - 错误 - 在 Jparepository 中不起作用的日期之间