unit Unit2;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, Grids, StdCtrls, CheckLst, ComCtrls, Buttons;

const
   // буфер
   BufSize = 1024;

 type
  TForm1 = class(TForm)
    ListSpisok: TStringGrid;
    Btn_Add: TBitBtn;
    Btn_Del: TBitBtn;
    Btn_Edit: TBitBtn;
    StatusBar1: TStatusBar;
    procedure FormCreate(Sender: TObject);
    procedure Redraw; {перерисовка stringgrida}
    procedure Btn_AddClick(Sender: TObject); {добавить параметр}
    procedure Btn_DelClick(Sender: TObject);  {удалить параметр}
    procedure Btn_EditClick(Sender: TObject); {редактировать параметр}
  private
    { Private declarations }
  public
    { Public declarations }
  end;

 // Возврат кол-ва параметров
 function ParamCount : integer; stdcall;external 'test_dll.dll';
 // Возврат строкового представления параметра с индексом Index
 procedure GetParam ( Index : integer; ParamStr : PChar ); stdcall;external 'test_dll.dll';
 // Изменение строкового представления параметра с индексом Index
 procedure SetParam ( Index : integer; ParamStr : PChar );stdcall;external 'test_dll.dll';
 // Удаление параметра из списка
 procedure DelParam ( Index : integer ); stdcall;external 'test_dll.dll';
 // Добавление строкового представления в конец списка
 procedure AddParam ( ParamStr : PChar ); stdcall;external 'test_dll.dll';
 // Проверяет загружен ли файл для работы со списком
 function IsLoaded:boolean;stdcall;external 'test_dll.dll';

var
  Form1: TForm1;

implementation

{$R *.dfm}


procedure TForm1.FormCreate(Sender: TObject);
begin
 // если список создан
 if IsLoaded then
  begin
  // включаем кнопку add
   Btn_Add.Enabled:=true;
  end
  else
 // если  список почему- то не осздан, то завершаем работу
    begin
      ShowMessage('Ошибка в Test_DLL.dll,программа будет завершена!');
      Application.Terminate;
    end;
 // перерисовываем окно
 Redraw;
end;

// перерисовка окна, заполнение параметрами
procedure TForm1.Redraw;
 var i:integer;
 P:Pchar;
 s:string;
begin
 // начальная настройка таблицы
 ListSpisok.RowCount:=2;
 ListSpisok.FixedRows:=1;
 ListSpisok.Cells[0,0]:='N';
 ListSpisok.Cells[1,0]:='Значение';
 ListSpisok.Cells[0,1]:='';
 ListSpisok.Cells[1,1]:='';

 // цикл по всем параметрам
 for i:=0 to ParamCount-1 do
  begin
    // заносим номер строки
    ListSpisok.Cells[0,i+1]:=inttostr(i+1);
    // выделяем память под буфер
    GetMem(P, BufSize);
    // получаем текущий параметр
    GetParam(i,p);
    s:=p;
    // выводим его в таблицу
    ListSpisok.Cells[1,i+1]:=s;
    // освобождаем память
    FreeMem(P);
    // увеличиваем кол-во строк в таблице
    ListSpisok.RowCount:=ListSpisok.RowCount+1;
  end;
  // если больше 2х строк
  if ListSpisok.RowCount>2 then
  // то удаляем лишнию строку
     ListSpisok.RowCount:=ListSpisok.RowCount-1;
  // если параметров больше 0
  if ParamCount>0 then
     begin
       // то разблокируем кнопки ред/удал
       Btn_Del.Enabled:=true;
       Btn_Edit.Enabled:=true;
     end;
end;

procedure TForm1.Btn_AddClick(Sender: TObject);
var P:pchar;
    s:string;
begin
  // если введена строка
  if InputQuery('Добавление','Введите новый параметр:',s)
        then
   begin
    // то выделяем буфер
    GetMem(P, BufSize);
    // копируем в буфер параметр
    StrCopy(p,Pchar(s));
    // добавляем его
    AddParam(p);
   end;
  // обновляем таблицу
  Redraw;
end;

procedure TForm1.Btn_DelClick(Sender: TObject);
begin
 // если параметров 0, то выходим
 if ParamCount<1 then exit;
 // если пользователь хочет удалить
 if MessageDlg('Удалить текущую строчку?',mtWarning,[mbYes, mbNo],0)=mryes then
 // то удаляем текущий параметр
 DelParam(ListSpisok.Selection.Top-1);
 // обновляем таблицу
 ReDraw;
end;

procedure TForm1.Btn_EditClick(Sender: TObject);
var P:pchar;
    s:string;
begin
 // если параметров 0, то выходим
 if ParamCount<1 then exit;
 // выделяем буфер
 GetMem(P, BufSize);
 // получаем в буфер текущию строку
 GetParam(ListSpisok.Selection.Top-1,p);
 s:=p;
 // если пользователь её отредактировал
 if InputQuery( 'Добавление','Введите новый параметр:',s) then
   begin
    // то сохраняем
    StrCopy(p,Pchar(s));
    SetParam(ListSpisok.Selection.Top-1,p);
   end;
  // освобождаем буфер
  FreeMem(p);
  // обновляем окно
  Redraw;
end;

end.
