unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;

type
  TForm1 = class(TForm)
    GroupBox2: TGroupBox;
    Button1: TButton;
    Button2: TButton;
    Button3: TButton;
    Button4: TButton;
    GroupBox1: TGroupBox;
    Label1: TLabel;
    Edit1: TEdit;
    Label2: TLabel;
    Edit2: TEdit;
    Label3: TLabel;
    Label4: TLabel;
    Edit3: TEdit;
    Edit4: TEdit;
    GroupBox3: TGroupBox;
    Label5: TLabel;
    Label6: TLabel;
    Label7: TLabel;
    Label8: TLabel;
    Label9: TLabel;
    Label10: TLabel;
    Label11: TLabel;
    Label12: TLabel;
    GroupBox4: TGroupBox;
    Label13: TLabel;
    Edit5: TEdit;
    Edit6: TEdit;
    procedure FormCreate(Sender: TObject);
    procedure Button1Click(Sender: TObject);
    procedure Button3Click(Sender: TObject);
    procedure Button4Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;


var
  Form1: TForm1;

implementation

{$R *.dfm}

type
  myRec = record
    shifr: string[5];
    naim: string[10];
    cena: string[2];
    ves: string[3];
  end;
  PItem = ^TItem;       // Описание указателя на элемент
  TItem = record        // Описание элемента
    data: myRec;
    prev, next: PItem;
  end;

type
  tlist = record
    head, tail: PItem;
  end;

var
  Lst: tlist;

function create_data(const sShifr, sNaim, sCena, sVes: string): myRec;
begin
  with result do begin
    shifr := sShifr;
    naim := sNaim;
    cena := sCena;
    ves := sVes;
  end;
end;

procedure list_init(var L: TList);
begin
  L.head := nil; L.tail := nil;
end;

procedure list_add(var L: TList; const R: myRec);
var p: PItem;
begin
  new(p);
  p^.data := R;
  p^.prev := L.tail; p^.next := nil;

  if L.head = nil then L.head := p
  else L.tail^.next := p;

  L.tail := p;
end;

function list_findByIndex(var L: TList; i: integer): PItem;
var
  p: PItem;
  current: integer;
begin
  current := 0;
  p := L.head;
  while (p <> nil) and (current < i) do begin
    inc(current); p := p^.next;
  end;

  result := p;
end;

// сюда передается адрес элемента, который надо удалить
procedure list_remove_item(var L: TList; p: PItem);
var r: PItem;
begin
  if p = nil then exit;

  r := p^.prev;
  if r <> nil then r^.next := p^.next
  else L.head := p^.next;

  r := p^.next;
  if r <> nil then r^.prev := p^.prev
  else L.tail := p^.prev;

  dispose(p);
end;



procedure TForm1.FormCreate(Sender: TObject);
begin
  list_init(Lst);
end;

//добавление
procedure TForm1.Button1Click(Sender: TObject);
begin
  list_add(Lst, create_data(Edit1.Text, Edit2.Text, Edit3.Text, Edit4.Text));
end;

//просмотр
procedure TForm1.Button3Click(Sender: TObject);
var p: PItem;
begin
  p := Lst.head;
  // P:=Head;
  Label9.Caption:='';   Label10.Caption:='';
  Label11.Caption:='';   Label12.Caption:='';
  while p <> nil do
    with p^.data do begin
      Label9.Caption:=Label9.Caption+chr(13) + shifr;
      Label10.Caption:=Label10.Caption+chr(13) + naim;
      Label11.Caption:=Label11.Caption+chr(13) + cena;
      Label12.Caption:=Label12.Caption+chr(13) + ves;
      p := p^.next;
 End;
end;

procedure TForm1.Button4Click(Sender: TObject);
begin
Close;
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
  list_remove_item(
    Lst, list_findByIndex(Lst, StrToInt(Edit5.Text) - 1)
  );
end;

end.