В первой части было рассмотрено создание собственных компонентов на основе уже существующих. Однако это оправданно далеко не всегда. Нередко возникает необходимость реализации функционала, который в принципе отсутствует в уже имеющихся библиотеках.
В подобных случаях лучшее решение – разработать «с нуля» собственный компонент, который будет содержать только необходимое, без посторонних функций, которые в силу специфики его назначения, скорее всего не будут использованы.
Рассмотрим пример создания «с нуля» не визуального компонента.
Создание каркаса компонента
В качестве примера разработаем не визуальный компонент, который будет создавать файл журнала (.log) и сохранять в нём различные записи.
При создании каркаса для компонента, разрабатываемого» с нуля в качестве базового должен быть выбран класс TComponent.
В остальном процесс создания каркаса компонента ничем не отличается от того что было рассмотрено в первой части.
Ниже приведён готовый каркас не визуального компонента создаваемого «с нуля».
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
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 – для записи в файл журнала.
Теперь класс компонента выглядит следующим образом.
1 2 3 4 5 6 7 8 9 10 |
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 представляет собой обычный алгоритм записи строк в текстовый файл, но с учётом указания пути к файлу журнала (предусмотрено поведение по умолчанию).
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
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 всего лишь вызывает вышеприведённую процедуру.
1 2 3 4 |
procedure TLogger.WriteLog(LogRec: string); begin WriteInFile(LogRec); end; |
С первого взгляда это может показаться совершенно бесполезной конструкцией. Но на самом деле подобное решение имеет смысл. Оно преследует две цели:
- Соблюдение принципа инкапсуляции;
- Возможность в будущем организовать обработку событий (об этом речь пойдёт в отдельной статье).
После написания всех процедур компонент готов. Его можно установить в Delphi или использовать без установки создавая его динамически.
Другие статьи из этого цикла:
- Часть 1. Расширение уже имеющихся компонентов
- Часть 3. Создание собственных событий
Добавить комментарий