Znalezieniu błędu powodującego Access Violation

0

Witam,
Mam problem nad ktorym slecze juz ktoras godzine z kolei.
Jestem poczatkujacy w programowaniu i nie moge poradzic sobie ze znalezieniem bledu w tym kodzie:
Jest to kod tworzacy i wrzucajacy dane do bazy danych.

 unit Unit4;

interface

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

type
  TForm4 = class(TForm)
    Wroc: TButton;
    edNazwisko: TEdit;
    edLat: TEdit;
    edKontrakt: TEdit;
    edKondycja: TEdit;
    edMorale: TEdit;
    edWytrzym: TEdit;
    edTStartu: TEdit;
    edTJazdy: TEdit;
    edAgresja: TEdit;
    edBlok: TEdit;
    edWyprz: TEdit;
    edDruzyna: TComboBox;
    edMotor: TComboBox;
    edStan: TEdit;
    Label1: TLabel;
    Label2: TLabel;
    Label3: TLabel;
    Label4: TLabel;
    Label5: TLabel;
    Label6: TLabel;
    Label7: TLabel;
    Label8: TLabel;
    Label9: TLabel;
    Label10: TLabel;
    Label11: TLabel;
    Label12: TLabel;
    Label13: TLabel;
    Label14: TLabel;
    Label15: TLabel;
    edImie: TEdit;
    Button1: TButton;
    procedure WrocClick(Sender: TObject);
    procedure Button1Click(Sender: TObject);

private

public

end;

var
  Form4: TForm4;

implementation

uses Unit2;
{$R *.DFM}

Type

TDatabaseRec = Packed Record
      Imie : String[30];
      Nazwisko : String [40];
      Lat : integer;
      Kontrakt : integer;

      Kondycja : integer;
      Morale : integer;
      Wytrzym : integer;

      TStartu : integer;
      TJazdy : integer;
      Agresja : integer;
      Blokowanie : integer;
      Wyprzedzanie : integer;

      Motor : String[10];
      Stan : integer;
      Druzyna : String[60];
      end;

      TDataBase = File Of TDatabaseRec;   //deklaracja pliku typowanego

    var DataBase : TDataBase;  //zmienna na ten plik

    const FileName = 'baza.dat'; //nazwa pliku do zapisania


procedure TForm4.Button1Click(Sender: TObject);
var
  StrucRec : TDatabaseRec;

begin

  AssignFile(DataBase, FileName);
  Reset(DataBase);
  Seek(DataBase, FileSize(DataBase)); //przesuniecie na koniec pliku

  StrucRec.Imie := edImie.Text;
  StrucRec.Nazwisko := edNazwisko.Text;
  StrucRec.Lat := strtoint(edLat.Text);
  StrucRec.Kontrakt := strtoint(edKontrakt.Text);
  StrucRec.Kondycja := strtoint(edKondycja.Text);
  StrucRec.Morale := strtoint(edMorale.Text);
  StrucRec.Wytrzym := strtoint(edWytrzym.Text);
  StrucRec.TStartu := strtoint(edTStartu.Text);
  StrucRec.TJazdy := strtoint(edTJazdy.Text);
  StrucRec.Agresja := strtoint(edAgresja.Text);
  StrucRec.Blokowanie := strtoint(edBlok.Text);
  StrucRec.Wyprzedzanie := strtoint(edWyprz.Text);
  StrucRec.Motor := edMotor.Text;
  StrucRec.Druzyna := edDruzyna.Text;
  StrucRec.Stan := edStan.Text;

  Write(DataBase, StrucRec); // zapisanie do pliku

  CloseFile(DataBase);
end;


procedure TForm4.WrocClick(Sender: TObject);
begin
    Form2.show;
    Form4.hide;
end;


end.

Czy moge liczyc na pomoc?:)

0

Co mówi debugger?

0

zdaje się, że przy plikach typowanych trzeba podać drugi parametr w

 Reset(DataBase, SizeOf(StrucRec));
0

Niestety, przy dodaniu dodatkowego parametru wywala blad "Too many actual parameters".

Dodatkowo, bo nie dopisalem w nocy:
Program sie otwiera, moge chodzić po menu wchodzić w sumie wszędzie, do czasu aż nie klikne na przycisk przenoszący mnie właśnie do Form4.
Wtedy właśnie wywala błąd.

Co mówi debugger? (mam nadzieję, że chodzi o ten komunikat błędu)
"Project Project1.exe raised exception class EAccessViolation with message 'Access violation at adress 004501F6 in module 'Project1.exe'. Read of adress 000002F4."

