Главная страница
    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
4-20339
Nick Denry
2003-05-02 01:59
2003.07.07
Ресурсы. UpdateResource.


1-20082
Voyager_XX
2003-06-23 19:55
2003.07.07
Чем вызвана ошибка Cannot assign a TFont to a TFont...


1-20081
Smashich
2003-06-24 11:30
2003.07.07
Events And Word


7-20331
Leos
2003-04-25 21:27
2003.07.07
Clipboard


14-20221
EgorKA
2003-06-22 19:08
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
Английский Французский Немецкий Итальянский Португальский Русский Испанский