Параметр sender delphi

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

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

if Sender = Button1
then Caption: = 'Клацання по кнопці №1'
else Caption: = 'Клацання по кнопці №2';

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

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

Насамперед зазначимо, що слово Edit1 написано багато разів, що насправді зайве. За допомогою оператора приєднання with позбудемося необхідності писати Edit1 всередині операторів:

Усе! Тепер для того щоб позбутися від ком у всіх 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! Хоча працювати ця процедура також буде для всіх компонентів, яким вона порівняна. Але вчіться бачити різні можливості, колись і перший спосіб стане в нагоді. І взагалі, вчіться.