Einzelnen Beitrag anzeigen

Benutzerbild von glkgereon
glkgereon

Registriert seit: 16. Mär 2004
2.287 Beiträge
 
#6

Re: OnResize => AV, Wenn OnResize leer...

  Alt 3. Jun 2006, 12:12
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;
»Unlösbare Probleme sind in der Regel schwierig...«
  Mit Zitat antworten Zitat