Параметр Sender Delphi

Работа с Sender в обработчиках компонентов




Уроки Delphi
  1.  Первая программа
  2.  Использование компонентов
  3.  События Delphi
  4.  Типы данных Delphi
  5.  Создание своих типов данных
  6.  Выражения и операторы
  7.  Работа с файлами в Delphi
  8.  Дополнительные формы
  9.  Подпрограммы в Delphi
  10. Исключительные ситуации
  11. Взаимодействие приложения с пользователем
  12. Указатели в Delphi
  13. Обзор компонентов
  14. Работа со строками
  15. Создание интерфейса
  16. Графика в Delphi
  17. Многопоточность в Delphi
  18. Динамическое создание
        компонентов
Поиск по сайту




 Это важно:
   Метод Application.ProcessMessages;

 Это полезно:
   Параметр Sender в обработчиках событий;










Бояться не надо



   Параметр Sender в Delphi-программе присутствует в каждом обработчике событий любого компонента. Однако, поскольку в использовании параметра Sender часто нет необходимости, новички про него "забывают" и часто даже не догадываются о его предназначении. В этой статье я хочу рассказать о том, для чего предназначен параметр Sender Delphi и как работать с таким, как оказывается, важным и удобным параметром как Sender.

   Sender имеет тип TObject, и имеет значение объекта - источника события, в обработчике которого он используется. То есть, если на Форме находится несколько одинаковых компонентов, к тому же выполняющих одинаковые функции, то нет необходимости для каждого из них создавать свои процедуры-обработчики событий. Вполне достаточно одного комплекта обработчиков, а выяснить, к какому компоненту относится событие обрабатываемое именно сейчас, позволит именно параметр Sender.

   Ну, во первых, мы можем непосредственно выяснить имя компонента - источника события. Положите на Форму два любых компонента (например кнопки Button), для одного из низ создайте заготовку обработчика любого события (например OnClick), а второму просто сопоставьте обработчик первого. Для этого откройте Инспектор Oбъектов, выберите второй ваш объект, и на вкадке Events щёлкните по обработчику выбранного события (OnClick в данном случае). В раскрывшемся списке выберите Button1Click. Затем щёлкните туда дважды. В редакторе кода, куда вы попадёте, введите такой код:

if Sender = Button1
  then Caption:='Щелчок по кнопке №1'
  else Caption:='Щелчок по кнопке №2';

   Программа покажет, по какой именно кнопке был щелчок. Ну а зная это, можно предусмотреть дальнейшую реакцию программы.

   Это ещё не всё! Работая с параметром Sender, можно обойтись даже и без выяснения имени компонента-источника. Например, задача такая: мы должны следить за свойством Text нескольких компонентов Edit и при появлении в любом из них символа ',' (запятая) менять его на '.' (точка). Создайте такой обработчик события OnChange для одного из Edit'ов, а остальным просто сопоставьте, как в предыдущем случае:

procedure TForm1.Edit1Change(Sender: TObject);
var n: Integer;
    S: String;
begin
n:=pos(',', Edit1.Text);
if n<>0 then
  begin
    S:=Edit1.Text;
    S[n]:='.';
    Edit1.Text:=S;
    Edit1.SelStart:=n+1;
  end;
end;

   Прежде всего заметим, что слово Edit1 написано много раз, что на самом деле излишне. С помощью оператора присоединения with избавимся от необходимости писать Edit1 внутри операторов:

procedure TForm1.Edit1Change(Sender: TObject);
var n: Integer;
    S: String;
begin
with Edit1 do
  begin
    n:=pos(',', Text);
    if pos(',', Text)<>0 then
      begin
        S:=Text;
        S[n]:='.';
        Text:=S;
        SelStart:=n+1;
      end;
  end;
end;

   Всё! Теперь для того чтобы избавится от запятых во всех Edit'ах, нужно заменить в операторе присоединения Edit1 на (Sender as TEdit) - лучше вот так, в скобках.
   Дело в том, что конструкция (Sender as TObject) позволяет работать с источником события как с соответствующим объектом. В частности, если после (Sender as TEdit) поставить точку, то Delphi выдаст нам список свойств и методов компонента Edit. Хотя, по лично моей логике, вместо (Sender as TEdit) достаточно было бы просто Sender. Ан нет, не получается...

   Теперь вы понимаете, почему мы избавились от Edit1 внутри операторов - заменять каждый Edit1 на (Sender as TEdit) было бы затруднительно!

   Наконец, иногда бывает необходимо выяснить не имя, а тип источника события. В этом поможет оператор is, с помощью которого параметр Sender можно сравнить с одним из типов Delphi:

if (Sender is TButton)
  then Caption:='Источник события - кнопка TButton';



Кстати, насчёт использованного выше способа замены запятой на точку... Вместо того чтобы заменять их в тексте строки, гораздо удобнее делать это прямо "на лету", используя процедуру OnKeyPress:

procedure TForm1.Edit1KeyPress(Sender: TObject; var Key: Char);
begin
if Key=',' then Key:='.';
end;


   Почему я сразу не использовал этот способ? Потому что тут вообще не используется параметр Sender! Хотя работать эта процедура также будет для всех компонентов, которым она сопоставлена. Но учитесь видеть разные возможности, когда-то и первый способ пригодится. И вообще, учитесь...


Обзор компонентов Delphi           В начало урока          Компонент Delphi SpeedButton

Уроки Delphi начинающим



Вопросы и комментарии (34)      Решение задач в Delphi

Оставить комментарий:

Имя  

Текст комментария