МедиаСистемы Опубликовано 7 октября, 2017 Поделиться Опубликовано 7 октября, 2017 Здравствуйте! Кто может подсказать как определить какая кнопка нажата в динамическом массиве кнопок. 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 #WAMACO Опубликовано 7 октября, 2017 Поделиться Опубликовано 7 октября, 2017 Form1.MyButton[I].OnClick := OnMyClick(ссылка на объект TMyButton); далее в OnMyClick узнавай кнопку МедиаСистемы 1 Цитата Ссылка на комментарий
1 sinuke Опубликовано 8 октября, 2017 Поделиться Опубликовано 8 октября, 2017 Вот так можно узнать, какая кнопка нажата (в продолжение предыдущего сообщения): procedure TForm1.OnMyClick(Sender: TObject); var MyButton: TButton absolute Sender; begin ShowMessage(MyButton.Name + ' ' + MyButton.Tag.ToString); end; МедиаСистемы 1 Цитата Ссылка на комментарий
2 krapotkin Опубликовано 8 октября, 2017 Поделиться Опубликовано 8 октября, 2017 (изменено) тут для новичка стоит сказать, что 1) этот массив нужно бы делать полем формы 2) приведенный кусок тоже должен находиться в методе этой формы 3) тогда указание Form1. не нужно 4) присваивание метода OnClick без скобок! MyButton[I].OnClick := MyOnClick; где MyOnClick это procedure TForm1.MyOnClick(Sender:TObject); 5) не обязательно, но ОБЫЧНО владельцем созданного объекта назначают не его родителя а саму форму или фрейм MyButton := TButton.Create(Self) Изменено 8 октября, 2017 пользователем krapotkin Равиль Зарипов (ZuBy) и МедиаСистемы 2 Цитата Ссылка на комментарий
0 Akad Опубликовано 9 октября, 2017 Поделиться Опубликовано 9 октября, 2017 Для начала надо убрать этот ужас. В 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 krapotkin Опубликовано 9 октября, 2017 Поделиться Опубликовано 9 октября, 2017 2 минуты назад, Akad сказал: MyButton[Sender.Tag] и будет искомой кнопкой. издеваетесь???? Sender это и есть искомая кнопка Цитата Ссылка на комментарий
0 Akad Опубликовано 9 октября, 2017 Поделиться Опубликовано 9 октября, 2017 27 минут назад, krapotkin сказал: Sender это и есть искомая кнопка Sender - это сферический конь в вакууме. Sender as TButton - это уже ближе. Но обычно логика завязывается на массив. Ни кто не делает 100 if по поводу SameText((Sender as TButton).text, "Кнопка1"), а сопоставляется с массивом. То есть MyButton[Sender.Tag]. Что я собственно в предыдущем посте и указал. Цитата Ссылка на комментарий
0 krapotkin Опубликовано 9 октября, 2017 Поделиться Опубликовано 9 октября, 2017 нет никаких коней. Sender - это объект, для которого был вызван этот обработчик. и в первом же посте от sinuke совершенно верно написано использование приведения типа через absolute то что ссылки на кнопки хранятся в массиве не меняет совсем ничего Цитата Ссылка на комментарий
0 Akad Опубликовано 9 октября, 2017 Поделиться Опубликовано 9 октября, 2017 3 минуты назад, krapotkin сказал: первом же посте от sinuke совершенно верно написано использование приведения типа через absolute Это вообще мрак, что он написал. Такая конструкция возможна только в случае маленьких программок с простой логикой. Что, например, если в качестве Sender придёт не TButton? 5 минут назад, krapotkin сказал: то что ссылки на кнопки хранятся в массиве не меняет совсем ничего А как выполнить действие, если пришла кнопка №34? Не поставив 34 if, и не трогая tag? Цитата Ссылка на комментарий
0 krapotkin Опубликовано 9 октября, 2017 Поделиться Опубликовано 9 октября, 2017 как вместо Sender придет не TButton, если мы сами создавали массив и присваивали этот обработчик каждой кнопке??? у него написано совершенно верно, только скобок в := MyOnClick() не должно быть и какая бы кнопка не пришла, именно указатель на нее хранится в Sender это магия такая #WAMACO 1 Цитата Ссылка на комментарий
0 GASCHE Опубликовано 9 октября, 2017 Поделиться Опубликовано 9 октября, 2017 Как то так работает procedure TfLT.cbMouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Single); begin iTagObject := ( Sender as TCornerButton ).Tag; sState := Shift; btnChange(); end; думаю и MyOnClick() тоже будет. Цитата Ссылка на комментарий
0 Akad Опубликовано 9 октября, 2017 Поделиться Опубликовано 9 октября, 2017 55 минут назад, krapotkin сказал: как вместо Sender придет не TButton, если мы сами создавали массив и присваивали этот обработчик каждой кнопке??? А если ещё обработчик изменения TEdit и пр на этом коде появится? P.S. Даже если ты всю жизнь пишешь мелкие проектики со прямолинейной логикой и без скриптов и пр. вещей, это не значит, что использование absolute хоть как-то оправдано. Тем более рекомендовать подобное кому-то. Код будет работать в частных случаях, максимум до первой большой переделки логики - когда ты об этом хаке уже забудешь - не более. Цитата Ссылка на комментарий
1 krapotkin Опубликовано 9 октября, 2017 Поделиться Опубликовано 9 октября, 2017 Когда у бабушки будут для этого необходимые предпосылки, ее будут называть дедушкой. Речь идет о совершенно конкретной задаче. Если вы назначите обработчик OnClick edit'у, то это будет уже другая задача, и решать ее нужно с учетом всех имеющихся обстоятельств. Если вы замахнулись на "абстрактность", то вам должно быть недостаточно использовать свойство Tag, которое, очевидно, является костылем, заменяющим в мелких проектиках с прямолинейной логикой использование нормальной модели данных... #WAMACO, Равиль Зарипов (ZuBy) и Евгений Корепов 3 Цитата Ссылка на комментарий
Вопрос
МедиаСистемы
Здравствуйте!
Кто может подсказать как определить какая кнопка нажата в динамическом массиве кнопок.
Ссылка на комментарий
12 ответов на этот вопрос
Рекомендуемые сообщения
Присоединяйтесь к обсуждению
Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.