![]() |
TStringlist: Delete in einer Schleife
Hallo DP,
sicherlich könnt Ihr mir wieder weiterhelfen: Ich "hänge" an einem Problem: Ich habe eine Schleife die von 1 to t.count läuft:
Delphi-Quellcode:
Da sich t.count in der Schleife verringert, bekomme ich natürlich einen Bereichsfehler.
//T ist t:Stringlist //
for i=1 to t.count do begin if t[i]:=Suchstring then t.delete[i] end; Hat da jemand eine Ahnung, wie ich dies umgehen kann? Vielen Dank für die Mühe im voraus. :hi: Go2EITS |
Re: TStringlist: Delete in einer Schleife
dann baue einfach ein if i <= t.count ein ;)
|
Re: TStringlist: Delete in einer Schleife
Delphi-Quellcode:
for i:=t.count-1 downto 0 do
begin if t[i]:=Suchstring then t.delete[i] end; downto ist dein freund ;) |
Re: TStringlist: Delete in einer Schleife
Delphi-Quellcode:
Listen sind nebenbei 0-basiert. Von 1 bis t.count kriegst du sowieso ne Exception.
I:=0;
while I=0<t.count do begin if t[I]:=Suchstring then t.delete[I]; inc(I); end; |
Re: TStringlist: Delete in einer Schleife
Zitat:
Delphi-Quellcode:
i := 0;
while i < list.Count do begin if list[i] = Suchstring then List.Delete(i) else Inc(i); end; // bzw repeat if list[i] = Suchstring then List.Delete(i) else Inc(i); until i = List.Count; |
Re: TStringlist: Delete in einer Schleife
@3_of_8
Manuel, das ist noch kein PASCAL. Und warum überprüfst du nicht immer alle Elemente der Liste? //Edit Den zweiten Satz darf Dax auch lesen :wink: Gruß Hawkeye |
Re: TStringlist: Delete in einer Schleife
Zitat:
Gruß Christian |
Re: TStringlist: Delete in einer Schleife
Zitat:
Es waere nicht nur in diesem Fall suboptimal, wenn ich 10 Elemente in der Liste habe, aber Count mir angibt, ich haette 15 drinnenliegen ;) greetz Mike |
Re: TStringlist: Delete in einer Schleife
Zitat:
|
Re: TStringlist: Delete in einer Schleife
und noch eine Schleife:
Delphi-Quellcode:
Grüße
while t.IndexOf(suchstring) > -1 do
t.delete(t.indexOf(suchstring); Klaus |
Re: TStringlist: Delete in einer Schleife
Zitat:
Ansonsten ist es auch ok. |
Re: TStringlist: Delete in einer Schleife
Zitat:
so wie ich es sehen wird die while schleife so lange wiederholt bis der Suchstring nicht mehr gefunden wird (-1). Nachdem der erste Eintrag gefunden wurde, wird er gelöscht. Bei einem weiteren Durchlauf wird wenn ein zweiter Eintrag gefunden. Grüße Klaus |
Re: TStringlist: Delete in einer Schleife
....ups hast Recht, sry *schäm*
Die Schleife funktioniert. |
Re: TStringlist: Delete in einer Schleife
@Alle:
Vielen Dank für Eure schnellen und, für mich zumindestens, so interessanten Antworten. Genau das ist das Problem: Wenn List.count = 10 ist, wird mit List.delete list.count zu 9. Die übliche for-Schleife bringt einen Bereichserror. Ich probiere die Lösung mit
Delphi-Quellcode:
Sie erscheint diese Lösung die Schlüssigste zu sein.
for I=List.count downto 0
Ich verfolge aber sehr aufmerksam die Diskussion mit While/repeat. Wenn mein Code läuft, probiere ich mal die Repeat/Whileversion aus. Vielen Dank und ich berichte, wie es läuft. :hi: |
Re: TStringlist: Delete in einer Schleife
Das wäre falsch, wenn dann
Delphi-Quellcode:
du hast die -1 bei Count vergessen.
For i := List.Count-1 DownTo 0 Do
Und zu der angemerkten Repeat/Until Schleife: Die ist nur richtig, wenn man vorher sicherstellt, dass mindestens ein Element in der Liste enthalten ist, weil er beim ersten Durchlauf sofort auf das i. Element zugreift, wobei i wohl mit 0 initialisiert worden ist. Daher: immer aufpassen bei Fuss-gesteuerten Schleifen, da die Bedingung immer erst nach einem Durchlauf überprüft wird. Und dann noch zu der Count Read Only Anmerkung: Dies kann man nur auf TStrings und seine Nachfahren anwenden, bei anderen Liste wie z.B. von TList abgeleitet ist Count setzbar um eine bessere Speicheroptimierung zu erreichen. Wenn man weiss dass man 40 Einträge hinzufügt, kann man bei den Listen dieses Optimierter gestalten. |
Re: TStringlist: Delete in einer Schleife
Zitat:
Delphi-Quellcode:
for i := List.count -1 downto 0 do
begin if List[i] = Suchstring then List.delete[i] end; |
Re: TStringlist: Delete in einer Schleife
@Muetze1
Habe meinen Fehler mit List.count vom Compiler um die Ohren bekommen und in list.count-1 geändert. Es klappt mit dem Downto prima. Die While/Repeat-Schleifen sind für den Zweck etwas umständlich. [EDIT] Die Lösung von Klaus01 funktioniert doch besten! Ich habees gerade ausprobiert. [\EDIT] Super Antworten, da hat man sein Brain V1.0 ein wenig anstrengen müssen. Vielen Dank, kann nun weiter arbeiten! :thumb: Go2EITS @Tyrael Y. genauso habe ich es gelöst! |
Re: TStringlist: Delete in einer Schleife
Zitat:
IndexOf ist etwas anderes als TstringList.count. Grüße Klaus |
Re: TStringlist: Delete in einer Schleife
@Klaus01
Habe gerade Deinen Vorschlag ausprobiert. Du hast recht. Es geht. :shock: Ich habe meinen Beitrag oben schnell geändert. :hi: Vielen Dank! |
Alle Zeitangaben in WEZ +1. Es ist jetzt 23:56 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz