Sender: TObject на delphi - всё о нём
Всем привет. Димон, особенно тебе, рад что ты ссылку запомнил!
Итак, сегодня я хочу рассказать про так часто мелькающее перед нашими глазами Sender: TObject.

Точнее, своими словами я рассказывать не буду, а переведу с английского доступным языком, копирайт смотри в конце поста, как обычно.

Давным-давно, в царстве delphi
Жил-был объект по имени Sender

[Обработчики событий и Sender]

Посмотрим на обработчик события OnClick кнопки Button1:

procedure TForm1.Button1Click(Sender: TObject) ;
begin
  ...
end;

Метод Button1Click указывает на объект Sender типа TObject. Каждый обработчик в delphi обязательно имеет параметр Sender. Функция Button1Click вызывается для события OnClick каждый раз, когда нажимается кнопка.

Параметр Sender ссылается на компонент, который вызвал метод. Если ты нажмёшь на Button1, выполнится метод Button1Click. А ссылка или указатель на объект Button1 передастся в параметре Sender.

[На практике]

Правильное использование параметра Sender может придать неимоверную гибкость нашему коду (так же, как и фильтр косой иногда позволяет уменьшить размер конструкции из труб). Параметр Sender даёт нам знать, какой компонент возбудил наше событие. (возбудил событие — запомню) Это облегчает использование одного обработчика для двух разных компонентов.

Например, мы хотим, чтобы кнопка и пункт меню выполняли одну и ту же функцию. Люди усомнятся в твоей ориентации, если ты напишешь одно событие дважды.

Для того, чтобы сделать вышеизложенное в Delphi, нужно следующее:

  • Напиши обработчик события для первого объекта (почему бы не на кнопку в SpeedBar’е?)
  • Выдели еще объекты, а может и несколько объектов (почему бы не MenuItem1, а?)
  • В Object Inspector найди Events
  • Рядом с нужным событием выбери в списке уже созданный обработчик (Delphi предложит все совместимые функции на форме)

Вот мы с тобой и создали единственный метод, который обрабатывает события OnClick на кнопке и пункте меню. Теперь нам только и остаётся, что различать, какой компонент вызвал наш метод. К примеру, у тебя мог получиться такой код:

procedure TForm1.Button1Click(Sender: TObject) ;
begin
  {общий код для пункта меню и кнопки}
  ...
  {а вот и разделение труда:}
  if Sender = Button1 then
   ShowMessage('Button1 клац!')
  else if Sender = MenuItem1 then
   ShowMessage('MenuItem1 клац!')
  else
   ShowMessage('??? клац!') ;
end;

В общих чертах, мы сравниваем Sender с компонентом.

Замечание:
Второй else в конструкции if-then-else для тех случаев, когда событие вызвано не Button1 и не MenuItem1. Но кто же еще мог вызвать наш метод? Попробуй так, поставь только еще и Button2:

procedure TForm1.Button2Click(Sender: TObject) ;
begin
   Button1Click(Button2) ;
   {будет сообщение '??? клац!'}
end;

(c) Delphi Programming — http://delphi.about.com
(c) crystalbit — http://parsers.info

В следующей части данной статьи рассказывается про такие операторы, как as и is, скоро появится у меня на блоге.
Подпишись на rss ленту, чтобы не упустить момент;)