Hi,
ich habe mal ein sehr merkwürdiges Problem. Ich habe ein TObjectList mit ein Save-to-Filestream-Methode. Das eigentliche Problem war, dass er mir Daten nicht in die Datei geschrieben hat. Um das zu Prüfen bin ich Schrittweise durch die Prozedur gegangen. Dabei ist mir aufgefallen, dass er dann von einer Procedure in eine andere Procedure springt, obwohl im Code an der Stelle überhaupt keine Veranlassung dazu gibt.
Hier mal der Codeteil um den es sich handelt:
Delphi-Quellcode:
procedure TBackupList.SaveToFile(Filename: string);
var
st: TFileStream;
i: Integer;
begin
if Filename<>'' then FFilename:=Filename;
if DirectoryExists(ExtractFilePath(FFilename)) then
begin
st:=TFileStream.Create(FFilename, fmCreate);
if st<>nil then
begin
try //<----von hier springt er mit F7 (Einzelschritt)
WriteIntToStream(st, Version);
WriteStrToStream(st, self.FServerName);
WriteDateTimeToStream(st, self.FStartTime);
WriteDateTimeToStream(st, self.FEndTime);
WriteBoolToStream(st, self.FSuccess);
WriteInt64ToStream(st, self.FTotalDataSize);
WriteInt64ToStream(st, self.FTotalBackupSize);
WriteIntToStream(st, self.Count);
for I := 0 to self.Count-1 do
self[i].WriteToStream(st);
finally
st.Free;
end;
end;
end;
end;
procedure TBackupList.SetEndTime(Value: TDateTime);
begin
FEndTime:=Value;
end; //<----direkt nach hier
Also vom Try mal direkt zum end der nächsten Procedure. Wenn die aktuelle Programmzeile noch auf Try steht, sind alle Variablen wie erwartet vorhanden. Wenn ich dann mit F7 einen Schritt weitergehen will, und er danach auf dem end der nächsten Procedure steht, kann ich im Debugger noch das
Handle des Filestreams sehen. Auf alle anderen Variablen kann er nicht mehr zugreifen.
Es laufen keine Threads, die mir dazwischenfunken könnten. Ich habe auch schon mal die
Pas-Datei mit einem HexEditor untersucht, ob vielleicht irgendwelche unsichtbaren Zeichen irgendwo sind, aber alle nur Leerzeichen, CR und LF.
Ich habe schon bereinigt, das Debug und Release Verzeichnis komplett leer gemacht und Delphi neu gestartet. Immer nahezu das gleiche verhalten.
Entferne ich jedoch das
begin..end
, das ich nach dem
if st<>nil then
um den
Try..finally..end
gelegt habe, macht er das gleich, allerdings erst in der Zeile
WriteIntToStream(st, Version);
Das Problem tritt sowohl in der Debug- als auch in der Release-Konfiguration auf.
Die ganze WriteXXXToStream-Routinen verwende ich schon jahrelang, die können nicht fehlerhaft sein. Außerdem müsste dann ja zum Finally springen.
Dann habe ich die Procedure SetEndTime im Code mal etwas nach unten verschoben. Interessiert ihn nicht, dann lande ich direkt bei end der Procedure, die dann auf die SavaToFile folgt.
Auch hole ich mir die Daten in der SaveToFile-Procedure aus den privaten Variable und habe an der Stelle mit den Settern gar nichts zu tun.
Ich bin ein bisachen Ratlos.