unit class_param;

interface

uses class_model;


{$REGION 'КЛАСС "ПАРАМЕТР"'}
type
  TRDParam = class (TObject)
    private
      name: string;
      description: string;
      index: integer;

    public
      models: TRDModel_List;

      function Get_param_name: string;
      function Get_param_description:string;
      function Get_param_index:integer;

      constructor Create ( in_param_name, in_param_desc: string; in_index: integer);
      destructor Destroy; override;
end;
{$ENDREGION}

{$REGION 'КЛАСС "Массив ПАРАМЕТРОВ"'}
type
  TRDparam_List = class (TObject)
    private
      params : array of TRDParam;
      function find_param_by_name( in_param_name: string ): TRDParam;
    public
      count:integer;
      function Add_param( in_param_name, in_param_desc: string ): TRDParam;
      function Delete_param( in_param:TRDParam ): boolean;

      function Get_param_by_name( in_name: string ): TRDParam;

      constructor Create; virtual;
      destructor Destroy; override;
end;
{$ENDREGION}

implementation
{$REGION 'КЛАСС "ПАРАМЕТР" РЕАЛИЗАЦИЯ'}
constructor TRDParam.Create( in_param_name, in_param_desc: string; in_index:integer );
begin
Assert( ( in_param_name <> '' ),
        'Входное поле ИМЯ ПАРАМЕТРА класса RDParam пустое!'+'{BC114396-B595-4724-A9F7-CD8141188280}');
  inherited Create;
  name := in_param_name;
  self.description := in_param_desc;
  self.index := in_index;

  self.models := TRDModel_List.Create;
end;

destructor TRDParam.Destroy;
begin
  self.name := '';
  self.description := '';
  self.index := -1;
  self.models.Free;
  inherited Destroy;
end;

function TRDParam.Get_Param_index:integer;
begin
Assert( ( self.index > -1 ),
        'Поле ИНДЕКС класса ПАРАМЕТРА вышло за пределы диапазона!'+'{EB959A51-A49D-4BFC-890D-E8B3B5771FF1}');
  result := self.index;
end;

function TRDParam.Get_Param_name: string;
begin
  Assert( ( self.name <> ''),
          'Поле ИМЯ ПАРАМЕТРА класса RDParam пустое!'+'{079AF181-468B-4D3D-B461-2DB577A365AD}');
    result := self.name;
end;

function TRDParam.Get_Param_description: string;
begin
    result := self.description;
end;
{$ENDREGION}







{$REGION 'КЛАСС "Массив ПАРАМЕТРОВ" РЕАЛИЗАЦИЯ'}
constructor TRDParam_List.Create;
begin
  inherited;
  SetLength( Params, 0 );
  count := 0;
end;
destructor TRDParam_List.Destroy;
var
  i: Integer;
begin
  inherited;
  if ( length( Params ) > 0 ) then
  begin
    for i := 0 to length( Params ) - 1 do
    begin
      Params[ i ].Free;
    end;
  end;
end;

function TRDParam_List.find_Param_by_name( in_param_name: string ): TRDParam;
var i: integer;
begin
result := nil;
if ( in_param_name <> '' ) then
  begin
    for i := 0 to length( self.Params ) - 1 do
    begin
      if ( self.Params[ i ].name = in_param_name ) then
      begin
        result := self.Params[ i ];
      end;
    end;
  end;
end;

function TRDParam_List.Add_Param(in_Param_name, in_Param_desc:string): TRDParam;
var Params_amount, current_Param_number:integer;
begin
Assert( ( in_Param_name <> '' ),'Входное поле ИМЯ ПАРАМЕТРА класса RDParam пустое!'+'{3DC96941-9446-4487-A9E0-DC6F6DFD6910}');
  if Get_param_by_name( in_Param_name ) = nil then
  begin
    //получаем номер для вставки
    Params_amount := length( self.Params );
    SetLength( self.Params, Params_amount + 1 );
    //позиция параметра в массиве
    current_Param_number := Params_amount;
    try
      self.Params[ current_Param_number ]:=TRDParam.Create( in_Param_name, in_Param_desc, current_Param_number );
      result := self.Params[ current_Param_number ];
    finally
      inc(count);
    end;
  end
  else
  begin
    //Обработка ошибки уже существующего параметра
    result:=nil;//showmessage( 'Параметр уже существует' );
  end;
end;

function TRDParam_List.Delete_Param( in_param: TRDParam ): boolean;
var current_index: integer;
    i: integer;
begin
   current_index := in_Param.Get_param_index;
   try
      in_param.Free;
   finally
     dec(count);
     //если удаляется не конечный элемент
     if current_index < length( self.Params ) - 1 then
     begin
        //сдвигаем все модели вниз на 1
        for i := current_index to length( self.Params ) - 1 do
        begin
          self.Params[ i ] := self.Params[ i+1 ];
        end;
        SetLength( self.Params, length( self.Params ) - 1);
        result := true;
       end
     else
     begin
        SetLength( self.Params, length( self.Params ) - 1);
        result := true;
     end;
   end;
end;

function TRDParam_List.Get_Param_by_name( in_name:string ): TRDParam;
begin
  result := find_Param_by_name( in_name );
end;


{$ENDREGION}
end.
