Посібник з написання своїх компонентів на Дельфі для початківців

Зміст:

· Чому я сів писати цей посібник

· Початок. Для чого потрібні компоненти

· Крок 1. Придумування ідеї

· Крок 2. Створення порожнього модуля компонента

· Крок 3. Починаємо розбиратися у всіх директивах

· Крок 4. Пишемо процедури і функції.

· Крок 5. Встановлюємо компонент

Тепер вивчимо більш складні речі:

· Створення властивостей свого типу

· Імплантуємо таймер компонент

· Переустановка компонента

Чому я сів писати цей посібник

По-перше, тому що коли я дуже хотів написати свій перший компонент, я прочитав дві книги, і у мене нічого цікавого власне не вийшло. Потім я прочитав ще одну книгу (в ній хоча б приклад робітник був), начебто розібрався. Але там був розібраний такий простий компонент, що все більш складне мені доводилося робити самому, іноді методом тику, іноді сидів розбирався і так далі. Результат — розібрався, чого і вам бажаю і сподіваюся допомогти цим посібником.

Всі мої готові компоненти можна знайти на сайті delphid.dax.ru/.

Для чого потрібні компоненти

Дельфі має відкриту архітектуру — це означає, що кожен програміст може вдосконалити цю середу розробки, як він захоче. До стандартних наборів компонентів, які поставляються разом з Дельфі можна створити ще багато своїх цікавих компонентів, які помітно спростить вам життя (це я вам гарантую). А ще можна зайти на якийсь крутий сайт про Дельфи і там скачати купу крутих компонентів, і на їх основі зробити якусь круту прогу. Так само компоненти звільняють вас від написання «тисячі тонн словесної руди». Приклад: ви створили компонент — кнопку, при натисканні на яку дані з Memo збережуться в тимчасовий файл. Тепер як тільки вам знадобиться ця функція ви просто ставите цей компонент на форму і насолоджуєтеся результатом. І не треба буде кожен раз прописувати це для ваших нових програм — просто скористайтеся компонентом.

Наверх^

Крок 1. Придумування ідеї

Першим кроком потрібно відповісти собі на питання: «Для чого мені цей компонент і що він буде робити?». Потім необхідно в загальних рисах продумати його властивості, події, на які він буде реагувати і ті функції і процедури, якими компонент повинен володіти. Потім дуже важливо вибрати «предка» компонента, тобто спадкоємцем якого класу він буде. Тут є два шляхи. Або як спадкоємця взяти вже готовий компонент (тобто модифікувати вже існуючий клас), або створити новий клас.

Для створення нового класу можна виділити 4 випадки:

1. Створення Windows-елемента керування (TWinControl)

2. Створення графічного об’єкта управління (TGraphicControl)

3. Створення нового класу або елемента керування (TCustomControl)

4. Створення невизуального компонента (не видимого) (TComponent)

Тепер спробую пояснити що ж таке візуальні та невізуальні компоненти. Візуальні компоненти видно під час роботи програми, з ними безпосередньо може взаємодіяти користувач, наприклад кнопка Button — є візуальним компонентом.

Невізуальні компоненти видно тільки під час розробки програми (Design-Time), а під час роботи програми (Run-Time) їх не видно, але вони можуть виконувати яку-небудь роботу. Найбільш часто використовуваний невізуальний компонент — це Timer.

Отже, що б приступити від слів до справи, спробуємо зробити який-небудь супер простий компонент (тільки в цілях ознайомлення з технікою створення компонентів), а потім будемо його ускладнювати.

Наверх^
Крок 2. Створення порожнього модуля компонента

Розглядати цей крок я буду виходячи з пристрою Дельфі 3, в інших версіях цей процес не сильно відрізняється. Давайте спробуємо створити кнопку, у якій буде доступна інформація про кількість кліків по ній.

Щоб приступити до безпосереднього написання компонента, вам необхідно зробити наступне:

· Закрийте проекти, які ви розробляли (форми і модулі)

· В основному меню виберіть Component -> New Component…

· Перед вами відкриється діалогове вікно з назвою «New Component»

· У полі Ancestor Type (тип предка) виберіть клас компонента, який ви хочете змінити. У нашому випадку вам треба вибрати клас TButton

· У полі Class Name введіть ім’я класу, який ви хочете отримати. Ім’я обов’язково повинно починатися з літери «т». Ми напишемо туди, наприклад, TCountBtn

