unit Unit1;

interface

uses
  SysUtils,
  Classes,
  dialogs;


var
 fFileName:string; // имя файла с параметрами
 spisok:tstrings; // список
 s:string ;
 P:pchar;

 // Сохраняет в файл с заданным именем и выгружает список
 function Unload:byte; stdcall;

 // Загружает из файла с заданным именем и создаёт список
 function Load:byte; stdcall;

 // Проверяет загружен ли файл для работы со списком
 function IsLoaded:boolean;stdcall;

 // Удаление параметра из списка
 procedure DelParam ( Index : integer ); stdcall;

 // Добавление строкового представления в конец списка
 procedure AddParam ( ParamStr : PChar ); stdcall;

 // Изменение строкового представления параметра с индексом Index
 procedure SetParam ( Index : integer; ParamStr : PChar );stdcall;

 // Возврат кол-ва параметров
  function ParamCount : integer; stdcall;

 // Возврат строкового представления параметра с индексом Index
 procedure GetParam ( Index : integer; ParamStr : PChar ); stdcall;

 implementation

 //////////////////////////////////////////////////////////
 // Возврат кол-ва параметров
 //////////////////////////////////////////////////////////
 function ParamCount : integer; stdcall;
  begin
   // если списка нет, то выходим
   if spisok=nil then
    begin
     ShowMessage('Список не создан(ParamCount)');
     ParamCount:=0;
     exit;
    end;

   // кол-во параметров
   result:=spisok.Count;
  end;

 //////////////////////////////////////////////////////////
 // Возврат строкового представления параметра с индексом Index
 //////////////////////////////////////////////////////////
 procedure GetParam ( Index : integer; ParamStr : PChar ); stdcall;
  begin
   // если списка нет, то выходим
   if spisok=nil then
    begin
     ShowMessage('Список не создан(GetParam)');
     exit;
    end;
   // если индекс не выходит за границы, то возвращаем значение
   if (Index>-1) and (Index<spisok.Count) then StrCopy(ParamStr,PChar(spisok.Strings[Index]))
    else  ShowMessage('Недопустимый индекс(GetParam):'+inttostr(Index));

  end;

 //////////////////////////////////////////////////////////
 // Изменение строкового представления параметра с индексом Index
 //////////////////////////////////////////////////////////
 procedure SetParam ( Index : integer; ParamStr : PChar );stdcall;
  begin
   // если списка нет, то выходим
   if spisok=nil then
    begin
      ShowMessage('Список не создан(SetParam)');
      exit;
    end;

   // если индекс не выходит за границы, то присваиваем значение
   if (Index>-1) and (Index<spisok.Count) then
         spisok.Strings[Index]:=ParamStr
        else ShowMessage('Недопустимый индекс(SetParam):'+inttostr(Index));
  end;

 //////////////////////////////////////////////////////////
 // Добавление строкового представления в конец списка
 //////////////////////////////////////////////////////////
 procedure AddParam ( ParamStr : PChar ); stdcall;
 var
     s:string;
  begin
   // если списка нет, то выходим
   if spisok=nil then
    begin
     ShowMessage('Список не создан(AddParam)');
     exit;
    end;
    S:=ParamStr;
    // добавляем
    spisok.Add(s);
  end;

 //////////////////////////////////////////////////////////
 // Удаление параметра из списка
 //////////////////////////////////////////////////////////
 procedure DelParam ( Index : integer ); stdcall;
  begin
   // если списка нет, то выходим
   if spisok=nil then
    begin
     ShowMessage('Список не создан (Del)');
     exit;
    end;
   // если индекс не выходит за границы, то удаляем
   if (Index>-1) and (Index<spisok.Count) then spisok.Delete(Index)
        else ShowMessage('Недопустимый индекс(Del):'+inttostr(Index));
  end;


 //////////////////////////////////////////////////////////
 // Сохраняет в файл с заданным именем и выгружает список
 //////////////////////////////////////////////////////////
 function Unload:byte; stdcall;
  begin
  result:=0;
   // если списка нет, то выходим
   if spisok=nil then
    begin
     ShowMessage('Список не создан (UnLoad)');
     result:=1;
     exit;
    end;



   try
   // если список существует, то сохраняем его
   if spisok<>nil then
      begin
         spisok.SaveToFile(fFileName);
         //  и уничтожаем
         spisok.Free;
       end;
  // обрабатваем ошибки
  except
   on  e:Exception do
      begin
      ShowMessage('Произошел сбой в работе(UnLoad):'+e.message);
      end;
      end;
  end;


 //////////////////////////////////////////////////////////
 // Загружает из файла с заданным именем и создаёт список
 //////////////////////////////////////////////////////////
 function Load:byte; stdcall;
  begin
  // по умолчанию возвращаемый рез-т - 0, всё ок
  result:=0;
   // если список существует

   // если список есть, то выходим
   if spisok<>nil then
    begin
     ShowMessage('Список уже создан (Load)');
     exit;
    end;

   try
   // создаем список
   spisok:=TStringList.Create;
   // если файл существует, то загружаем его
   if FileExists(fFileName) then spisok.LoadFromFile(fFileName)
      else
       // код ошибки - 1, файл не найден
       result:=1;
  // если произошел непредвиденный сбой
  except
   on  e:Exception do
      begin
      // результат 3 - список не создан
      result:=3;
      ShowMessage('Произошел сбой в работе(Load):'+e.message);
      end;
      end;
  end;


 //////////////////////////////////////////////////////////
 // Проверяет загружен ли файл для работы со списком
 //////////////////////////////////////////////////////////
 function IsLoaded:boolean;stdcall;
  begin
   // если список существует, то true - загружен список
   if spisok=nil then result:=false else result:=true;
  end;

initialization
 // начальная инициализация
 spisok:=nil;
 // имя файла
 fFileName:='Base.dat';
try
 // загружаем, если файла нет, то выдаем сообщение
 if Load=1 then ShowMessage('Файл списка отсутствует, будет создан заново');
 // обрабатываем ошибки
except
   on e:exception do showmessage('Произошла ошибка:'+e.Message);
end;

finalization

try
 // при выгрузке dll сохраняем параметры
 if UNLoad=1 then ShowMessage('Ошибка сохранения');
 // обрабатываем ошибки
except
   on e:exception do showmessage('Произошла ошибка:'+e.Message);
end;

end.
