Hallo zusammen,
ich habe schon wieder ein Problem, das ich bislang noch nicht lösen konnte:
Beim Start wird beim Erzeugen einer Zentralen Verwaltungsklasse einmal ein Objekt zum Managen diverser typisierter Dateien sowie in einer For-Schleife eine Liste mit Objekten einer Steuerungsklasse gefüllt und dieser klein ein Indexwert zugewiesen. Jede Steuerungsklasse soll jetzt jeweils ihre Informationen aus der Dateiverwaltungsklasse nehmen, die auf die Dateien zugriff hat. Der Rückgabewert dieser Funktion ist ein Array, aus welcher sich die Steuerungsklasse mithilfe des Indexes ihre Werte nehmen kann(ich weiß, das ist nicht besonders effizient, besser wäre es nur den gewünschten Datensatz sich geben zu lassen, aber bislang funktioniert das problemlos, vielleicht werde ich es auch noch umprogrammieren). Wenn allerdings noch nichts in der Datei steht, wird ein leeres Array übergeben, dies wird geprüft und dann sollen Standardwerte in die Datei geschrieben werden.
Problem ist jetzt folgendes: Dadurch, dass mehrere Objekte der Steuerungsklasse erzeugt werden, ist das Array beim Create des 2. Objektes mit einem Datenpaket bereits gefüllt, deswegen gilt
high(Array)<0
nicht mehr. Dies habe ich versucht durch ein
high(Array)<Index
zu lösen. Diese Änderung bewirkt allerdings, dass sich das Programm bereits beim Start aufhängt (Unter Mac: Das Docksymbol hüpft aufgeregt ohne dass sich was tut) und das ohne jegliche Fehlermeldung. Die Prozessorauslastung geht dabei auf ca.90% hoch.
Hier mal der Code:
Delphi-Quellcode:
var ZwischenSpeicherDatensatz: TMyRecord
begin
BufferArray:= DateiVerwaltung.DateiLaden;
if high(BufferArray)<Index then //Hier ist Das Problem
begin
ZwischenSpecherDatensatz.Var1:= ... {Hier entsprechende Zuweisungen}
DateiVerwaltung.DateiAktualisieren(Index, ZwischenSpeicherDatensatz);
Exit;
end;
//Die Felder werden aus dem BufferArray gefüllt
FVar1:=BufferArray[Index].Var1
{Hier weitere Zuweisungen}
end;
Hier der entsprechenden Funktionen zur Dateispeicherung/Laden:
Delphi-Quellcode:
procedure TDateiVerwaltung.DateiAktualisieren(Index: integer; Datensatz: TMyRecord);
begin
try
seek(FFile, Index);
write(FFile, Datensatz);
except
showmessage('Problem beim speichern der Datei');
end;
end;
//und
function TDateiVerwaltung.DateiLaden: TMyArray; //Dynamisches Array
var DatenArray: TMyArray;
Datensatz: TMyRecord;
Index, FileIndex: integer;
begin
try
FileIndex:= System.FileSize(FFile)-1;
if FileIndex < 0 then exit; //Falls die Datei noch leer ist, wird nichts zurückgegeben. (Dies muss beim Aufruf berücksichtigt werden)
Index:= 0;
repeat
seek(FFile, Index);
read(FFile, Datensatz);
SetLength(DatenArray, Index+1);
//Daten werden ins Array geschrieben
DatenArray[Index].Var1:= Datensatz.Var1;
{weitere Zuweisungen}
until eof(FFile);
result:= DatenArray;
except
showmessage('Problem beim Laden der Datei');
end;
end;
Wenn ich mit dem Debugger drüber gehe, springt er genau bei der markierten Zeile heraus, bei
high(Array)<0
gibt es kein Problem.
Sämtliche Objekte sind alle korrekt instanziert, da ist nirgenwo ein Fehlzugriff auf ein (noch) nicht vorhandenes Objekt.
Schönes Wochenende