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.