unit class_model;

interface

uses class_source, class_basics, Contnrs;

{$REGION 'КЛАСС "МОДЕЛЬ"'}
type
  TRDModel = class (TRD_Something)
    private

    public
      sources: TRDSource;

      constructor Create ( in_model_name, in_model_desc:string; in_index:integer); virtual;
      destructor Destroy; override;
end;
{$ENDREGION}

{$REGION 'КЛАСС "Массив МОДЕЛЕЙ"'}
type
  TRDModel_List = class (TRD_List)
    private

    public

end;
{$ENDREGION}

implementation
{$REGION 'КЛАСС "МОДЕЛЬ" РЕАЛИЗАЦИЯ'}
constructor TRDModel.Create ( in_model_name, in_model_desc: string; in_index: integer );
begin
Assert( ( in_model_name <> '' ),
        'Входное поле ИМЯ МОДЕЛИ класса RDMODEL пустое!'+'{BC114396-B595-4724-A9F7-CD8141188280}');
  inherited Create(in_model_name, in_model_desc);
  self.sources := TRDSource.Create;
end;

destructor TRDModel.Destroy;
begin
  self.sources.Free;
  inherited Destroy;
end;

{$ENDREGION}

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

function TRDModel_List.find_model_by_name( in_model_name: string): TRDModel;
var i: integer;
begin
result := nil;
if ( in_model_name <> '' ) then
  begin
    for i := 0 to length( self.models ) - 1 do
    begin
      if ( self.models[ i ].name = in_model_name ) then
      begin
        result := self.models[ i ];
      end;
    end;
  end;
end;

function TRDModel_List.Add_model( in_model_name, in_model_desc: string ): TRDModel;
var models_amount,
    current_model_number:integer;
begin
Assert( ( in_model_name <> '' ),
        'Входное поле ИМЯ МОДЕЛИ класса RDMODEL пустое!'+'{3DC96941-9446-4487-A9E0-DC6F6DFD6910}');
  if Get_model_by_name( in_model_name ) = nil then
  begin
    //получаем номер для вставки
    models_amount := length( self.models );
    SetLength( self.models, models_amount + 1 );
    //позиция можели в массиве
    current_model_number := models_amount;
    try
      self.Models[ current_Model_number ] := TRDModel.Create( in_model_name, in_model_desc, current_Model_number );
      result := self.Models[ current_Model_number ];
    finally
      inc( count );
    end;
  end
  else
  begin
    //Обработка ошибки уже существующей модели
    result:=nil;//showmessage( 'Модель уже существует' );
  end;
end;

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

function TRDModel_List.Get_model_by_name( in_name: string ): TRDModel;
begin
  result := find_model_by_name( in_name );
end;


{$ENDREGION}
end.
