Проиллюстрируем основные особенности создания компонентов в Delphi 8 на примере компонента FarWatchClock, описанного в главе 6. Напомню, что этот компонент представляет собой специализированную метку, встроенный таймер которой отслеживает текущее системное время. В момент, когда текущее время становится равным заданному в свойстве WatchTime, возникает событие OnWatchTime. *

Для создания модуля компонента выберите команду Component ► New VCL Component. Появившееся окно New Component ничем не отличается от аналогичных окон других версий (рис. 13.1).

13.2. Пример создания компонента

Рис. 13.1. Окно New Component

Замечу, что в Delphi 8 в качестве родительского типа нельзя выбрать тип TCustomLabel (как и любой другой тип TCustomXXXX - таких типов нет в пространствах имен Bor land. VCL.XXXX). С другой стороны, в отличие от версий 6 и 7, недоступны компоненты библиотеки CLX, что и ожидалось: корпорация Borland официально подтвердила, что впредь не будет поддерживать CLX, так как возможности .NET Framework обеспечивают свободный обмен программами между любыми платформами (не только Windows/Linux). Заполните поля диалогового окна так, как показано на рис. 13.1, и щелкните на кнопке ОК.

Вид заготовки модуля в окне редактора кода показан на рис. 13.2. Заметьте, что в предложении uses перечисляются как внешние модули, так и пространства имен. При вставке новых ссылок в это предложение с помощью справочной службы требуется обязательно проверять принадлежность тех или иных типов нужным пространствам имен.

13.2. Пример создания компонента

В окне появились также некоторые заимствования из среды Visual Studio корпорации Microsoft, в частности, нумерация строк кода и возможность свертывания участков программы. Последнее особенно важно при создании громоздких модулей. Среда Delphi автоматически вставляет кнопки свертывания-развертывания в те участки кода, которые представляют собой вполне законченные фрагменты программы - объявления классов, описания методов, разделы interface и implementation модулей. В Delphi 8 предусмотрены директивы компилятора {#REGION 'Комментарий1 } и {#ENDREGION}, с помощью которых можно структурировать код вручную.

Вставим закрытое поле FTimer:

TFarWatchClock = class(TLabel) private { Private declarations } FTimer: TTimer;
end;

Если теперь попытаться откомпилировать модуль, среда сообщит о неизвестном типе TTimer. Щелкните на объявлении типа и нажмите клавишу F1 - среда покажет справку, из которой следует, что тип TTimer принадлежит пространству имен Borland. VCL. ExtCtrIs. Добавьте ссылку на это пространство имен в предложение uses. Теперь компиляция пройдет без ошибок.

ПРИМЕЧАНИЕ -

Модуль компонента может компилироваться только в двух случаях: когда он является частью проекта или когда он вставлен в пакет. Создайте новый проект VCL Forms Application и добавьте к нему модуль компонента.

В листинге 13.1 представлен полный текст модуля.

Листинг 13.1. Текст модуля компонента FarWatchClock unit FarWatchClock;

Этот модуль содержит вариант компонента FarWatchClock для версии Delphi 8.0 for .NET Framework. Обратите внимание на использование пространств имен Borland. VCL.XXXX в предложении uses.

interface

uses

SysUtils, Classes, System.ComponentModel, Borland.Vcl.Controls, Borland.Vcl.StdCtrls, Borland.Vcl.ExtCtrls, Borland.Vcl.DateUtils;
type TWatchView « (wvClock, wvlnterval, wvClocklnterval, wvIntClock, wvClocklntClock);
TFarWatchClock = class(TLabel) private { Private declarations } FTimer: TTimer;
FWatchTime: TDateTime;
FInterval: Integer;
FWatchView: TWatchView;
FOnWatchTime: TNotifyEvent;
protected
{ Protected declarations } procedure Timer(Sender: TObject);

procedure Setlnterval(const Value: Integer); procedure SetWatchView(const Value: TWatchView); procedure SetWatchTime(const Value: TDateTime); procedure Paint; override; public

constructor Create(AOwner: TComponent); override; property Caption; // Убираем свойство из окна // Инспектора объектов

published

{ Published declarations } property WatchTime: TDateTime read FWatchTime

write SetWatchTime; property Interval: Integer read FInterval

write Setlnterval; property WatchView: TWatchView read FWatchView

write SetWatchView; property OnWatchTime: TNotifyEvent read FOnWatchTime

write FOnWatchTime;
end;

procedure Registers-implementation

procedure Register;
begin
RegisterComponents(1 Far1, [TFarWatchClock]);
end;

{ TFarWatchClock } .*

constructor TFarWatchClock.Create(AOwner: TComponent); // Перекрывает унаследованный конструктор // для инициализации таймера begin
inherited;
FTimer := TTimer.Create(Self);
FTimer.OnTimer := Timer;
FTimer.Interval := 1000; FTimer .Enabled :== True;
Caption := TimeToStr(Time) end;
procedure TFarWatchClock.Paint;
// Формирует текст в зависимости от значения свойства WatchView продолжение х*>
Листинг 13.1 (продолжение)
begin
inherited;
S := TimeToStr(Time);
if FWatchTime <> 0 then // Установлено ожидаемое время? case WatchView of // -Да. Учитываем WatchView wvlnterval: S := Format(1%Sc1, [FloatToStrF(FInterval, ffNumber, 15, 0)]); wvClocklnterval: S := Format(1%S %Sc', [S, FloatToStrF(FInterval, ffNumber, 15, 0) ] ) ; wvIntClock: S := TimeToStr(FWatchTime - Time); wvClocklntClock: S := Format(!%S %S', [S, TimeToStr(FWatchTime - Time)]);
end;
Caption := S end;
procedure TFarWatchClock.Setlnterval(const Value: Integer);
begin
FInterval :^ Value;

if Value = 0 then WatchTime := 0

else
WatchTime := Time + Value / (24 * 3600)
end;
procedure TFarWatchClock.SetWatchView(const Value: TWatchView);
begin
if FWatchView <>
Value then begin
FWatchView := Value;
Invalidate end end;
procedure SetWatchTime(const Value: TDateTime);
begin
if Value <>
FWatchTime then begin
FWatchTime := Value;
Invalidate end end;
procedure TFarWatchClock.Timer(Sender: TObject);
begin
if FInterval > 0 then
dec(FInterval);
Invalidate;
if SecondsBetween(Time, FWatchTime) = 0 then begin
if Assigned(FOnWatchTime) then
FOnWatchTime(Self);
Interval := 0 end end;

end.

Помимо отличия в предложении uses, текст модуля практически идентичен тексту из главы 6 (см. листинг 6.2). Укажу лишь, что так как мы вынуждены наследовать от TLabel, а не TCustomLabel, то не можем сделать недоступным свойство Caption, но можем убрать его из окна Инспектора объектов. Для этого свойство переопределяется в секции public.

13.1. Пространства имен Borland.VCL.XXXX || Оглавление || 13.3. Установка компонентов


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



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

  • Апрель
    2020
  • Пн
  • Вт
  • Ср
  • Чт
  • Пт
  • Сб
  • Вс
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31