Entwickler-Ecke

Delphi Language (Object-Pascal) / CLX - Was mache ich bei diesem Array falsch??


Andi1982 - Mi 28.05.03 17:55
Titel: Was mache ich bei diesem Array falsch??
Hallo,
ich habe eine schleife bei dem gleichzeitig ein Integer-Array mit dem index gefüllt.


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
   cIns := 0;
   for i := 0 to listbox1.Items.Count - 1 do
   begin
      if listbox1.Selected[i] then
      begin
         InsertFelderFuellen(listbox1.Items.Strings[i]);
         If InsInterpret = 'FEHLER' then
         begin
            Messagedlg( 'Fehler bei Datei "' +
            listbox1.Items.Strings[i] + '"', mterror, [mbok], 0 );
            continue;
         end;
         inc(MaxId); // Neue Lied_ID
         query1.Active := False;
         query1.SQL.Clear;
         query1.SQL.Text := 'Insert into Lieder.db Values (' +
         IntToStr(MaxId) + ', ' + InsInterpret + ', ' + InsTitel + ', ' + InsRubrik +
         ', ' + InsPfad + ', ' + InsDatname + ')' ;
         query1.ExecSQL;
         Inserted[cIns] := i;   <---- diese stelle fliegt er raus
         inc(cIns);
      end;
   end;


Den Array Inserted habe ich folgendermaßen deklariert:


Delphi-Quelltext
1:
    Inserted: Array of Integer;                    


aber immer wenn ich an diese stelle (<---- ...) komme bricht das programm ab und sagt "Zugriffsverletzung an Adresse....". Beim debuggen habe ich aber gesehen dass in der Variablen cIns = 0 steht und i = 2 also alles gültige werte.

Woran kann das liegen???

Gruß Andi


Moderiert von user profile icontommie-lie: Code- durch Delphi-Tags ersetzt


Christian S. - Mi 28.05.03 17:57

Hast Du die Größe des Arrays mit SetLength angegeben?


Alibi - Mi 28.05.03 17:58

Du musst bei dynamischen Arrays vorher mit SetLength die Größe festlegen.
Solltest du die nicht im vornerein wissen, dann mach das einfach so:
SetLength(MeinArray,High(MeinArray)+1);
Das vor jedem Einfügen eines neuen Elementes in das Array aufrufen.


Andi1982 - Mi 28.05.03 17:59

Oh, setlength hatte ich nicht drin, habs aber jetzt mal rein:


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
   cIns := 0;
   SetLength(Inserted,0);
   for i := 0 to listbox1.Items.Count - 1 do
   begin
      if listbox1.Selected[i] then
      begin
         InsertFelderFuellen(listbox1.Items.Strings[i]);
         If InsInterpret = 'FEHLER' then
         begin
            Messagedlg( 'Fehler bei Datei "' +
            listbox1.Items.Strings[i] + '"', mterror, [mbok], 0 );
            continue;
         end;
         inc(MaxId); // Neue Lied_ID
         query1.Active := False;
         query1.SQL.Clear;
         query1.SQL.Text := 'Insert into Lieder.db Values (' +
         IntToStr(MaxId) + ', ' + InsInterpret + ', ' + InsTitel + ', ' + InsRubrik +
         ', ' + InsPfad + ', ' + InsDatname + ')' ;
         query1.ExecSQL;
         SetLength(Inserted,High(Inserted)+1);
         Inserted[cIns] := i;
         inc(cIns);
      end;
   end;


Aber der fehler kommt trotzdem noch!!!!


Moderiert von user profile icontommie-lie: Code- durch Delphi-Tags ersetzt


Andi1982 - Mi 28.05.03 18:12

Hab auch schon überlegt obs an dem Namen "Inserted" liegt, aber umbenennen bringt auch nichts, ich glaub ich bin zu blöd für arrays!


Christian S. - Mi 28.05.03 18:13

Alibi hat folgendes geschrieben:
SetLength(MeinArray,High(MeinArray)+1);
Das vor jedem Einfügen eines neuen Elementes in das Array aufrufen.
Das sollte man vermeiden. Es ist vom Speicher her besser, den Befehl SetLength so wenig wie möglich zu benutzen. Also: wenn möglich, vorher ausrechnen, wie groß das Array sein soll und dann die Länge setzen.

@Andi1982: Du solltest Dir mal das Tutorial zu Arrays hier im Forum anschauen. SetLength legt, wie der Name schon sagt, die Länge des Arrays fest. Du setzt die Länge des Arrays auf Null. Da kannst Du dann natürlich nichts reinschreiben!

MfG,
Peter


Andi1982 - Mi 28.05.03 18:21

Ahhh, jetzt funktionierts!!

werde aber ne möglichkeit suchen das setlength nicht so oft zu benutzen!!

Danke!!