Witam! Robię projekt do szkoły małą bazę danych, z wykorzystaniem listy jednokierunkowej. Próbuję wykorzystać do tego plik typowany.
Stworzyłem do tej pory coś takiego:
Unit1.
unit Unit1;
interface
uses
Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls, Vcl.ExtCtrls, Vcl.Buttons, Unit2;
type
TForm1 = class(TForm)
StaticText1: TStaticText;
StaticText2: TStaticText;
StaticText3: TStaticText;
StaticText4: TStaticText;
StaticText5: TStaticText;
StaticText6: TStaticText;
Bevel1: TBevel;
ListBox1: TListBox;
ListBox2: TListBox;
ListBox3: TListBox;
ListBox4: TListBox;
ListBox5: TListBox;
ListBox6: TListBox;
GroupBox1: TGroupBox;
BitBtn1: TBitBtn;
BitBtn2: TBitBtn;
BitBtn3: TBitBtn;
BitBtn4: TBitBtn;
BitBtn5: TBitBtn;
BitBtn6: TBitBtn;
procedure BitBtn5Click(Sender: TObject);
procedure BitBtn6Click(Sender: TObject);
procedure BitBtn1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
Wskaznik = ^Baza;
Baza = record
Lp : String[10];
Imie : String[30];
Nazwisko: String[30];
Telefon : String[30];
Adres : String[30];
Nastepny: Wskaznik;
end;
Plik_Bazodanowy = File of Baza;
var
Form1: TForm1;
Plik_Bazy: Plik_Bazodanowy;
Pierwszy : Wskaznik;
Ostatni : Wskaznik;
Nowy : Wskaznik;
db : Baza;
i : Integer;
implementation
{$R *.dfm}
procedure TForm1.BitBtn1Click(Sender: TObject);
begin
Form2.ShowModal;
end;
procedure TForm1.BitBtn5Click(Sender: TObject);
begin
Pierwszy := Nil;
Ostatni := Nil;
AssignFile(Plik_Bazy,'Plik_do_bazy.txt');
if Not FileExists('Plik_do_bazy.txt') then
begin
ReWrite(Plik_Bazy)
end
else begin
ReSet(Plik_Bazy);
end;
CloseFile(Plik_Bazy);
end;
procedure TForm1.BitBtn6Click(Sender: TObject);
begin
close;
end;
begin
AssignFile(Plik_Bazy,'Plik_do_bazy.txt');
if Not FileExists('Plik_do_bazy.txt') then
begin
ReWrite(Plik_Bazy)
end
else begin
ReSet(Plik_Bazy);
for i := 0 to FileSize(Plik_Bazy)-1 do
begin
New(Nowy);
Read(Plik_Bazy, Nowy^);
if Pierwszy = nil then
begin
Pierwszy:=Nowy;
Ostatni :=Pierwszy;
end;
Ostatni^.Nastepny := Nowy;
Ostatni:= Nowy;
end;
Nowy := Pierwszy;
while Nowy <> nil do
begin
form1.Listbox1.Items.Add(Nowy^.Lp);
form1.Listbox2.Items.add(Nowy^.Imie);
form1.Listbox3.Items.Add(Nowy^.Nazwisko);
form1.Listbox4.Items.add(Nowy^.Telefon);
form1.ListBox4.Items.add(Nowy^.Adres);
Nowy:= Nowy^.Nastepny;
end;
end;
end.
A w unit2.
unit Unit2;
interface
uses
Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls;
type
TForm2 = class(TForm)
StaticText1: TStaticText;
StaticText2: TStaticText;
StaticText3: TStaticText;
StaticText4: TStaticText;
StaticText5: TStaticText;
Edit1: TEdit;
Edit2: TEdit;
Edit3: TEdit;
Edit4: TEdit;
Button1: TButton;
Button2: TButton;
procedure Button2Click(Sender: TObject);
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form2: TForm2;
implementation
{$R *.dfm}
uses Unit1;
procedure TForm2.Button1Click(Sender: TObject);
begin
AssignFile(Plik_Bazy,'Plik_do_bazy.txt');
Reset(Plik_Bazy);
Seek(Plik_Bazy, FileSize(Plik_Bazy));
New(Nowy);
SetLength(Nowy^.Lp, Length(IntToStr(FileSize(Plik_Bazy) + 1)));
SetLength(Nowy^.imie, Length(Edit1.Text));
SetLength(Nowy^.nazwisko, Length(Edit2.Text));
SetLength(Nowy^.telefon, Length(Edit3.Text));
SetLength(Nowy^.adres, Length(Edit4.Text));
Nowy^.Lp := IntToStr(FileSize(Plik_Bazy) + 1);
Nowy^.Imie := Edit1.Text;
Nowy^.Nazwisko := Edit2.Text;
Nowy^.Telefon := Edit3.Text;
Nowy^.Nastepny := nil;
Nowy^.Adres := Edit4.Text;
Write(Plik_Bazy, Nowy^);
CloseFile(Plik_Bazy);
Edit1.Clear;
Edit2.Clear;
Edit3.Clear;
Edit4.Clear;
Close;
end;
procedure TForm2.Button2Click(Sender: TObject);
begin
Close;
end;
end.
W unit2 dodaje recordy do pliku. W pliku pojawiają się różne dziwne znaki. Dlaczego? I teraz jak w unit1 próbuję wczytać moje dane do Listboxa to wyskakuje mi error
Project Project1.exe raised exception class EAccessViolation with message at adress 0052737b in module 'Project1.exe. Read of address 000003AC
CZemu tak się dzieje? Jak to rozwiązać? Poprawnie używam wskaźników? Jestem początkujący.