Zitat von
SirThornberry:
das klingt wirklich so als ob du mit deinem Code irgendwo in falschen Speicherbereichen rumfummelst. Prüf am besten mal ob du Eventuell über Arraygrenzen hinaus gehst (0 basierend nicht beachtet), einen String aus einem Stream ausliest/scheibst mit
Stream.Read(DeinString, Len);
anstelle von
Stream.Read(DeinString[1], Len);
(vielleicht auch vorher setlength vergessen), etc.
Ha!!!
Ich habe einfach mal eine Importer-Klasse auskommentiert, und siehe da: es funkt.
Das heisst zwar immer noch nicht das ich den Fehler hab, aber die möglicherweise fehlerhaften Zeile reduzieren sich von mehreren Tausend auf gut 100
woran könnte es hier liegen?
Delphi-Quellcode:
TImport_Virtual = class(TObject)
private //Basisklasse für ImportTyp
FFileName: String;
FFileExt: String;
FMaxAge: TDateTime;
FHasData: Boolean;
public
FData: TData;
constructor Create; virtual; abstract;
destructor Destroy; virtual; abstract;
function OpenFile(var Err: String):Boolean; virtual; abstract;
function CloseFile(var Err: String):Boolean; virtual; abstract;
function Analyse(var Err: String):Boolean; virtual; abstract;
function GetData(var Dat: TData):Boolean;
property FileName: String read FFileName write FFileName;
property MaxAge: TDateTime read FMaxAge write FMaxAge;
property HasData: Boolean read FHasData write FHasData;
end;
TMTTImport = class(TImport_Virtual)
private //Import aus MTT-Datei
S: TStringList;
Datum: TDateTime;
public
constructor Create; override;
destructor Destroy; override;
function OpenFile(var Err: String):Boolean; override;
function CloseFile(var Err: String):Boolean; override;
function Analyse(var Err: String):Boolean; override;
end;
constructor TMTTImport.Create;
begin
inherited;
FFileExt:='.mtt';
FHasData:=True;
S:=TStringList.Create;
end;
destructor TMTTImport.Destroy;
begin
S.Free;
inherited;
end;
function TMTTImport.OpenFile(var Err: String):Boolean;
var M,D: String;
Y: Integer;
begin
try
Result:=True;
if FileExists(FFileName) then
if LowerCase(ExtractFileExt(FFileName))=LowerCase(FFileExt) then
begin
Result:=False;
Err:='';
S.LoadFromFile(FFileName);
M:=ExtractFileName(FFileName);
M:=Copy(M,1,Pos('.',M)-1);
M:=Copy(M,Pos('-',M)+1);
D:=ExtractFileName(FFileName);
D:=Copy(D,1,Pos('-',D)-1);
D:=Copy(D,Pos('X',D)+1);
Y:=YearOf(Date);
Datum:=EncodeDate(Y,StrToInt(M),StrToInt(D));
if Datum>Now+FMaxAge then Datum:=EncodeDate(Y-1,StrToInt(M),StrToInt(D));
S.Clear;
end
else
Err:=cEFileExt
else
Err:=cEFileExists;
except
Result:=True;
Err:=cEUnknown;
end;
end;
function TMTTImport.CloseFile(var Err: String):Boolean;
begin
S.Clear;
Result:=False;
end;
function TMTTImport.Analyse(var Err: String):Boolean;
var Data: TStringDynArray;
i:Integer;
begin
try
Data:=Explode(#$0D+#$0A+#$0D+#$0A,S.Text);
SetLength(FData.MTData,Length(Data));
for i:=0 to Length(Data)-1 do
begin
FData.MTData[i].Value:=Data[i];
FData.MTData[i].Datum:=Datum;
end;
SetLength(Data,0);
Result:=False;
except
Result:=True;
end;
end;
PS: die TMTTImport ist nicht die einzige die von TImport_Virtual abgeleitet ist, aber die einzige die den Error fabriziert...
von daher sollten das eigentlich alle relevanten code-teile sein.
PS2: Könnte event daran liegen?
Denn TMTTImport ist die einzige klasse die was in FData.MTData reintut....
Delphi-Quellcode:
type
TVTData = record //Datensatz
Stunde: String;
Fehlend: String;
Vertretend: String;
Klasse: String;
Fach: String;
Raum: String;
BemerkungS: String;
BemerkungL: String;
Datum: String;
end;
TVTDataArray = array of TVTData;
TMTData = record
Datum: TDateTime;
Value: String;
end;
TMTDataArray = array of TMTData;
TData = record
VTData: TVTDataArray;
MTData: TMTDataArray;
end;
var FData: TData;
function TImport_Virtual.GetData(var Dat: TData):Boolean;
begin
try
Move(FData,Dat,SizeOf(FData));
Result:=False;
except
Result:=True;
end;
end;