Написание своих компонентов для Delphi. Часть 2. Написание не визуального компонента с нуля

В первой части было рассмотрено создание собственных компонентов на основе уже существующих. Однако это оправданно далеко не всегда. Нередко возникает необходимость реализации функционала, который в принципе отсутствует в уже имеющихся библиотеках.

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

Рассмотрим пример создания «с нуля» не визуального компонента.

Создание каркаса компонента

В качестве примера разработаем не визуальный компонент, который будет создавать файл журнала (.log) и сохранять в нём различные записи.

При создании каркаса для компонента, разрабатываемого» с нуля в качестве базового должен быть выбран класс TComponent.

В остальном процесс создания каркаса компонента ничем не отличается от того что было рассмотрено в первой части.

Ниже приведён готовый каркас не визуального компонента создаваемого «с нуля».

unit Logger;
interface
uses
  System.SysUtils, System.Classes;
type
  TLogger = class(TComponent)
  private
    { Private declarations }
  protected
    { Protected declarations }
  public
    { Public declarations }
  published
    { Published declarations }
  end;
procedure Register;
implementation
procedure Register;
begin
  RegisterComponents('Samples', [TLogger]);
end;
end.

Разработка функционала компонента

Объявим следующие члены класса компонента:

Закрытые:

  • Поле fFilePath – (строка) для хранения пути к файлу;
  • Процедура WriteInFile – реализует непосредственно механизм записи в файл журнала. Принимает единственный параметр – строку с текстом записи журнала.

Открытые:

  • Свойство FilePath – для доступа к полю fFilePath;
  • Процедура WriteLog – для записи в файл журнала.

Теперь класс компонента выглядит следующим образом.

type
  TLogger = class(TComponent)
  private
    fFilePath: string;
    procedure WriteInFile(LogRec: string);
  public
    procedure WriteLog(LogRec: string);
  published
    property FilePath: string read fFilePath write fFilePath;
end;

Члены класса, объявленные в секции published доступны для «визуального» редактирования в ObjectInspector. Именно поэтому свойство FilePathобъявлено именно в ней.

Процедура WriteInFile представляет собой обычный алгоритм записи строк в текстовый файл, но с учётом указания пути к файлу журнала (предусмотрено поведение по умолчанию).

procedure TLogger.WriteInFile(LogRec: string);
var
  FileName, Path, Rec: string;
  LogFile: TextFile;
begin
  // Проверяем на заполнение поля с путём к файлу журнала
  if fFilePath <> '' then
    FileName := fFilePath
  else
  begin
    GetDir(0, Path);
    FileName := Path + '\logfile.log';
  end;
  AssignFile(LogFile, FileName);
  // Проверяем существование файла журнала
  if not FileExists(FileName) then
    Rewrite(LogFile)
  else
    Append(LogFile);
  // Формируем запись и сохраняем в файл журнала
  Rec := Format('%s %s', [DateTimeToStr(Now), LogRec]);
  WriteLn(LogFile, Rec);
  CloseFile(LogFile);
end;

Открытая процедура WriteLog всего лишь вызывает вышеприведённую процедуру.

procedure TLogger.WriteLog(LogRec: string);
begin
  WriteInFile(LogRec);
end;

С первого взгляда это может показаться совершенно бесполезной конструкцией. Но на самом деле подобное решение имеет смысл. Оно преследует две цели:

  1. Соблюдение принципа инкапсуляции;
  2. Возможность в будущем организовать обработку событий (об этом речь пойдёт в отдельной статье).

После написания всех процедур компонент готов. Его можно установить в Delphi или использовать без установки создавая его динамически.

Другие статьи из этого цикла:
  • Часть 1. Расширение уже имеющихся компонентов
  • Часть 3. Создание собственных событий
Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *