Главная страница
    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.47 MB
Время: 0.006 c
14-20298
Alexsus
2003-06-20 12:37
2003.07.07
Подскажите пожалуйста, где можно взять какой-нибудь ...


6-20177
stas_a
2003-04-30 10:33
2003.07.07
Модемное соединение


3-20014
Kinda
2003-06-15 13:22
2003.07.07
Создание запроса.


1-20054
INTAARI
2003-06-25 11:25
2003.07.07
Освобождение памяти при завершении работы с Tlist


14-20314
Spartak
2003-06-21 09:51
2003.07.07
Проблема со сканированием порта





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский