Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi EAccessViolation Fehler (https://www.delphipraxis.net/116053-eaccessviolation-fehler.html)

Tempest08 22. Jun 2008 18:59


EAccessViolation Fehler
 
Delphi-Quellcode:
TZeiger =^TSportler;
  TSportler = record
                name : string[50];
                zeit : real;
                next : TZeiger;
              end;

var
  Form1: TForm1;
  ExDatei: file of TSportler;
  gespeichert: boolean;
  Sportler, Schnellster, vor: TZeiger;
  Anzahl, y: integer;

implementation

uses Unit2;

{$R *.dfm}


procedure TForm1.FormActivate(Sender: TObject);
var n: integer;
begin
  vor:= nil;
  schnellster:= nil;
  gespeichert:= false;
  with StringGrid1 do begin
    ColCount:= 3;
    RowCount:= 31;
    Cells[1, 0]:= 'Name';
    Cells[2, 0]:= 'Zeit';
  end;
  for n:= 1 to 30 do StringGrid1.Cells[0, n]:= IntToStr(n);
end;


procedure TForm1.Einfuegen1Click(Sender: TObject);
begin
  form2.visible:= true;
end;


procedure TForm1.Ausgeben;
var yPos: integer;
begin
  for yPos:= 1 to 30 do begin
    StringGrid1.Cells[1, yPos]:= '';
    StringGrid1.Cells[2, yPos]:= '';
  end;
  sportler:= schnellster;
  ypos:= 1;
  while sportler <> nil do begin
    StringGrid1.Cells[1, yPos]:= sportler^.name;
    StringGrid1.Cells[2, yPos]:= FloatToStr(sportler^.zeit);
    sportler:= sportler^.next;
    ypos:= ypos+1;
  end;
end;

   
procedure TForm1.StringGrid1SelectCell(Sender: TObject; ACol,
  ARow: Integer; var CanSelect: Boolean);
begin
  y:= ARow;
end;


procedure TForm1.Loeschen1Click(Sender: TObject);
var handle: string[50];
    time: real;
begin
  handle:= StringGrid1.Cells[1, y];
  time:= StrToFloat(StringGrid1.Cells[2, y]);
  sportler:= schnellster;
  while (handle <> sportler^.name) and (sportler^.zeit <> time)
    do begin
      vor:= sportler;
      sportler:= sportler^.next;
    end;
  vor^.next:= sportler^.next;
  dispose(sportler);
  ausgeben;
end;


// neues Formular

procedure TForm2.EinfuegenClick(Sender: TObject);
var neu: TZeiger;
begin
  new(neu);
  neu^.name:= NameEd.Text;
  neu^.zeit:= StrToFloat(ZeitEd.Text);
  if schnellster = nil
    then schnellster:= neu
    else begin
      neu^.next:= schnellster;
      schnellster:= neu;
    end;
  gespeichert:= false;
  form1.ausgeben;              // an dieser Stelle tritt bei Betätigung dieses Knopfes ein EAccessViolation-Fehler auf
  form2.visible:= false;
end;
Hat jemand eine Idee wo der Fehler sein könnte???

SirThornberry 22. Jun 2008 19:01

Re: EAccessViolation Fehler
 
wie lautet die genaue Fehlermeldung? vor allem die Adressen der AccessViolation sind wichtig.
Ich würde auf anhieb sagen das Form1 nicht erzeugt wurde zu dem Zeitpunkt wo darauf zugegriffen wird.

Tempest08 22. Jun 2008 19:04

Re: EAccessViolation Fehler
 
'Zugriffsverletzung bei Adresse 004044BE in Modul Project1.exe. Lesen von Adresse 02746665'

Fussball-Robby 22. Jun 2008 19:11

Re: EAccessViolation Fehler
 
Setz mal einen Breakpoint(F5) auf die Zeile, und debug von da aus (F7). Der Fehler tritt wahrscheinlich in der Prozedur TForm1.Ausgeben auf.

Tempest08 22. Jun 2008 19:22

Re: EAccessViolation Fehler
 
''Datei nicht gefunden "SysConst.pas"'' ??

Die Muhkuh 22. Jun 2008 19:23

Re: EAccessViolation Fehler
 
Von was redest Du?

Tempest08 22. Jun 2008 19:24

Re: EAccessViolation Fehler
 
Wenn ich die Zeile "form1.ausgeben" mit F5 markiere und dann mit F7 debugge erscheint nach zweimaligem Betätigen von F7 oben genannte Fehlermeldung

SirThornberry 22. Jun 2008 19:28

Re: EAccessViolation Fehler
 
Wie sieht die Methode "ausgeben" von TForm1 aus? und wenn du einen Haltepunkt auf die erste Anweisung von "ausgeben" setzt, wird dieser erreicht oder kommt die Zugriffsverletzung vorher?

Tempest08 22. Jun 2008 19:34

Re: EAccessViolation Fehler
 
Liste der Anhänge anzeigen (Anzahl: 1)
Was meinst du mit Methode???

Wenn ich F7 drücke nachdem ich die erste Zeile von ausgeben markiert habe, erscheint im Anhang zu findendes Fenster

Neutral General 22. Jun 2008 19:36

Re: EAccessViolation Fehler
 
Du musst das Projekt starten... Wird die markierte Stelle im Code bei der Ausführung erreicht, hält das Programm an und du hast wieder den Code vor dir. Von da an kannst du mit F7 Schritt für Schritt durch den Code gehn, das heißt jede Zeile einzeln und nacheinander ausführen.

Tempest08 22. Jun 2008 19:41

Re: EAccessViolation Fehler
 
Beim Debuggen stoppt er an folgender Stelle:

Delphi-Quellcode:
procedure TForm1.Ausgeben;
var yPos: integer;
begin
  for yPos:= 1 to 30 do begin
    StringGrid1.Cells[1, yPos]:= '';
    StringGrid1.Cells[2, yPos]:= '';
  end;
  sportler:= schnellster;
  ypos:= 1;
  while sportler <> nil do begin
    StringGrid1.Cells[1, yPos]:= sportler^.name;
    StringGrid1.Cells[2, yPos]:= FloatToStr(sportler^.zeit); //<--- Diese Zeile sei ein EAccessViolation
    sportler:= sportler^.next;
    ypos:= ypos+1;
  end;
end;
Ist mir allerding schleierhaft, dass er die while schleife einmal komplett durchläuft und beim zweiten Mal an der benannten Stelle abbricht...

Fussball-Robby 22. Jun 2008 19:47

Re: EAccessViolation Fehler
 
Delphi-Quellcode:
StringGrid1.Cells[2, yPos]
existiert diese Zelle überhaupt?

Tempest08 22. Jun 2008 19:54

Re: EAccessViolation Fehler
 
Ja sie existiert, aber ich habe gerade eine Lösung gefunden. Aus irgendeinem Grund hat Delphi die while schleife zwei mal durchlaufen obwohl nur ein Element existierte.
Habe es jetzt wie folgt behoben, wenngleich ein wenig umständlich.

Delphi-Quellcode:
procedure TForm1.Ausgeben;
var yPos, i: integer;
begin
  for yPos:= 1 to 30 do begin
    StringGrid1.Cells[1, yPos]:= '';
    StringGrid1.Cells[2, yPos]:= '';
  end;
  sportler:= schnellster;
  ypos:= 1;
  for i:= 1 to anzahl do begin  // <-- Habe nun nach jedem Einfügen bzw. Löschen die anzahl Variable die Sportler zählen lassen
    StringGrid1.Cells[1, yPos]:= sportler^.name;
    StringGrid1.Cells[2, yPos]:= FloatToStr(sportler^.zeit);
    sportler:= sportler^.next;
    ypos:= ypos+1;
  end;
end;
So funktioniert es

NormanNG 22. Jun 2008 20:17

Re: EAccessViolation Fehler
 
Hi,

Zitat:

Ist mir allerding schleierhaft, dass er die while schleife einmal komplett durchläuft und beim zweiten Mal an der benannten Stelle abbricht...
Ich denke mal, an der Stelle
Delphi-Quellcode:
sportler:= sportler^.next;
ist das Feld "next" nicht NIL, weshalb die while-Bedingung
(sportler<>nil) weiterhin erfüllt ist...

Schau dir mal deinen Source zum Einfügen eines neuen
Sportlers an, ob dort das Feld "next" auf NIL initialisiert wird.


Alle Zeitangaben in WEZ +1. Es ist jetzt 22:45 Uhr.

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz