这是在Delphi Pascal中
我动态创建了一个二维按钮阵列。我希望这样,当您单击这些按钮时,按下的按钮将消失。 (这是制作扫雷游戏)。
当前,我具有这些按钮的数组,并且正在尝试将onclick事件设置为过程,并将该按钮的x和y索引传递给过程,以使其可以隐藏正确的按钮。
这是我用来链接到过程的内容:
buttons[x,y].OnClick := buttonClicked(x,y);
x和y是由for循环组成的,以便我可以拥有一个2d数组。
这是我遇到的错误。
E2010 Incompatible types: 'TNotifyEvent' and 'procedure, untyped pointer or untyped parameter'
这是程序:
procedure TMainPage.buttonClicked(buttonx: Integer; buttony: Integer); begin buttons[buttonx,buttony].Visible:=False; end;
我假设问题是您无法通过OnClick事件发送变量。 我不确定要做什么,因此可以得到指导。
答案 0 :(得分:6)
当前,我具有这些按钮的数组,并且正在尝试将onclick事件设置为过程,并将该按钮的x和y索引传递给过程,以使其可以隐藏正确的按钮。
您将无法使用输入参数将信息直接 传递给OnClick
事件处理程序。该事件被声明为TNotifyEvent
,因此它可以接受的唯一输入参数是触发事件的对象的TObject
。
但是,该对象是被点击的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;
答案 1 :(得分:0)
正如雷米指出的那样,有一种更简单的方法可以使按钮不可见。
要在创建每个新按钮时设置OnClick事件,请使用以下命令:
buttons[x,y].OnClick := @buttonClicked;