· У полі Palette Page введіть ім’я закладки на якій цей компонент з’явитися після установки. Введемо туди MyComponents (тепер у вас в Делфьи буде своя закладка з компонентами!).

· Поле Unit File Name заповнюється автоматично, в залежності від обраного імені компонента. Це шлях куди буде збережений ваш модуль.

· У поле Search Path нічого змінювати не потрібно.

· Тепер натисніть на кнопку Create Unit і отримаєте наступне:

unit CountBtn;

interface

uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls;

type
TCountBtn = class(TButton)

private
{ Private declarations }

protected
{ Protected declarations }

public
{ Public declarations }

published
{ Published declarations }

end;

procedure Register;

implementation

procedure Register;
begin
RegisterComponents(‘MyComponents’, [TCountBtn]);
end;

end.

Наверх^

Крок 3. Починаємо розбиратися у всіх директивах

Що ж тут написано? так власне поки нічого цікавого. Тут оголошено новий клас TCountBtn і процедура реєстрації вашого компонента в палітрі компонентів.

Директива Private Тут ви будете писати всі приховані поля, які вам знадобляться для створення компонента. Так само в цій директиві описуються процедури і функції, необхідні для роботи свого компонента, ці процедури та функції не доступні. Для нашого компонент ми напишемо туди наступне (запис повинна складатися з букви «F» ім’я поля тип поля):

FCount:integer;

Буква «F» повинна бути пристутніми обов’язково. Тут ми створили приховане поле Count, в якому буде зберігатися кількість кліків по кнопці.

Директива Protected. Зазвичай я тут пишу різні обробники подій миші та клавіатури. Ми напишемо тут наступний рядок:

procedure Click; override;

Це вказує на те, що ми будемо обробляти клацання миші по компоненту. Слово «override» вказує на те, що ми перекриємо стандартне подія OnClick для компонента предка.

В директиві Public описуються ті процедури і функції компонента, які будуть доступні користувачеві. (Наприклад, в процесі написання коду ви пишете ім’я компонента, ставите крапку і перед вами список доступних функцій, оголошених в диретиве Public). Для нашого компонента, щоб показати принцип використання цієї директиви створимо функцію — ShowCount, яка покаже повідомлення, повідомляючи користувача скільки разів він натиснув на кнопку. Для цього в директиві Public напишемо такий код:

procedure ShowCount;

Залишилася остання директива Published. У ній також використовується оголошення доступних користувачеві, властивостей і методів компонента. Для того, щоб наш компонент з’явився на формі необхідно описати метод створення компонента (конструктор), можна прописати і деструктори, але це не обов’язково. Слід звернути увагу на те, що якщо ви хочете, щоб якісь властивості вашого компонента з’явилися в Інспектора Об’єктів (Object Inspector) вам необхідно описати ці властивості в директиві Published. Це робиться так: property Ім’я_властивості (але пам’ятайте тут букву «F» вже не потрібно писати), потім ставиться двокрапка “:” тип властивості, read процедура для читання значення, функція write для запису значення;. Але схоже це все дуже заплутано. Подивіться, що потрібно написати для нашого компонента і все зрозумієте:

constructor Create(aowner:Tcomponent);override; //Конструктор
property Count:integer read FCount write FCount; //Властивість Count

Отже всі оголошення зроблені і ми можемо приступити до написання безпосередньо всіх оголошених процедур.

Наверх^

Крок 4. Пишемо процедури і функції.

Почнемо з написання конструктора. Це робиться приблизно так:

constructor TCountBtn.Create(aowner:Tcomponent);
begin
inherited create(Aowner);
end;

Тут в принципі розуміти нічого не треба. У всіх своїх компонентах я писав саме це (тільки клас компонента міняв і все). Також сюди можна записувати будь-які дії, які ви хочете зробити на самому початку роботи компонента, тобто в момент установки компонента на форму. Наприклад, можна встановити початкове значення нашого властивості Count. Але ми цього робити не будемо.

Тепер ми напишемо процедуру обробки клацання мишкою по кнопці:

procedure Tcountbtn.Click;
begin
inherited click;
FCount:=FCount+1;
end;

«Inherited click» означає, що ми повторюємо стандартні методи обробки клацання мишею (навіщо напружуватися і робити зайву роботу:)).

У нас залишилася остання процедура ShowCount. Вона може виглядати приблизно так:

