Meine Deutung: der Handle (meine eigene StrList) geht auf dem Weg von SortHandle zu SchreibenDatei irgendwo verloren.
Jedenfalls sagt der Debugger wenn ich über der kommentierten Stelle stehe, für TStrListe(Handle^) schon mal eine ganz andere Adresse
als bei den anderen show Stellen und wahrscheinlich schlägt dann auch deswegen der Zugriff spätestens bei CurrValOf fehl.
Aber warum??? Ich habe doch nichts anderes gemacht als bei Unit1 und Unit2 und Unit3? Ich kann innerhalb SortHandle
die StrList sooft ausgeben wie ich will (mit show), die ist intakt, solange bis sie die Prozedur SortHandle verläßt. Muß
der Parameter bei SortHandle VAR Handle sein? Aber es ist doch ein Pointer. Und bei Unit1, Unit2 und Unit3 hat es funktioniert?
Mein Sort habe ich deaktiviert, das hat keinen Einfluß wenn ich es wieder aktiviere, gehen die show in SortHandle genauso und
das in SchreibenDatei nicht mehr. Ich habe es nur deshalb deaktiviert weil es (das Sort) den Head verändert und ich wollte
Nebeneffekte ausschließen. Aber alle show nach dem Sort sind trotzdem erfolgreich.
Code: Alles auswählen
unit Unit4;
interface
uses SysUtils, IVerfahren, OptIO, StrList;
procedure LesenDatei(const Dateiname: string; out Handle: TStrukturHandle);
procedure SortHandle(Handle: TStrukturHandle);
procedure SchreibenDatei(const Dateiname: string; Handle: TStrukturHandle);
procedure FreeHandle(var Handle: TStrukturHandle);
implementation
procedure LesenDatei(const Dateiname: string; out Handle: TStrukturHandle);
var L: TStrListe;
begin
L.Init;
ReadOptToStringList(Dateiname, L);
Handle := @L;
Writeln('Nach LesenDatei');
TStrListe(Handle^).show;
Writeln('fertig');
end;
procedure SortHandle(Handle: TStrukturHandle);
begin
Writeln('Vor Sort');
TStrListe(Handle^).show;
Writeln('fertig');
// TStrListe(Handle^).Sort;
Writeln('Nach Sort');
TStrListe(Handle^).show;
Writeln('fertig');
Writeln('Und nochmal');
TStrListe(Handle^).show;
Writeln('fertig');
Writeln('Und Nochmal');
TStrListe(Handle^).show;
Writeln('fertig');
end;
procedure SchreibenDatei(const Dateiname: string; Handle: TStrukturHandle);
begin
Writeln('Vor Schreiben');
TStrListe(Handle^).show; //bricht ab, anscheinend ist die Liste weg?
Writeln('fertig');
SaveOptFromStringList(Dateiname, TStrListe(Handle^));
end;
procedure FreeHandle(var Handle: TStrukturHandle);
begin
TStrListe(Handle^).Free;
Handle := nil;
end;
end.