Судьба заставила вспомнить программирование(хотя я его особо и не знаю).
В конце программы я пытаюсь освободить память выделенную под массив элементов типа класс который написал сам.
В коде все видно что и как я делаю. Я решил немного поиграться с классом перед написанием кода и сразу получил проблему по нажатии кнопки меню выход пишу Item[i].Free; и все падает. Промежуточный код может показаться непонятным я просто вспоминаю как работать с файлом. Главный вопрос про высвобождение памяти.
Поясните что не так. У меня в распоряжении пару учебников с интернета и в них пишут как сделать вроде повторяю и ловлю ошибку. Я обновил Лазарус до новой версии(старая была 6 летней давности).
Вот код:
- Код: Выделить всё
- unit Unit1;
 {$mode objfpc}{$H+}
 interface
 uses
 Classes, SysUtils, Forms, Controls, Graphics, Dialogs, Menus, ComCtrls,
 Buttons, PairSplitter, EditBtn, ExtCtrls, StdCtrls;
 type
 TItems = class
 art: Word;
 Name: String[128];
 end;
 { TForm1 }
 TForm1 = class(TForm)
 BitBtn1: TBitBtn;
 BitBtn2: TBitBtn;
 BitBtn3: TBitBtn;
 BitBtn4: TBitBtn;
 Edit1: TEdit;
 Edit2: TEdit;
 Edit3: TEdit;
 Edit4: TEdit;
 GroupBox1: TGroupBox;
 Label1: TLabel;
 Label2: TLabel;
 Label3: TLabel;
 Label4: TLabel;
 ListBox1: TListBox;
 MainMenu1: TMainMenu;
 MenuItem1: TMenuItem;
 MenuItem2: TMenuItem;
 PairSplitter1: TPairSplitter;
 PairSplitterSide1: TPairSplitterSide;
 PairSplitterSide2: TPairSplitterSide;
 StatusBar1: TStatusBar;
 procedure BitBtn4Click(Sender: TObject);
 procedure FormCreate(Sender: TObject);
 procedure MenuItem2Click(Sender: TObject);
 private
 public
 end;
 var
 Form1: TForm1;
 Item: array [1..256] of TItems;
 i: word;
 information: file of TItems;
 implementation
 {$R *.lfm}
 { TForm1 }
 procedure TForm1.MenuItem2Click(Sender: TObject);
 begin
 For i:=1 to 256 do Item[i].Free;
 Close;
 end;
 procedure TForm1.FormCreate(Sender: TObject);
 begin
 For i:=1 to 256 do
 Begin
 Item[i]:=TItems.Create;
 Item[i].art:=0;
 end;
 Item[1].art:=1;
 Item[1].Name:='Колесо';
 Item[2].art:=2;
 Item[2].Name:='Колесо с тормозом';
 Item[3].art:=3;
 Item[3].Name:='Тест';
 AssignFile(Information,'Information.dat');
 if FileExists('Information.dat')=true then Reset(Information) else Rewrite(Information);
 Write(Information,Item[1],Item[2],Item[3]);
 CloseFile(Information);
 end;
 procedure TForm1.BitBtn4Click(Sender: TObject);
 begin
 If Edit4.Caption='1' then
 Begin
 Reset(Information);
 Read(Information,Item[4]);
 CloseFile(Information);
 Edit1.Caption:=IntToStr(Item[4].art);
 Edit2.Caption:=Item[4].Name;
 end;
 If Edit4.Caption='22' then
 Begin
 Reset(Information);
 Read(Information,Item[4],Item[5],Item[6]);
 CloseFile(Information);
 Edit1.Caption:=IntToStr(Item[6].art);
 Edit2.Caption:=Item[6].Name;
 end;
 end;
 end.




