Додавання методів і подій в компонент

Створений в прикладі 1 компонент PrinterList відрізняється від свого прототипу тільки перевизначенням одного з методів батьківського компонента. Такий спосіб зміни поведінки стандартного компонента і реалізації додаткових функцій нового компонента є очевидним і досить простим. Інший спосіб полягає в тому, що поведінка стандартного компонента поліпшується шляхом додавання до нього власних методів і (або) перевизначення оброблювачів стандартних подій.
Розглянемо перший спосіб на наступному прикладі.
Приклад 2. Створити компонент, який буде конвертувати поточний зміст поля введення в заголовні букви, і підраховувати кількість входжень заданого символу у вмісті поля введення.
З умови прикладу випливає, що для нового компонента в якості батьківського найбільш підходящим є стандартний компонент Edit класу TEdit. Нехай новий компонент називається NewEdit. Для реалізації покладених на нього функцій в модуль компонента додамо два методи:
• процедуру ToUpper, яка буде перетворювати поточний зміст поля введення в заголовні букви;
• функцію з ім'ям GetThisCharCount, яка буде повертати кількість входжень заданого символу у вмісті поля введення.
Виконавши дії пункту 3 в прикладі 1, створіть заготовку модуля нового компонента і додайте в її інтерфейсну частину опису нових методів ToUpper і GetThisCharCount:

В розділ реалізації включите програмні коди нових методів, які можуть мати такий вигляд:

procedure TNewEdit.ToUpper;
begin
Text: = Uppercase (Text);
end;
function TNewEdit.GetThisCharCount (C: char): Integer;
var
i. Integer;
begin
Result: = 0;
for i: = 1 to Length (Text) do
if Text [i] = C then Inc (Result)
end;

Встановіть компонент NewEdit на вкладку New палітри компонентів Delphi. виконавши дії пункту 4 прикладу 1.
Виконайте тестування нового компонента, для чого створіть новий додаток, помістіть на форму компонент NewEdit, компонент Edit для введення задається символу і три кнопки. Поля введення за допомогою компонентів Label забезпечите заголовками, наприклад: "Вихідна рядок", "Заданий символ". Кнопок також можна дати назви, наприклад: "Переклад в заголовні", "Кількість входжень", "Вихід". Для перших двох кнопок підготуйте обробники події OnClick так, щоб кожна з них викликала один з доданих методів:

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

procedure TForm1.Button2Click (Sender: TObject);
begin
ShowMessage ( 'Кількість входжень заданого символу' + Edit1.Text [1] + '=' +
IntToStr (NewEdit1.GetThisCharCount (Edit1.Text [1])));
NewEdit1.Text: = ''; Edit1.Text: = ''
end;

Відкрийте програму і перевірте правильність виконання функцій нового компонента NewEdit.
Виконавши дії пункту 6 (приклад 1), підготуйте і зареєструйте в середовищі Delphi значок для компонента NewEdit.
При створенні користувальницького компонента найчастіше від нього вимагається така ж реакція на події, як і від того компонента, на основі якого він розроблений. Якщо батьківським класом компонента обраний клас, який реалізує, наприклад, один із стандартних компонентів (клас Edit в прикладі 2), то спеціально піклуватися про події не потрібно: всі події, доступні компоненту Edit, будуть доступні і компоненту NewEdit.
Завдання ускладнюється в наступних випадках:
1. Якщо клас, який реалізує новий компонент, є спадкоємцем деякого абстрактного класу (наприклад, можна було б зробити клас TNewEdit від класу TCustomEdit - предка TEdit).
2. Якщо потрібно, щоб новий компонент реагував на деякий подія не так, як його предок і ця реакція реалізовувалася б самим компонентом, а не засобами програми, в якому він буде використовуватися.
У першому випадку в розпорядженні нового класу за замовчуванням ніяких подій не буде. Якщо потрібно, щоб новий компонент отримав доступ до подій, наприклад, OnClick і OnKeyDown, то необхідно оголосити їх як властивості в розділі published:

Після цієї події OnClick і OnKeyDown з'являться на вкладці Events Інспектора об'єктів, і можна буде звичайним чином програмувати їх обробку в модулі компонента.
У другому випадку необхідно просто перевизначити в модулі компонента метод-обробник необхідного події. Погляньмо на цей випадок на наступному прикладі.
Приклад 3. Створити компонент, який буде представлятися кнопкою, підраховує кількість натискань на себе і відображає його в своїй написи. В іншому нова кнопка повинна реагувати на натискання так само, як звичайна.
Оскільки новий компонент повинен представлятися кнопкою, то доцільно в якості базового класу вибрати клас TButton. У створюваному компоненті будуть використовуватися його конструктор і обробник події OnClick. Новому компоненту дамо ім'я New1Button.
Виконайте всі дії по створенню заготовки модуля нового компонента і додайте опис нового класу TNew1Button такими рядками:
• в розділі private введіть поле FCount: Integer для зберігання кількості натискань на кнопку;
• в розділі public вкажіть заголовки переобумовлених методів - конструктора базового класу Create і обробника події OnClick:

constructor Create (AOwner. TComponent); override;
procedure Click; override;

В розділ реалізації включите програмні коди нових методів:

Встановіть компонент New1Button на вкладку New палітри компонентів Delphi. виконавши дії пункту 4 прикладу 1.
Виконайте тестування нового компонента. для чого створіть новий додаток, помістіть на форму компонент New1Button і інші стандартні компоненти (кнопки, мітки і т. д.) для забезпечення прийнятного інтерфейсу додатку. Перевірте, що нова кнопка дійсно вважає натискання на себе.
Виконавши дії пункту 6 (приклад 1), підготуйте і зареєструйте в середовищі Delphi значок для компонента New1Button.
Модифікуйте тестове додаток, створивши в ньому власний обробник події OnClick для кнопки New1Button (наприклад, в обробнику можна вивести будь-яке повідомлення процедурою ShowMessage або іншим способом). Перевірте роботу програми та зробіть відповідні висновки.

Посилання по темі