Текущий архив: 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.47 MB
Время: 0.006 c