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); 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
tommie-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); 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
tommie-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!!
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2026 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!