Entwickler-Ecke
Delphi Language (Object-Pascal) / CLX - Array in Deklarationszustand versetzen?
Stoffel1984 - Mi 03.09.03 12:41
Titel: Array in Deklarationszustand versetzen?
Hallo!
Ich habe ein dnyamisches Array welches in einer Schleife verwendet wird, welche sich wiederum in einer Schleife befindet. Das Array wird dynamisch mit Setlength vergrößert. Nun habe ich versucht das Array zu löschen. In meiner Verzweiflung ist mir nur Setlength(Array,0) eingefallen. Dies funktioniert aber nicht da ja dadurch das Fled 0 existiert. In meiner ersten Schleifenanweisung mache ich aber SetLength(Array,i+1). Es existiert also vor dem eigentlichen Datensatz ein leeres Feld welches mir Probleme bereitet. Langer Text aber kurze Frage: Wie setze ich das Array in den ZUstand der Deklaration zurück?
Danke schon mal,
Stoffel
Delete - Mi 03.09.03 14:01
vermutlich array.clear()
Christian S. - Mi 03.09.03 14:30
| DaBass hat folgendes geschrieben: |
| vermutlich array.clear() |
:?
| Stoffel1984 hat folgendes geschrieben: |
| Nun habe ich versucht das Array zu löschen. In meiner Verzweiflung ist mir nur Setlength(Array,0) eingefallen. Dies funktioniert aber nicht da ja dadurch das Fled 0 existiert. |
Nein, eigentlich nicht. Das Feld mit Index 0 würde existieren, wenn Du die Länge auf 1 setzt. Mit SetLength(array,0) sollte eigentlich kein Element mehr existieren. Alternativ kannst Du jedoch auch "Array := nil" verwenden.
Du solltest übrigens versuchen, die Verwendung von SetLength() zu minimieren, es macht Dein Programm sehr langsam.
MfG
Peter
Stoffel1984 - Mi 03.09.03 14:58
Hallo Peter!
Erstmal danke für deinen Beitrag. Hat mir allerdings wenig genutzt. Ich schreibe beim erneuten Betreten der Schleife immernoch ins zweite Feld :?
Anbei poste ich euch mal meinen Code:
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: 26: 27:
| for j := 0 to length(bulandarr)-1 do begin value := bulandarr[j]; AdsTable1.First; for i := 0 to count-1 do begin if (AdsTable1.FieldByName('Markiert').AsString = 'X') and (AdsTable1.FieldByName('Bundesland').AsString = value) then begin setlength(datenarr,i+1); datenarr[i] := CreateDatensatz(Param); end; AdsTable1.Next; end; try AssignFile(F,'StaDEUV_'+value+'.txt'); Rewrite(F); for k := 0 to length(datenarr)-1 do begin writeln(F,datenarr[k]); end; datenarr := nil; finally CloseFile(F); end; end; end; |
Hoffe ihr werdet daraus schlau 8)
Güße,
Stoffel
Brueggendiek - Mi 03.09.03 21:48
Hallo Stoffel!
Bist Du sicher, daß bei i=0 die IF-Anweisung erfüllt ist?
Prüfe mal den Wert von i beim ersten Durchlauf!
Dein Programm schreibt ins i-te Feld was rein, wenn eine Bedingung erfüllt ist. Ist die Bedingung nicht erfüllt, wird nichts geschrieben. Wird dann bei höherem Wert die Bedingung erfüllt, erzeugt das Setlength die unbelegten Felder gleich mit!
Nötig ist hier wohl ein zweiter Zähler, der die Länge des Zielfeldes erfasst. Alternative: die Größe des Feldes auswerten.
Gruß
Dietmar Brüggendiek
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!