Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 2003.07.07;
Скачать: [xml.tar.bz2];

Вниз

Общее событие 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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.47 MB
Время: 0.007 c
14-20225
KIE
2003-06-19 13:14
2003.07.07
Настройки сети


14-20285
han_malign
2003-06-20 12:29
2003.07.07
Тут промелькивал вопрос про серийный номер камня


1-20036
Seldon
2003-06-25 00:36
2003.07.07
Как сообщить о DblClick


3-19964
Саня
2003-06-12 09:34
2003.07.07
Как создать запрос если название поля - цифра?


14-20296
Юрий Зотов
2003-06-19 17:55
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
Английский Французский Немецкий Итальянский Португальский Русский Испанский