Компонентом может быть практически любой элемент программы, которым вы хотите манипулировать на этапе разработки. Создать компонент - означает создать новый класс, являющийся наследником одного из уже существующих классов. Вы можете создать компонент несколькими путями:

• изменением существующих компонентов;
• созданием новых оконных компонентов;
• созданием новых графических (не оконных) компонентов;
• созданием подклассов для элементов управления Windows;

• созданием невизульных компонентов.

В табл. 5.1 перечислены компоненты и классы, которые лучше всего брать за основу для каждого подхода.

Таблица 5.1. Рекомендуемые родительские классы

Цель

Рекомендуемые классы

Изменить существующий компонент

Любой существующий компонент (например,

TButton или TListBox) или класс TCustomXXXX

(например, TCustomListBox)

Создать оконный компонент

TWinControl или TCustomControl

Создать графический компонент

TGraphicControl

Создать подкласс для элемента управления

Любой компонент Windows

Создать невизуальный компонент

TComponent

Можно также наследовать классы, которые не являются компонентами и не могут быть помещены на форму (например, TReglniFile и TFont). В этом случае вы должны добавить в класс свойства, позволяющие ему взаимодействовать со средой Delphi на этапе разработки программы, потому что только при этом условии вновь созданный класс будет компонентным классом.

Вообще, удачный выбор родительского класса в значительной степени упрощает проблему создания нового компонента. Помните замечательный девиз корпорации Borland: «Не нужно изобретать велосипед - просто наследуйте его!».

5.1.1. Изменение существующих компонентов

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

Пусть, например, создается простой компонент для отображения текущего системного времени. Для вывода текстовых сообщений хорошо подходит метка TLabel. Однако она имеет свойство Caption, которое для наших целей публиковать нельзя (это свойство в новом компоненте предназначено только для вывода системного времени). Выход из положения - наследовать новый компонент от класса TCustomLabel и оставить свойство Caption в секции protected (именно в этой секции свойство Caption объявляется в классе TCustomLabel). Тогда в самом компоненте можно обращаться к этому свойству, но ни в наследниках компонента, ни в работающей программе этого сделать нельзя. В листинге 5.1

показан модуль компонента FarClock (см. файл $ (Sou rce)\Ch 05\Fa rClock\FarClock. pas), который использует функциональность обычной метки, но не публикует многие ее свойства.

Листинг 5.1. Модуль компонента FarClock unit FarClock;

Простой компонент для отображения на форме системного времени. Он иллюстрирует два момента:

1) Сокрытие свойств, которые противоречат функциональности компонента.

2) Использование в компоненте уже существующего компонента. interface

uses

SysUtils, Classes, Controls, StdCtrls, ExtCtrls; type TFarClock = class(TCustomLabel) private { Private declarations } FTiraer: TTimer; protected { Protected declarations } procedure UpdateClock(Sender: TObject); public

{ Public declarations } constructor Create(AOwner: TComponent); override; published

{ Published declarations } property Align;
// property Caption;
He публикуем это свойство! // He публикуем также несколько других свойств // (AutoSize, Alignment, BiDiMode и т. п.), которые // не используются в новом компоненте. property Color;
property Font;
property ParentColor;
property ParentFont;
property ParentShowHint;
property PopupMenu;
property ShowHint;
property Transparent;
property Visible;
end;
procedure Register;

implementation

constructor TFarClock.Create(AOwner: TCoraponent);

{ В конструкторе создается вложенный компонент FTimer и инициируется его работа } begin inherited Create(AOwner); // Унаследованный конструктор

FTimer := TTimer.Create(Self); // Создаем таймер FTimer.OnTimer := UpdateClock; // Его обработчик OnTimer FTimer.Enabled := True // Запускаем таймер

end;

procedure TFarClock.UpdateClock(Sender: TObject); { Эта процедура - обработчик события OnTimer встроенного таймера. Обновляет отображение времени в компоненте } begin Caption :- TimeToStr(Time); // Изменяем надпись Invalidate; // Отрисовываем компонент

end;
procedure Register;
begin
RegisterComponents(' Far', [TFarClock]);
end;

end.

Вместе со свойством Caption не публикуются многие другие свойства стандартной метки, которые излишни в новом компоненте. Например, значение свойства AutoSize всегда предполагается равным True, поэтому не публикуются свойства Alignment, Height и Width.

Методика создания компонентов || Оглавление || 5.1.2. Создание оконных компонентов


Искусство создания компонентов Delphi



Новости за месяц

  • Июль
    2019
  • Пн
  • Вт
  • Ср
  • Чт
  • Пт
  • Сб
  • Вс