Einzelnen Beitrag anzeigen

Benutzerbild von PhilmacFLy
PhilmacFLy

Registriert seit: 20. Jan 2008
Ort: Nürnberg
340 Beiträge
 
FreePascal / Lazarus
 
#1

Access Violation bei setlength bei Int Array

  Alt 14. Dez 2011, 12:20
Delphi-Version: 2005
Ok ich hab folgendes Problem ich bekomme bei einem Integer Array eine AV bei folgendem Code:
Delphi-Quellcode:
procedure Tfrm_gui_doku_laden.btt_ladenClick(Sender: TObject);
var
idtrain, tmpid: Integer;
idcount, tmpcount:Integer;
i: integer;
versioncount: Integer;
version: Integer;
begin
//i := 0;
versioncount := 0;
version := 42;
idcount := 0;
gesamt := 0;
versionen := 0;
//ShellExecute(Application.Handle,'open',PChar(ExtractFilePath(ParamStr(0)) +'Zeigtrai.exe'), Nil, Nil, SW_SHOW);
zConnection1.Connected := true;
    with ZReadonlyquery1 do
      begin
        SQL.TExt := 'Select ID_Training, Text from Training Where ID_Geraetenr = :ge and ID_KDNR = :kdnr' +
        ' and ID_such = :such and ID_Trainingsmodus = :mod Order By Version ASC';
        Params.ParamByName('ge').AsInteger := Geraetenummer;
        Params.ParamByName('kdnr').AsInteger := frm_gui_main.kunde.id;
        Params.ParamByName('such').AsInteger := idsuch;
        Params.ParamByName('mod').AsInteger := idmodus;
        Open;
        idtrain := FieldbyName('ID_Training').AsInteger; //Holt die ID der ersten Version eines Trainings
        Close;
        tmpid := idtrain;
        while version <> 0 do //Liest solang die Version aus bis keine neue Version kommt
          begin //dient dem zweck das ich die größe des Arrays festlegen kann
                               //nach der Anzahl der Versionen und anzahl der Trainingswerte pro Version
            Sql.Text := 'Select Versionsaenderung From Training Where Id_Training = :id';
            Params.ParamByName('id').AsInteger := tmpid;
            Open;
            version := FieldbyName('Versionsaenderung').AsInteger;
            Close;
            inc(versioncount);
            SQL.TExt := 'Select Count(ID_Training) From Trainingswerte Where ID_Training = :id';
            Params.ParamByName('id').AsInteger := tmpid;
            Open;
            tmpcount := FieldbyName('Count').AsInteger;
            Close;
            if tmpcount > idcount then
              idcount := tmpcount;
            tmpid := version;
          end;
        setlength(wertarr, versioncount+1, idcount);
        if checkbox1.Checked then
          setlength(anzahlarr, versioncount+1); //<---- Hier (Checkbox is nur zum testen obs wirklich das ist)
        for i := 0 to versioncount+1 do
          anzahlarr[i] := 0;
        i := 0;
        versionen:=versioncount;
        tmpid := idtrain;
        versioncount := 0;
        version := 42;
        while version <> 0 do
          begin //Liest dann die Werte aus in das array
            Sql.Text := 'Select Versionsaenderung From Training Where Id_Training = :id';
            Params.ParamByName('id').AsInteger := tmpid;
            Open;
            version := FieldbyName('Versionsaenderung').AsInteger;
            Close;
            inc(versioncount);
            Sql.Text := 'Select * From Trainingswerte Where ID_Training = :id Order By Datum, Startzeit';
            Params.ParamByName('id').AsInteger := tmpid;
            Open;
            while not eof do
              begin
                wertarr[versioncount, i].Datum := FieldbyName('Datum').AsDateTime;
                wertarr[versioncount, i].Start := FieldbyName('Startzeit').AsDateTime;
                wertarr[versioncount, i].Stop := FieldbyName('Stopzeit').AsDateTime;
                wertarr[versioncount, i].Fehlerl := FieldbyName('Fehlerlinks').AsInteger;
                wertarr[versioncount, i].Fehlerr := FieldbyName('Fehlerrechts').AsInteger;
                wertarr[versioncount, i].startpos := FieldbyName('Startpos').AsInteger;
                wertarr[versioncount, i].stoppos := FieldbyName('Stoppos').AsInteger;
                next;
                inc(i);
              end;
            Close;
            anzahlarr[versioncount]:=i;
            gesamt:=gesamt+i;
            tmpid := version;
          end;
      end;
    Frm_ZeigTr:=TFrm_ZeigTr.Create(self);
    Frm_ZeigTr.ShowModal;
    zConnection1.Connected := false;
end;
Wenn die Checkbox nicht gecheked ist passiert nichts wenn sie gecheckt ist AV, aber auch nicht immer das ist das seltsame.

Hier noch ein paar Definitionen:
Delphi-Quellcode:
  public
    wertarr: Array of Array of TTrainwerte;
    anzahlarr: Array of Integer;
    versionen,gesamt: Integer;
  end;
und von TTrainwerte
Delphi-Quellcode:
  TTrainwerte=class
  public
  id: Integer;
  Datum: Tdate;
  startzeit: TTime;
  stopzeit: TTime;
  FehlerL: Integer;
  FehlerR: Integer;
  Startpos: Integer;
  Stoppos: Integer;
  Notiz: String;
  procedure getvalues(Query: TZquery); overload;
  procedure getvalues(Query: TZReadOnlyQuery); overload;
  procedure insertvalues(Query: TZquery); overload;
  procedure insertvalues(Query: TZReadOnlyquery); overload;
  destructor Destroy();
  end;
Wäre ehct glücklich wenn mir jemand helfen könnte.
Philipp N.
"Programmiern ist wie küssen:
Mann kan darüber reden, mann kann es beschreiben,
aber man weiss erst, was es bedeutet,
wenn man es getan hat"
  Mit Zitat antworten Zitat