Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 27.09.2013, 01:38   #1
danka123
Пользователь
 
Регистрация: 26.09.2012
Сообщений: 29
По умолчанию Sender и объект

Всем привет.
Создаю динамически спидбатоны на форме, указываю им свойства, все ок.
нужно в дальнейшем при клике по N кнопке, выводить например в caption формы, caption кнопки, чтобы както отследить кнопку..

не получается сделать, делаю так:
объявляю процедуру
Код:
    procedure senn(Sender: TObject);
пишу в ней код что передаю и куда
Код:
procedure TForm1.senn(Sender: TObject);
begin
 Caption := TsSpeedButton(Sender).Caption;
end;
и теперь нужно при создании динамическом, сделать событие, тут и ошибка..
делаю как-то так:
Код:
.....
       Width := 600 ;
        Height := 41;
        Font.Size := 10;
 OnClick := senn(buttt);
buttt Это TSspeedButton, также передавал туда сам TSspeedButton, ошибка... помогите разобраться что не так
danka123 вне форума Ответить с цитированием
Старый 27.09.2013, 02:03   #2
Баламут
Баламучу слегка...
Участник клуба
 
Аватар для Баламут
 
Регистрация: 01.11.2006
Сообщений: 1,585
По умолчанию

Ну правильно ругается. Если делать все по феншую, то так будет:
Код:
   ......
    OnClick := senn;
//И, кстати

procedure TForm1.senn(Sender: TObject);
begin
  ShowMessage((Sender as TSpeedButton).Caption);
end;
Баламут вне форума Ответить с цитированием
Старый 27.09.2013, 02:22   #3
danka123
Пользователь
 
Регистрация: 26.09.2012
Сообщений: 29
По умолчанию

Баламут Спасибо в трех соснах запутался
danka123 вне форума Ответить с цитированием
Старый 27.09.2013, 08:57   #4
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

кстати, так тоже будет работать:
Код:
procedure TForm1.senn(Sender: TObject);
begin
 Caption := TSpeedButton(Sender).Caption;
end;
по сути, это тоже самое, что и (Sender as TSpeedButton).Caption;


но я бы во избежания косяков ещё и тип сендера проверял.
вот так:
Код:
procedure TForm1.senn(Sender: TObject);
begin
  if Sender is TSpeedButton then
      Form1.Caption := (Sender as TSpeedButton).Caption;
end;
Serge_Bliznykov вне форума Ответить с цитированием
Старый 27.09.2013, 09:13   #5
eval
Подтвердите свой е-майл
 
Регистрация: 29.08.2012
Сообщений: 4,011
По умолчанию

посде is as уже оверхеад
eval вне форума Ответить с цитированием
Старый 27.09.2013, 09:28   #6
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

Цитата:
Сообщение от eval Посмотреть сообщение
посде is as уже оверхеад
Вы имеете в виду, что после проверки на Sender is TSpeedButton
нужно использоать прямое приведение типа через TSpeedButton(Sender) ?!

А чем Вас Sender as TSpeedButton после is не устраивает?
Serge_Bliznykov вне форума Ответить с цитированием
Старый 27.09.2013, 10:11   #7
Человек_Борща
Старожил
 
Аватар для Человек_Борща
 
Регистрация: 30.12.2009
Сообщений: 11,426
По умолчанию

Ещё можно так:
Код:
var
  Button:TButton ABSOLUTE Sender;
begin
  //Работа с Sender через Button, напрямую.
end;
Память для Button не выделяется, а используется Sender.
Очень полезный ход, но и пользоваться надо с умом.

Последний раз редактировалось Человек_Борща; 27.09.2013 в 10:43.
Человек_Борща вне форума Ответить с цитированием
Старый 27.09.2013, 10:18   #8
northener
ПШП
Участник клуба
 
Регистрация: 15.07.2013
Сообщений: 1,869
По умолчанию

2 Serge_Bliznykov
Код:
А чем Вас Sender as TSpeedButton после is не устраивает?
Тем что не понятно зачем два раза подряд проверять тот ли это класс. Как будто вы не доверяете проверке оператором is.
northener вне форума Ответить с цитированием
Старый 27.09.2013, 10:29   #9
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

northener, погодите. Или я чего-то не понимаю, или одно из двух.
А кто сказал, что as что ПРОВЕРЯЕТ ?!

вот смотрите, пусть есть код:
Код:
procedure TForm1.Button2Click(Sender: TObject);
begin
  Form1.Caption := (Sender as TButton).Name;
end;
если написать вызов так:
Код:
  Button2Click(Button1);
то всё отработает как надо.

А если написать, например, так:
Код:
  Button2Click(Form1);
то получаем (закономерно!) access vioalation. (см. скриншот)

И где избыточность при использовании as после is ?!
Изображения
Тип файла: jpg err_as.jpg (37.3 Кб, 84 просмотров)
Serge_Bliznykov вне форума Ответить с цитированием
Старый 27.09.2013, 10:38   #10
eval
Подтвердите свой е-майл
 
Регистрация: 29.08.2012
Сообщений: 4,011
По умолчанию

Цитата:
А кто сказал, что as что ПРОВЕРЯЕТ ?!
справка говорит
eval вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Как сделать так, чтобы при наведении мышкой на объект, который находится под другим, этот объект выходил на первый план? Zaza7 HTML и CSS 3 17.01.2013 10:23
Шаблоны - нужно создать объект класса abc в котором вместо aa использовался бы объект класса fff? Farrel Общие вопросы C/C++ 2 13.11.2010 17:37
sender as nark03 Общие вопросы Delphi 5 19.01.2009 17:11
sender as.. nark03 Помощь студентам 2 18.01.2009 16:13
TObject *Sender sergei64_89 Общие вопросы C/C++ 1 06.06.2008 13:36