procedure TCountBtn.ShowCount;
begin
Showmessage(‘По кнопці ‘+ caption+’ ви зробили: ‘+inttostr(FCount)+’ клік(а/ів)’);
end;

Тут виводиться повідомлення, в якому показується кількість кліків по кнопці (до того ж виводиться ім’я цієї кнопки, ну це я додав тільки з естетичною метою).

І якщо ви все зрозуміли і зробили правильно, то у вас повинно вийде наступне:

unit CountBtn;

interface

uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls, ExtCtrls;

type
TCountBtn = class(TButton)
private
{ Private declarations }
FCount:integer;
protected
{ Protected declarations }
procedure Click;override;
public
{ Public declarations }
procedure ShowCount;
published
{ Published declarations }
property Count:integer read FCount write FCount;
constructor Create(aowner:Tcomponent);override;
end;

procedure Register;

implementation

procedure Register;
begin
RegisterComponents(‘Mihan Components’, [TCountBtn]);
end;

constructor TCountBtn.Create(aowner:Tcomponent);
begin
inherited create(Aowner);
end;

procedure Tcountbtn.Click;
begin
inherited click;
FCount:=FCount+1;
end;

procedure TCountBtn.ShowCount;
begin
Showmessage(‘По кнопці ‘+ caption+’ ви зробили: ‘+inttostr(FCount)+’ клік(а/ів)’);
end;
end.

Швидше сохраняйтесь, щоб не втратити випадковим чином байти набраного коду:)).

Наверх^

Крок 5. Встановлюємо компонент

Якщо ви зуміли написати і зрозуміти, все те що тут запропоновано, то установка компонента не повинна викликати у вас ніяких проблем. Все тут робиться дуже просто. У головному меню виберіть Component -> Install Component. перед вами відкрилося діалогове вікно Install Component. В ньому ви побачите дві закладки: Into exsisting Package та Into new Package. Вам надається вибір встановити ваш компонент у вже існуючий пакет або в новий пакет відповідно. Ми виберемо у вже існуючий пакет.

У полі Unit File Name напишіть ім’я вашого сохранненого модуля (природно необхідно ще і вказати шлях до нього), а краще скористайтеся кнопкою Browse і виберіть файл у вікні.

У Search Path нічого змінювати не потрібно, Делфьи сама за вас все туди додасть.

У полі Package File Name виберіть ім’я пакету, який буде встановлений ваш компонент. Ми погодимося з запропонованим за замовчуванням пакетом.

Тепер натискаємо кнопку Ok. І тут з’явитися попередження Package dclusr30.dpk will be rebuilt. Continue? Дельфі запитує: «такий Пакет буде змінено. Продовжити?». Звичайно ж треба відповісти «Так». І якщо ви все зробили правильно, то з’явитися повідомлення, що ваш компонент встановлений. Що ж можна кричати Ура! Це ваш перший компонент.

Наверх^

Створення властивостей свого типу

Тепер ми спробуємо створити властивість нестандартного типу. Розглянемо це на прикладі мітки — TLabel. У цього компонента є така властивість: Alignment. Воно може приймати наступні значення: taLeftJustify, taCenter, taRightJustify. Приступаємо до створення властивості. Нічого цікавого мені придумати не вдалося, але тим не менше я вам покажу це на прикладі того властивості, яке я придумав. Воно дуже просте і допоможе вам розібратися. Властивість буде називатися ShowType (тип TShowTp), в нашому компоненті воно буде відповідати за відображення властивості Count. Якщо користувач встановить властивість ShowType в Normal, то кнопка буде працювати, як і працювала. А якщо користувач присвоїть цього свойтсву значення CountToCaption, то кількість кліків, буде відображатися на самій кнопці.

Для початку нам необхідно оголосити новий тип. Опис типу потрібно додати після слова Type. Ось так це виглядало спочатку:

type
TCountBtn = class(TButton)

Ось так це має виглядати:

type

TShowTp = (Normal, CountToCaption);

TCountBtn = class(TButton)

Тут ми оголосили новий тип TShowTp, який може приймати тільки два значення. Всі значення, які ви хочете додати перераховуються через кому.

Тепер нам потрібно створити поле цього типу. Це ми вже вміємо і робити і тому не повинно викликати ніяких труднощів. В директиву Private напишіть:

FShowType:TShowTp;

Ми створили поле ShowType, типу TShowTp.

Звичайно ж необхідно додати це властивість в інспектор об’єктів:

property ShowType: TshowTp read FshowType write FShowType;

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

