Autor Beitrag
Stoffel1984
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 219

Win NT, Win 2000
D6 Prof
BeitragVerfasst: Mi 03.09.03 12:41 
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
DaBass
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Mi 03.09.03 14:01 
vermutlich array.clear()
Christian S.
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 20451
Erhaltene Danke: 2264

Win 10
C# (VS 2019)
BeitragVerfasst: 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

_________________
Zwei Worte werden Dir im Leben viele Türen öffnen - "ziehen" und "drücken".
Stoffel1984 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 219

Win NT, Win 2000
D6 Prof
BeitragVerfasst: 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:

ausblenden 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    //Werte in tabelle suchen
  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);  //<-----Hier zeigt der Debugger die Werte im 2 .Feld
        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;   //<----Hier muss zurückgesetzt werden
    finally
      CloseFile(F);
    end;
  end;
end;



Hoffe ihr werdet daraus schlau 8)

Güße,

Stoffel
Brueggendiek
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 304

Win 98, Win98SE, Win XP Home
D5 Std
BeitragVerfasst: 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