Перейти к содержанию
Fire Monkey от А до Я
  • 0

Перехват события OnClick в динамическом массиве TBotton


МедиаСистемы

Вопрос

Здравствуйте!

Кто может подсказать как определить какая кнопка нажата в динамическом массиве кнопок.

MyButton: array[1..100] of TButton;
...................................
...................................
for I := 0 to JsAr.Size-1 do
     begin
      Form1.MyButton[I] := TButton.Create(Form1.HorzScrollBox1);
      ................
      ................
      Form1.MyLayout[I].Align := TAlignLayout.alTop;
      Form1.MyButton[I].Align := TAlignLayout.alBottom;
      Form1.MyButton[I].Text :=  'ТЕКСТ';
      Form1.MyButton[I].Tag :=  StrToInt((JsAr.Get(I) as  TJSONObject).Get('company_ad_id').JsonValue.Value);
      Form1.MyButton[I].TintColor := TAlphaColors.Springgreen;
      Form1.MyButton[I].OnClick := ??????????????????????;
end;
.......................................................................
      

 

Ссылка на комментарий

Рекомендуемые сообщения

  • 1

Вот так можно узнать, какая кнопка нажата (в продолжение предыдущего сообщения):

 

procedure TForm1.OnMyClick(Sender: TObject);
var
  MyButton: TButton absolute Sender;
begin
  ShowMessage(MyButton.Name + '  ' + MyButton.Tag.ToString);
end;

 

Ссылка на комментарий
  • 2

тут для новичка стоит сказать, что

1) этот массив нужно бы делать полем формы

2) приведенный кусок тоже должен находиться в методе этой формы

3) тогда указание Form1. не нужно 

4) присваивание метода OnClick без скобок!  

MyButton[I].OnClick := MyOnClick;
где MyOnClick это 
procedure TForm1.MyOnClick(Sender:TObject);

5) не обязательно, но ОБЫЧНО владельцем созданного объекта назначают не его родителя а саму форму или фрейм

MyButton := TButton.Create(Self)

Изменено пользователем krapotkin
Ссылка на комментарий
  • 0

 

Для начала надо убрать этот ужас.

В 7 октября 2017 г. в 23:08, МедиаСистемы сказал:

MyButton: array[1..100] of TButton;

Как минимум заменить на

MyButton: array of TButton;

SetLength( MyButton, JsAr.Size);

Затем

Form1.MyButton.Tag := i;

И тогда в OnMyClick(Sender: TObject);

 MyButton[Sender.Tag] и будет искомой кнопкой.

Ссылка на комментарий
  • 0
27 минут назад, krapotkin сказал:

Sender это и есть искомая кнопка

Sender - это сферический конь в вакууме. Sender as TButton - это уже ближе. Но обычно логика завязывается на массив. Ни кто не делает 100 if по поводу  SameText((Sender as TButton).text, "Кнопка1"), а сопоставляется с массивом. То есть MyButton[Sender.Tag]. Что я собственно в предыдущем посте и указал.
 

Ссылка на комментарий
  • 0

нет никаких коней. Sender - это объект, для которого был вызван этот обработчик. и в первом же посте от sinuke совершенно верно написано использование приведения типа через absolute

то что ссылки на кнопки хранятся в массиве не меняет совсем ничего

Ссылка на комментарий
  • 0
3 минуты назад, krapotkin сказал:

первом же посте от sinuke совершенно верно написано использование приведения типа через absolute

Это вообще мрак, что он написал. Такая конструкция возможна только в случае маленьких программок с простой логикой. Что, например, если в качестве Sender придёт не TButton?

5 минут назад, krapotkin сказал:

то что ссылки на кнопки хранятся в массиве не меняет совсем ничего

А как выполнить действие, если пришла кнопка №34? Не поставив 34 if, и не трогая tag?
 

Ссылка на комментарий
  • 0

как вместо Sender придет не TButton, если мы сами создавали массив и присваивали этот обработчик каждой кнопке???

у него написано совершенно верно, только скобок в := MyOnClick() не должно быть

и какая бы кнопка не пришла, именно указатель на нее хранится в Sender

это магия такая

Ссылка на комментарий
  • 0

Как то так работает 

procedure TfLT.cbMouseDown(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Single);
begin
   iTagObject := ( Sender as TCornerButton ).Tag;
   sState     := Shift;
   btnChange();
end;

думаю и MyOnClick() тоже будет.

Ссылка на комментарий
  • 0
55 минут назад, krapotkin сказал:

как вместо Sender придет не TButton, если мы сами создавали массив и присваивали этот обработчик каждой кнопке???

А если ещё обработчик изменения TEdit и пр на этом коде появится?

P.S. Даже если ты всю жизнь пишешь мелкие проектики со прямолинейной логикой и без скриптов и пр. вещей, это не значит, что  использование absolute хоть как-то оправдано. Тем более рекомендовать подобное кому-то. Код будет работать в частных случаях, максимум до первой большой переделки логики - когда ты об этом хаке уже забудешь - не более.


 

Ссылка на комментарий
  • 1

Когда у бабушки будут для этого необходимые предпосылки, ее будут называть дедушкой. Речь идет о совершенно конкретной задаче. 

Если вы назначите обработчик OnClick edit'у, то это будет уже другая задача, и решать ее нужно с учетом всех имеющихся обстоятельств.

Если вы замахнулись на "абстрактность", то вам должно быть недостаточно использовать свойство Tag, которое, очевидно, является костылем, заменяющим в мелких проектиках с прямолинейной логикой использование нормальной модели данных...

 

Ссылка на комментарий

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить на вопрос...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

  • Последние посетители   0 пользователей онлайн

    • Ни одного зарегистрированного пользователя не просматривает данную страницу
×
×
  • Создать...