Пусть у нас имеется три однотипных агрегата, каждый агрегат связан с переменной, которая отвечает за пуск/стоп агрегата, также он имеет имя и методы для остановки и пуска. Остановка и пуск агрегата должны сопровождаться выводом соответствующих сообщений. Для решения этих задач мы можем создать один отдельный класс, реализовать в нем методы пуск/стоп и использовать их. Ниже пример глобального модуля с комментариями:
Важно! Обязательно освобождайте объект через FreeAndNil после того, как работа с ним завершена, чтобы не получить утечку памяти. Например: FreeAndNil(Aggregate1);
interface
type
TAggregate = class // класс
private
FName: string; // имя агрегата
FVariable: TM_Variable; // переменная агрегата
public
// это конструктор класса
constructor Create(const AName: string; AVar: TM_Variable);
// эти методы отвечают за пуск / стоп агрегата
procedure Start;
procedure Stop;
// имя и переменная агрегата доступны извне только для чтения
property Name: string read FName;
property Variable: TM_Variable read FVariable;
end;
var
// объявляем сами агрегаты, допустим их всего три
Aggregate1: TAggregate;
Aggregate2: TAggregate;
Aggregate3: TAggregate;
implementation
constructor TAggregate.Create(const AName: string; AVar: TM_Variable);
begin
// в конструкторе агрегат получает имя и переменную
FName := AName;
FVariable := AVar;
end;
procedure TAggregate.Start;
begin
FVariable.Value := 1; // запускаем агрегат
AddMessage(Now, mkMessage, 'Агрегат "' + FName + '" запущен!', True, False);
end;
procedure TAggregate.Stop;
begin
FVariable.Value := 0; // останавливаем агрегат
AddMessage(Now, mkMessage, 'Агрегат "' + FName + '" остановлен!', True, False);
end;
// это секция инициализации, она выполняется один раз, при старте проекта
initialization
// создаём агрегаты
Aggregate1 := TAggregate.Create('Транспортер', vrAggr1);
Aggregate2 := TAggregate.Create('Мешалка', vrAggr2);
Aggregate3 := TAggregate.Create('Насос', vrAggr3);
// это секция финализации, она выполняется один раз, при остановке проекта
finalization
// !!! Обязательно очищаем созданные объекты! Иначе получим утечку памяти!
FreeAndNil(Aggregate1);
FreeAndNil(Aggregate2);
FreeAndNil(Aggregate3);
end.
Агрегаты описаны и созданы, за создание отвечает конструктор Create, в котором агрегату назначается имя и переменная пуск / стоп. Теперь мы можем из любого скрипта управлять агрегатом, например запустить его:
begin
Aggregate1.Start;
end.