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

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

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

Восстановить пароль

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

Ответ
 
Опции темы Поиск в этой теме
Старый 22.01.2012, 19:45   #1
sqr
Пользователь
 
Аватар для sqr
 
Регистрация: 26.10.2011
Сообщений: 49
Стрелка Событие для массива компонентов

Есть массив из девяти Tlabel
Нужно чтоб при клике на один из лейблов записывался в переменную его номер. Только нужно чтоб событие было одно для всего массива. Не понимаю как реализовать. Сейчас у меня в программе тысячи строк кода, потому что расписано все в каждом лейбле по событию онКлик, изменено лишь несколько цифр. Хочу чтоб все было в одной процедуре.
Everybody lies.
sqr вне форума Ответить с цитированием
Старый 22.01.2012, 19:48   #2
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

один метод обработчик, а в нем применяйте Sender.
уже тысячу раз было.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 22.01.2012, 19:50   #3
sqr
Пользователь
 
Аватар для sqr
 
Регистрация: 26.10.2011
Сообщений: 49
По умолчанию

Цитата:
Сообщение от Пепел Феникса Посмотреть сообщение
один метод обработчик, а в нем применяйте Sender.
уже тысячу раз было.
можно подробней, а то мне это ниочем не говорит
Everybody lies.
sqr вне форума Ответить с цитированием
Старый 22.01.2012, 19:52   #4
3D Hunter
Сумрачная тень
Форумчанин
 
Аватар для 3D Hunter
 
Регистрация: 05.03.2009
Сообщений: 689
По умолчанию

1. проставьте вашим лэйблам номера в свойстве Tag.
2. напишите такой обработчик OnClick и присвойте его всем лэйблам через инспектор объектов:
Код:
procedure TForm1.Label1Click(Sender: TObject);
begin
  arr[TLabel(Sender).Tag]:=TLabel(Sender).Tag;
end;
где arr - ваш массив из девяти лэйблов.
В вашем случае важно, чтобы нумерация в тагах и число лэйблов были синхронны - размерность массива должна соответствовать числу компонентов. Предполагается, что ваш массив статический.
"ковыряю изнутри" (с)
3D Hunter вне форума Ответить с цитированием
Старый 22.01.2012, 20:11   #5
sqr
Пользователь
 
Аватар для sqr
 
Регистрация: 26.10.2011
Сообщений: 49
По умолчанию

В tag все записал.
Вот:
Код:
procedure TForm1.Label1Click(Sender: TObject);
begin
L[TLabel(Sender).Tag]:=TLabel(Sender).Tag;
end;
Ошибка:
[Error] Unit1.pas(190): Incompatible types: 'TLabel' and 'Integer'

Лейблы на форме уже есть а массив из них создал так:
Код:
L[1]:=label1;
L[2]:=label2;
L[3]:=label3;
L[4]:=label4;
L[5]:=label5;
L[6]:=label6;
L[7]:=label7;
L[8]:=label8;
L[9]:=label9;
Everybody lies.
sqr вне форума Ответить с цитированием
Старый 22.01.2012, 20:16   #6
3D Hunter
Сумрачная тень
Форумчанин
 
Аватар для 3D Hunter
 
Регистрация: 05.03.2009
Сообщений: 689
По умолчанию

Вы делфи знаете вообще? В упор ошибки присвоения типов не видите?
Если просто таги:
Код:
L[TLabel(Sender).Tag].Tag:=TLabel(Sender).Tag;
А может быть вам нужно присвоить сам лэйбл?
Код:
L[TLabel(Sender).Tag]:=TLabel(Sender);
"ковыряю изнутри" (с)

Последний раз редактировалось 3D Hunter; 22.01.2012 в 20:18.
3D Hunter вне форума Ответить с цитированием
Старый 22.01.2012, 20:23   #7
sqr
Пользователь
 
Аватар для sqr
 
Регистрация: 26.10.2011
Сообщений: 49
По умолчанию

Цитата:
Сообщение от 3D Hunter Посмотреть сообщение
Вы делфи знаете вообще?
Ну я сам учу делфи.
Вот сделал так
L[TLabel(Sender).Tag].Tag:=TLabel(Sender).Tag;
заработало. Но теперь объясните что делает эта строчка? (извините за глупые вопросы)
Я правильно понял, при клике на любой лейбл из массива L, будет обрабатываться процедура Label1Click? а как записать номер лейбла на который кликнули в переменную?
Everybody lies.
sqr вне форума Ответить с цитированием
Старый 22.01.2012, 20:29   #8
3D Hunter
Сумрачная тень
Форумчанин
 
Аватар для 3D Hunter
 
Регистрация: 05.03.2009
Сообщений: 689
По умолчанию

Sender - это "неопределенный" объект. но т.к. мы работаем ТОЛЬКО с лэйблами, то нужно привести его к типу TLabel, именно так TLabel(Sender). Теперь получили переменную типа той же Label1 или как вы обращаетесь к компоненту в коде. Теперь и можно вызывать все свойства этого компонента. Чтобы записать номер лэйбла, сначала их нужно пронумеровать, что мы и сделали со свойством Tag.
"ковыряю изнутри" (с)
3D Hunter вне форума Ответить с цитированием
Старый 22.01.2012, 20:33   #9
sqr
Пользователь
 
Аватар для sqr
 
Регистрация: 26.10.2011
Сообщений: 49
По умолчанию

Код:
procedure TForm1.Label1Click(Sender: TObject);
var n:integer;
begin
n:=TLabel(Sender).Tag;
label13.Caption:=inttostr(n);
end;
вот вроде то что нужно было. Теперь в переменную n записывается номер выбраного лейбла, а точнее Tag выбранного лейбла. Или это не так делается?
Everybody lies.
sqr вне форума Ответить с цитированием
Старый 22.01.2012, 20:35   #10
3D Hunter
Сумрачная тень
Форумчанин
 
Аватар для 3D Hunter
 
Регистрация: 05.03.2009
Сообщений: 689
По умолчанию

Код:
n:=TLabel(Sender).Tag;
TLabel(Sender).Caption:=inttostr(n);
Если выводить номер в статичный лэйбл, то напрямую, как у вас.
"ковыряю изнутри" (с)

Последний раз редактировалось 3D Hunter; 22.01.2012 в 20:38.
3D Hunter вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
событие для массива созданных элементов areyoudead Общие вопросы Delphi 52 14.10.2014 19:25
Повесить общую процедуру на событие кучки компонентов Valio Общие вопросы Delphi 14 13.10.2014 18:32
Формирование массива из компонентов исходного файла (Задача на Turbo Pascal) Hedgehog92 Помощь студентам 0 23.11.2011 21:53
Создание массива компонентов artemavd Общие вопросы Delphi 8 30.03.2009 15:43
OnClick для массива компонентов Dj_smart Компоненты Delphi 5 30.04.2008 14:16