Как запустить процедуру для события onclick с динамически созданными кнопками и передать переменные через - PullRequest
0 голосов
/ 19 марта 2019

Это в Delphi Pascal

Я динамически создал 2d массив кнопок.Я хочу, чтобы при нажатии на эти кнопки нажатая кнопка исчезала.(Это должно сделать игру в стиле тральщика).

В настоящее время у меня есть этот массив этих кнопок, и я пытаюсь установить событие onclick для процедуры и передать индексы x и y этой кнопки впроцедура такая, что она может скрыть правильную кнопку.

Вот что я использую для ссылки на процедуру: buttons[x,y].OnClick := buttonClicked(x,y);

x и y сделаны из цикла for, в порядкечто у меня может быть двумерный массив.

Это ошибка, которую я получаю.

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.Я не уверен, что могу делать то, что хочу, поэтому руководство будет оценено.

Ответы [ 2 ]

6 голосов
/ 19 марта 2019

В настоящее время у меня есть этот массив этих кнопок, и я пытаюсь установить событие 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;
0 голосов
/ 21 марта 2019

Как указал Реми, есть более простой способ сделать кнопку невидимой.

Чтобы установить событие OnClick при создании каждой новой кнопки, используйте следующее:

buttons[x,y].OnClick := @buttonClicked;
...