Hallo,
ich habe in dem dargestellten Code eine Merkwürdigkeit: In der dargestellten Form läuft alles bestens. Wenn ich aber die Variable "Filename" in den PUBLIC-Teil verlege, dann wird die erste Datei richtig geöffnet und bearbeitet, aber beim öffnen der nächsten (!) Datei in "OpennextFil_der_Liste" gibt die
Exception "Im Projekt Auflisten.exe ist eine
Exception der Klasse $C0000005 mit der Meldung '
access violation at 0x0027a67e: read of address 0x3ca2427f'.". Im Aufruf-Stack der
IDE (Delphi 12) steht als oberster Eintrag "@UStrAsG + $32".
Wenn ich auf die Zeile "Filename := f_Liste[..] einen Breakpoint setze, dann sehe ich beim ersten Aufruf, dass Filename ein leerer String ist, beim zweiten Auruf zeigt mir aber der Debugger an "Nicht verfügbarer Wert". Wie kann das sein?
Den Code habe ich vor vielen Jahren gemacht, vermutlich noch unter Delphi 7, da ist er (mit Filename im PUBLIC-Teil) sauber gelaufen.
Hat jemand eine Tdee, was die Ursache ist oder was ich falsch gemacht habe?
Grüße
GueAck
Delphi-Quellcode:
UNIT UfileListe;
INTERFACE
t_Urclass =
CLASS
PROCEDURE openfilefolge(vpfad:
STRING);
VIRTUAL;
ABSTRACT;
FUNCTION getzeile: boolean;
VIRTUAL;
ABSTRACT;
{true: zeile vorhanden}
END;
t_fileListe =
CLASS(t_Urclass)
Filename: f_name;
// in Public geht es nicht, das ergibt beim 2. Aufruf von opennextfild_der_luiste eine Access-violation UStrAsg
PROCEDURE openfilefolge(vpfad:
STRING);
OVERRIDE;
FUNCTION getzeile;
OVERRIDE;
PRIVATE
f_i, f_anz: integer;
{Index des aktuellen Files in der f_liste }
f_liste:
ARRAY[1..fanzmax]
OF STRING;
FUNCTION opennextfile_der_liste: boolean;
{True: Erfolg }
PUBLIC
{ Public-Deklarationen }
END;
IMPLEMENTATION
FUNCTION t_fileListe.getzeile;
VAR
gefunden: boolean;
BEGIN
// Liest alle Zeilen der aktuellen Datei ein.
// Am Ende wird mit
gelungen := opennextfile_der_liste;
// die nächste Datei geöffnet.
result := gelungen;
END;
FUNCTION t_fileArduino.opennextfile_der_liste;
BEGIN
//...
f_i := f_i + 1;
Filename := f_liste[f_i];
// hier passiert der Fehler
//...
END;
PROCEDURE t_fileArduino.openfilefolge(vpfad:
STRING);
BEGIN
// Die Nammen aller Dateien im Verzeichnis werden in die Liste f_liste eingetragen.
f_i := 0;
f_anz := Abzahl_der_vorhandenen_Dateien;
opennextfile_der_luste;
END;
END.