Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 14.02.2021, 14:33   #1
Kronos913
Форумчанин
 
Регистрация: 10.02.2021
Сообщений: 624
По умолчанию Передать переменную в процедуру-реакцию

Итак...
Есть массив объектов (в данном случае изображений, но чаще такое используется для кнопок), и есть процедура которая обрабатывает нажатие на них

При настраивании объектов есть строчка
Код:
OnMouseDown:=ImgClick;
Но вот какое дело. Хотя и обработка нажатия происходит по одному алгоритму, потом в самой процедуре все равно нужно отловить, на какое именно изображение было совершено нажатие:

Код:
  for i:=1 to 21 do begin
   if Sender=Img[i] then begin
    j:=i;
    break;
   end;
  end;
Вопрос: можно ли как-то сразу передать в процедуру числовую переменную, которая будет соответствовать номеру элемента в массиве? Чтобы не городить этот цикл поиска
Kronos913 вне форума Ответить с цитированием
Старый 14.02.2021, 14:42   #2
northener
ПШП
Участник клуба
 
Регистрация: 15.07.2013
Сообщений: 1,869
По умолчанию

При создании массива объектов их индексы в массиве можно запоминать в свойстве Tag
northener вне форума Ответить с цитированием
Старый 14.02.2021, 15:19   #3
Kronos913
Форумчанин
 
Регистрация: 10.02.2021
Сообщений: 624
По умолчанию

Цитата:
Сообщение от northener Посмотреть сообщение
При создании массива объектов их индексы в массиве можно запоминать в свойстве Tag
Хорошо, а как потом получить Tag вызвавшего объекта в процедуре-реакции?
Kronos913 вне форума Ответить с цитированием
Старый 14.02.2021, 16:03   #4
northener
ПШП
Участник клуба
 
Регистрация: 15.07.2013
Сообщений: 1,869
По умолчанию

Код:
TComponent(Sender).Tag
northener вне форума Ответить с цитированием
Старый 14.02.2021, 22:34   #5
digitalis
Старожил
 
Аватар для digitalis
 
Регистрация: 04.02.2011
Сообщений: 4,546
По умолчанию

Вот меня тоже заинтересовало в этой теме. С разрешения ТС задам вопрос:
Есть несколько Edit'ов, не оформленных в массив (массив, я полагаю, можно создать только динамически, в .dfm нет способа описа'ть массив ?), а у каждого своё имя и свой Tag, все обрабатываются одним обработчиком. Как лучше занести текст в именно тот Edit, на котором кликнули? Я сейчас в цикле опрашиваю все контролы, и если он Edit с нужным нам тегом,то пишем в него. Есть ли путь короче? Можно при активации формы проверить все контролы, их индекс в форме и Tag, занести в массив, если контрол этот - Edit. Всё равно тогда перебор в цикле, только уже в массиве. Это работает. Есть идея получше?
Код:
   n := Form1.ControlCount ;
   For i := 0 to n-1 do
     begin
        if (Form1.Controls[i] is TEdit)  and  ((Form1.Controls[i] as TEdit).Tag = MyTag) then 
             begin 
                  (Form1.Controls[i] as TEdit).Text := ........
                   Break
              end ;

Последний раз редактировалось digitalis; 14.02.2021 в 22:36.
digitalis вне форума Ответить с цитированием
Старый 14.02.2021, 22:40   #6
northener
ПШП
Участник клуба
 
Регистрация: 15.07.2013
Сообщений: 1,869
По умолчанию

Если нужно занести текст именно в тот, на котором кликнули, то не надо переборов.
Код:
if Sender is TEdit then TEdit(Sender).Text:=...;
northener вне форума Ответить с цитированием
Старый 14.02.2021, 22:56   #7
digitalis
Старожил
 
Аватар для digitalis
 
Регистрация: 04.02.2011
Сообщений: 4,546
По умолчанию

Мерси! Попробую. А то я - в Житомир через Челябинск...
---------------
Попробовал. Если у меня этот обработчик только для Edit'ов, то ещё проще:
Код:
TEdit(Sender).Text:=...;
digitalis вне форума Ответить с цитированием
Старый 15.02.2021, 02:23   #8
northener
ПШП
Участник клуба
 
Регистрация: 15.07.2013
Сообщений: 1,869
По умолчанию

Цитата:
Сообщение от digitalis Посмотреть сообщение
Попробовал. Если у меня этот обработчик только для Edit'ов, то ещё проще:
Щас набежит куча "знатоков", которая будет утверждать, что преобразование типов нужно делать исключительно с помощью оператора AS.
northener вне форума Ответить с цитированием
Старый 15.02.2021, 09:34   #9
digitalis
Старожил
 
Аватар для digitalis
 
Регистрация: 04.02.2011
Сообщений: 4,546
По умолчанию

Может, по фэнь-шую оно так и было бы кошерно, но нам, не_семи_пядей_во_лбу программерам на конкретном компиляторе ... Работает - ну и ладушки. Не заурчит - знаем, кого на помощь звать: as'са.

Последний раз редактировалось digitalis; 15.02.2021 в 21:51.
digitalis вне форума Ответить с цитированием
Старый 16.02.2021, 02:49   #10
northener
ПШП
Участник клуба
 
Регистрация: 15.07.2013
Сообщений: 1,869
По умолчанию

Цитата:
Сообщение от digitalis Посмотреть сообщение
Может, по фэнь-шую оно так и было бы кошерно
Только по фень-шую.
Грамотным программистам оператор as не нужен от слова совсем.
northener вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
передать переменную из js in php Hattak Помощь студентам 2 14.05.2016 15:58
Описать процедуру Minmax(X, Y), записывает в переменную X минимальное из значений X и Y, а в переменную Y - максимальное kinash96 Помощь студентам 3 12.10.2013 19:49
Передать переменную OliverVood JavaScript, Ajax 8 25.07.2013 09:16
передать переменную mihailjack JavaScript, Ajax 1 17.10.2012 20:37
передать переменную ar4i Общие вопросы Delphi 10 04.12.2006 14:30