procedure Tcountbtn.Click;
begin
inherited click;
FCount:=Fcount+1;
if ShowType = Normal then
Caption:=Caption;
if ShowType = CountToCaption then
Caption:=’Count= ‘+inttostr(count);
end;

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

Наверх^

Імплантуємо таймер компонент

Дуже часто буває, що вам необхідно вставити компонент, який-небудь інший компонент, наприклад, таймер. Як зазвичай будемо розглядати цей процес на конкретному прикладі. Зробимо так, що через кожні 10 секунд значення лічильника кліків буде подвоюватися. Для цього ми вмонтуємо таймер в нашу кнопку. Нам знадобитися зробити кілька нескладних кроків.

Після розділу uses, де описані додані в програму модулі, оголосіть змінну типу TTimer. Назвемо її Timer. Наведу невеликий фрагмент коду:

unit CountBtn;

interface

uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls, ExtCtrls;

var Timer: TTimer;
type

Далі в директиву Protected необхідно додати оброблювач події OnTimer для нашого таймера. Це робиться так:

procedure OnTimer(Sender: TObject);

Оскільки наш таймер це не змінна, а компонент, його теж треба створити для цього у конструктор нашої кнопки напишемо:

constructor TCountBtn.Create(aowner:Tcomponent);
begin
inherited create(Aowner);
Timer:=TTimer.Create(self);
Timer.Enabled:=true;
Timer.OnTimer:=OnTimer;
Timer.Interval:=10000;
end;

Тут створюється екземпляр нашого таймера і його властивості Iterval (вимірюється в мілісекундах) присвоюється значення 10000 (тобто 10 секунд якщо по простому).

Власне залишилося написати саму процедуру OnTimer. Я зробив це так:

procedure TCountBtn.OnTimer(Sender: TObject);
begin
FCount:=FCount*2;
end;

Ось приблизно те, що у вас повинно вийти в кінці:

unit CountBtn;

interface

uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls, ExtCtrls;

var Timer: TTimer;
type
TShowTp = (Normal, CountToCaption);
TCountBtn = class(TButton)

private
{ Private declarations }

FCount:integer;
FShowType:TShowTp;
protected
{ Protected declarations }
procedure OnTimer(Sender: TObject);
procedure Click;override;
public
{ Public declarations }
procedure ShowCount;
published
{ Published declarations }
property Count:integer read FCount write FCount;
constructor Create(aowner:Tcomponent);override;
property ShowType: TshowTp read FshowType write FShowType;
end;

procedure Register;

implementation

procedure Register;
begin
RegisterComponents(‘Mihan Components’, [TCountBtn]);
end;

constructor TCountBtn.Create(aowner:Tcomponent);
begin
inherited create(Aowner);
Timer:=TTimer.Create(self);
Timer.Enabled:=false;
Timer.OnTimer:=OnTimer;
Timer.Interval:=1000;
end;

procedure Tcountbtn.Click;
begin
inherited click;
FCount:=Fcount+1;
Timer.Enabled:=true;
if ShowType = Normal then
Caption:=Caption;
if ShowType = CountToCaption then
Caption:=’Count= ‘+inttostr(count);
end;

procedure TCountBtn.ShowCount;
begin
Showmessage(‘По кнопці ‘+ caption+’ ви зробили: ‘+inttostr(FCount)+’ клік(а/ів)’);
end;

procedure TCountBtn.OnTimer(Sender: TObject);
begin
FCount:=FCount*2;
end;

end.

Якщо у вас щось не спрацювало, то на початку перевірте, чи все у вас написано правильно. Потім перевірте може у вас не вистачає якогось модуля в розділі Uses.

Наверх^

Переустановка компонента

Дуже часто буває необхідно перевстановити ваш компонент. Якщо ви спробуєте зробити це шляхом вибору Component->Install Component, то Дельфі вас чесно попередить про те, що пакет вже містить модуль з таким ім’ям. Перед вами відкривається вікно з вмістом пакета. В ньому ви повинні знайти ім’я вашого компонента і видалити його (або натиснути кнопочку Remove). Тепер в пакеті вже немає вашого компонента. Потім проробіть стандартну процедуру по установці компонента.

Опублікував sedoy-90-і, будь ласка, надішліть свої відгуки мені опублікували цю статтю людині на [email protected] або зайдіть на мій сайт www.cyber-strigalev.ucoz.ru я відповім на всі ваші запитання, якщо зможу, звичайно.