Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2003.07.07;
Скачать: CL | DM;

Вниз

Общее событие OnClick для нескольких контролов...   Найти похожие ветки 

 
Mihey ©   (2003-06-24 00:45) [0]

Динамически создаю в массиве контролы. Нужно присвоить этим всем контролам один обработчик OnClick, однако в этом обработчике нужно распознать, на какой контрол нажали. Нужно что-ли Sender обрабатывать. В тэге контрола указан индекс его в массиве, нужно это число вытащить. Напишите, плз, шапку процедуры-обработчика и код, где будет вытаскиваться свойство Tag.


 
Palladin ©   (2003-06-24 00:50) [1]

tag конечно удобно, но более правильно использовать
as, is и TControl.Name

малоли для чего потом tag понадобится...


 
Германн ©   (2003-06-24 02:54) [2]

2Palladin © (24.06.03 00:50)
tag конечно удобно, но более правильно использовать
as, is и TControl.Name

малоли для чего потом tag понадобится...

Извини, не понял! Конечно стоит использовать и as и is. Но вот насчет "правильности" использования Name вместо Tag, я бы поспорил! А мало ли для чего потом name понадобится? И главное, чем одно хуже другого и наоборот?


 
ЮЮ ©   (2003-06-24 03:57) [3]

procedure TForm1.Button1Click(Sender: TObject);
begin
// общий обработчик
if (Sender <> nil) and (Sender is TControl) then
Form1.Caption := IntToStr(TControl(Sender).Tag)
else
Form1.Caption := "";
end;

procedure TForm1.Button2Click(Sender: TObject);
var
i: integer;
b: TButton;
begin
for i := 0 to 10 do begin
b := TButton.Create(self);
b.Parent := self;
b.Tag := i + 1;
b.OnClick := Button1Click; // назначение обработчика
b.Top := Button1.Top + (i + 1) * (Button1.Height + 2);
b.Left := Button1.Left;
b.Caption := IntToStr(i + 1);
end;
end;

procedure TForm1.Button3Click(Sender: TObject);
begin
Button1Click(nil); // прямой вызов обработчика
end;


 
Palladin ©   (2003-06-24 08:03) [4]


> Но вот насчет "правильности" использования Name вместо Tag,
> я бы поспорил! А мало ли для чего потом name понадобится?
> И главное, чем одно хуже другого и наоборот?

я не сказал что правильней, я сказал что более правильней, и лишь по той причине что в функции FindComponent принимается именно name, а не tag


 
Anatoly Podgoretsky ©   (2003-06-24 09:08) [5]

А Sender и так уже содержит этот элемент из массива.


 
Mihey ©   (2003-06-24 13:20) [6]

2 Palladin & Anatoly Podgoretsky:

Я понимаю, что по тэгу - это облегчение задачи, хотя способ ЮЮ мне полностью подходит (thanx!). Но тогда вы помогите узнать, какому элементу массива принадлежит кнопко по Name???


 
Palladin ©   (2003-06-24 13:39) [7]

ты про какой массив


 
pasha676   (2003-06-24 13:44) [8]


> if (Sender <> nil) and (Sender is TControl) then

А эта строка для чего нужна? Недоганяю.


 
Palladin ©   (2003-06-24 13:45) [9]

а вдруг :)


 
pasha676   (2003-06-24 13:52) [10]


> какому элементу массива принадлежит кнопко по Name???

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


 
Anatoly Podgoretsky ©   (2003-06-24 13:54) [11]

К массиву можно обращаться по индексу, только зачем, ты и так уже имеешь эту ссылку


 
Mihey ©   (2003-06-24 14:39) [12]

Блин, ссори, запутал вас. В моей проге кнопки хранятся в массиве. Так удобно работать, т.к. они все похожи. Но тогда что я получу, узнав Name?


 
Palladin ©   (2003-06-24 14:52) [13]

ровно столько же сколько и если узнаешь tag


 
han_malign ©   (2003-06-24 15:01) [14]

Это они все запутали, но постановка вопроса тоже не совсем правильна.

Я так понимаю, что нужен не элемент массива(который является Sender-ом), а как раз индекс этого элемента, для связи с ассоциированной для этой кнопки структурой для обработки, так вот для этого правильней (и специально для этого заведено) пользоваться Tag-ом, в котором, кстати, можно хранить непосредственно указатель на корреспондирующую структуру.

И, собственно, все что нужно, это всем задать один обработчик, и учитывая, что тебе известно, что этот обработчик только этих кнопок, и никто его больше не вызывает, без лишних проверок
.......
Index:=TControl(Sender).Tag;
или (если понимаешь что делаешь, в Tag-е указатель на объект(Button[1].Tag:=Integer(MyObject[1])))
TMyObject(TControl(Sender).Tag).DoWorkOnButton;



Страницы: 1 вся ветка

Текущий архив: 2003.07.07;
Скачать: CL | DM;

Наверх




Память: 0.5 MB
Время: 0.011 c
1-20152
Kostya
2003-06-25 11:23
2003.07.07
Есть структура файла, а прочитать читать немогу


1-20039
elf
2003-06-25 01:09
2003.07.07
Как создать две рабочие области


1-20086
bmv
2003-06-23 13:18
2003.07.07
Загрузка большого объема данных


6-20182
Snap
2003-04-21 23:38
2003.07.07
Пакеты


3-19995
nv-vetal
2003-06-13 11:12
2003.07.07
Delphi & MySQL. Ошибка при соединении - unable to load libmysql.d