Autor Beitrag
LuMa86
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 76



BeitragVerfasst: Do 27.06.13 20:39 
Moin,
ich weiß nicht ganz wie ich es erklären soll. Ich habe ein Array. In einer for-Schleife soll eine Gegebenheit geprüft werden und wenn diese zutrifft ein Eintrag entfernt werden. Allerdings ist das ein Problem, den die Schleife sieht wie folgt aus:

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
for i := 0 to (Length(Events) - 1do
      if MArray[i].Name = NameVar then
      begin
        DeleteElement(MArray, i);
        Break;
      end;


Wenn ich jetzt ein Element aus dem Array lösche, stimmt die Länge natürlich nicht mehr, nach der das Programm aber zählt. Zwangsläufig versucht das Programm dann also außerhalb des Arrays eine Aktion durchzuführen was wiederum zu einer Exception führt. In einer Zählschleife kann ich "i" nicht von Hand verändern, daher meine Frage, wie ich das am besten löse. Ich hätte an eine Kombination von Break gedacht und die Schleife dann neu starten, aber das wirkt alles etwas überdimensioniert. Gibt es da keine einfachere integrierte Lösung?

Danke,
LuMa


Moderiert von user profile iconNarses: Topic aus Sonstiges (Delphi) verschoben am Do 27.06.2013 um 20:47
Marc.
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 1876
Erhaltene Danke: 129

Win 8.1, Xubuntu 15.10

BeitragVerfasst: Do 27.06.13 20:44 
Durchlaufe die Schleife einfach rückwärts. ;)

ausblenden Delphi-Quelltext
1:
for i := (Length(Events) - 1downto 0 do					

Für diesen Beitrag haben gedankt: LuMa86
LuMa86 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 76



BeitragVerfasst: Do 27.06.13 20:49 
Tatsächlich :o Funktioniert super. Muss mir diese Standartsachen nochmal reinfahren :oops:
IhopeonlyReader
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 600
Erhaltene Danke: 23


Delphi 7 PE
BeitragVerfasst: Do 27.06.13 22:54 
Und anstatt Length(Events)-1 sollteste am besten High(Events) verwenden und anstatt 0 evt Low(Events) (wobei low hier ja immer konstant ist, also auch direkt 0 geschrieben werden kann)

_________________
Sucht "neueres" Delphi :D
Wer nicht brauch was er hat, brauch auch nicht was er nicht hat!

Für diesen Beitrag haben gedankt: LuMa86
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19339
Erhaltene Danke: 1752

W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: Fr 28.06.13 06:20 
Wobei es schneller ist die Schleife normal durchzugehen und die Elemente nur umzukopieren, die nach den zu löschenden kommen und am Ende einmal das Array zu verkleinern. Deine DeleteElement Funktion macht das vermutlich für jeden zu löschenden Eintrag, das ist sehr ineffizient...

user profile iconLuMa86 hat folgendes geschrieben Zum zitierten Posting springen:
Tatsächlich :o Funktioniert super. Muss mir diese Standartsachen nochmal reinfahren :oops:
Welche Arten eines Standes?
www.k-faktor.com/standart/