access violation !

1

Pisze ładny programik do bazy danych. Korzysta on z bazy danych zapisanej do pliku ini, ale czasami gdy propgram ma odczytać coś z tego pliu to wyskakuje mi błąd:
Exception EAccessViolation in module Filtr.exe at 0004EBBF.
Access violation at address 0044EBBF in module 'Filtr.exe'. Read of address 737470AD.

no i potem:

Runtime error 216 at 77F755E9.

Nie mam pojęcia skąd to siębierze. Typy danych się zgadzają, w pliku ini jest to co powinno być pod odpowiednią nazwą. Prosze o pomoc i pozdrawiam!

1

Wiolacja jest najczęściej, jak nie stworzysz obiektu, a odwołujesz się do niego. Nic więcej nie mogę powiedzieć, bo musiałbym dysponować kodem źródłowym...

0

// oto kod źródłowy, próbowałem już zmieniać typy danych i w ogóle, ale nic nie działa
BD : Tinifile;
s : Tstrings;
tab:Array[1..10] of record
imie,nazwisko,miejsce_ur,miejsce,stanowisko,ulica,kodpocz,miejscowosc:string;
dzien,miesiac,rok,wzrost,waga,ile:Longint;
end;
(...)
procedure TForm1.FormCreate(Sender: TObject);
var i : integer;
begin
if not fileexists(ExtractFilePath(Application.ExeName) + 'BD.ini') then begin
messagebox(0,'Nie ma pliku z danymi!!!','Bład!!!',MB_OK);
Halt(1);end;
BD := TINIFile.Create(ExtractFilePath(Application.ExeName) + 'BD.ini');

s:=Tstringlist.Create;
BD.ReadSections(s);

for i:=0 to s.Count do
begin
tab[i].imie:=(bd.ReadString(s[i],'Imie','?'));
tab[i].Nazwisko:=(bd.ReadString(s[i],'Nazwisko','?'));
tab[i].dzien:=(bd.ReadInteger(s[i],'dzien',0));
tab[i].Miejsce_ur:=(bd.ReadString(s[i],'Miejsce_ur','?'));
tab[i].wzrost:=(bd.ReadInteger(s[i],'wzrost',0));
tab[i].waga:=(bd.ReadInteger(s[i],'waga',0));
tab[i].ile:=(bd.ReadInteger(s[i],'ile',0));
tab[i].stanowisko:=(bd.ReadString(s[i],'stanowisko','?'));
tab[i].miesiac:=(bd.ReadInteger(s[i],'miesiac',0));
tab[i].rok:=(bd.ReadInteger(s[i],'rok',0));
tab[i].Kodpocz:=(bd.ReadString(s[i],'kodpocz','?'));
tab[i].miejscowosc:=(bd.ReadString(s[i],'miejscowosc','?'));
tab[i].Miejsce:=(bd.ReadString(s[i],'Miejsce','?'));
end;
uzupelnij;
end;


``` ```
0

Spróbuj zmienić styp s na TStringList - ja zawsze miałem jakieś problemy ze TStrings.

0

Też nie działa, ale rzeczywiści zapomniałem żeby zrobić Tstringlist.
Przy tab[i].ile:=(bd.ReadInteger(s[i],'ile',0)); wyskakują błędy.

1

tab:Array[<font color="red">1</span>..10] of ...

for i:=<font color="red">0</span> to s.Count do
begin
tab[i]. ...

Jak to w ogóle może działać ?

// eh...

var 
  tab:array of record 
          //...
        end;
begin
  setlength(tab,s.Count);
  for i:=0 to s.Count-1 do 
    begin
      tab[i]. //...

//...

Dopisane: A kalifat to ładnie pod spodem opisał słowami.

0

witam Jacku

  1. zawsze ładniej jest zdefiniować rekord jako inny typ i później utworzyć tablicę danych tego typu
  2. utworzyłeś tablicę w zakresie od 1 do 10, a chcesz wpisywać do komórki o numerze 0
  3. jeśli tworzysz tablicę statyczną to musisz być pewien, że ilość rekordów w pliku ini nie przekracza tej wartości (może warto tworzyć dynamicznie tę tablicę lub jakąś listę)
0

Czasem lepiej wykonywać w zdarzeniu OnShow a nie OnCreate ...
Można zrobić też jakiś licznik żeby nie była wykonywana tylko przy pierwszym pokazaniu a nie za każdym rezem..
.

0

Człowieku, tamci ludzie dawno skamieniali.

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.