0

Sprawdź jaką wartość ma FileMode - Tobie potrzebna wartość $0002;


No nie wiem - sprawdziłem i u mnie śmiga; Przeanalizuj sobie poniższy przykład i sprawdź co u Ciebie musisz poprawić:

uses
  SysUtils;

type
  TSomeRec = record
    ID: Integer;
    Name: ShortString;
  end;

type
  TSomeRecArr = array of TSomeRec;

  procedure AddRec(var ARecArr: TSomeRecArr; const AName: ShortString);
  var
    intLength: Integer;
  begin
    intLength := Length(ARecArr);
    SetLength(ARecArr, intLength + 1);

    ARecArr[intLength].ID := intLength;
    ARecArr[intLength].Name := AName;
  end;

  procedure FillRecArr(var ARecArr: TSomeRecArr);
  begin
    AddRec(ARecArr, 'furious');
    AddRec(ARecArr, 'programming');
  end;

  procedure ShowRecArr(var ARecArr: TSomeRecArr);
  var
    I: Integer;
  begin
    for I := Low(ARecArr) to High(ARecArr) do
    begin
      WriteLn('ID:   ', ARecArr[I].ID);
      WriteLn('Name: ', ARecArr[I].Name);
    end;

    WriteLn(StringOfChar('-', 20));
  end;

  procedure SaveRecArr(const AFileName: AnsiString; var ARecArr: TSomeRecArr);
  var
    fOutput: file of TSomeRec;
    I: Integer;
  begin
    AssignFile(fOutput, AFileName);
    ReWrite(fOutput);
    try
      for I := Low(ARecArr) to High(ARecArr) do
        Write(fOutput, ARecArr[I]);
    finally
      CloseFile(fOutput);
    end;
  end;

  procedure AppendRecArr(const AFileName: AnsiString; var ARecArr: TSomeRecArr);
  var
    fOutput: file of TSomeRec;
    I: Integer;
  begin
    AssignFile(fOutput, AFileName);
    Reset(fOutput);
    try
      Seek(fOutput, FileSize(fOutput));

      for I := Low(ARecArr) to High(ARecArr) do
        Write(fOutput, ARecArr[I]);
    finally
      CloseFile(fOutput);
    end;
  end;

  procedure LoadRecArr(const AFileName: AnsiString; var ARecArr: TSomeRecArr);
  var
    fInput: file of TSomeRec;
    I: Integer;
  begin
    AssignFile(fInput, AFileName);
    Reset(fInput);
    try
      SetLength(ARecArr, FileSize(fInput));

      for I := Low(ARecArr) to High(ARecArr) do
        Read(fInput, ARecArr[I]);
    finally
      CloseFile(fInput);
    end;
  end;

const
  DATABASE_FILENAME = AnsiString('C:\Data.base');
var
  sraFoo: TSomeRecArr;
begin
  { wypełnienie macierzy dwoma rekordami }
  SetLength(sraFoo, 0);
  FillRecArr(sraFoo);
  ShowRecArr(sraFoo);

  { zapisanie i odczytanie macierzy do i z pliku }
  SaveRecArr(DATABASE_FILENAME, sraFoo);
  SetLength(sraFoo, 0);
  LoadRecArr(DATABASE_FILENAME, sraFoo);

  { dopisanie macierzy na koniec pliku (tu: zdublowanie zawartości) }
  ShowRecArr(sraFoo);
  AppendRecArr(DATABASE_FILENAME, sraFoo);
  SetLength(sraFoo, 0);

  { załadowanie i wyświetlenie zawartości macierzy }
  LoadRecArr(DATABASE_FILENAME, sraFoo);
  ShowRecArr(sraFoo);

  ReadLn;
end.

Wyjscie:

ID:   0
Name: furious
ID:   1
Name: programming
--------------------
ID:   0
Name: furious
ID:   1
Name: programming
--------------------
ID:   0
Name: furious
ID:   1
Name: programming
ID:   0
Name: furious
ID:   1
Name: programming
--------------------

W sumie FileMode ma domyślną wartość fmOpenReadWrite, ale Twój kod (i mój też) wywali się, jeśli plik nie istnieje na dysku, więc trzeba to sobie zabezpieczyć.

0

Temat do zamkniecia.
Napisalem (w sumie tak samo) caly kod od poczatku, teraz dziala az milo. :)
Nadal nie wiem co to bylo, ale przynajmniej dziala.

Dziekuje za pomoc.

1 użytkowników online, w tym zalogowanych: 0, gości: 1