Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi TStringlist: Delete in einer Schleife (https://www.delphipraxis.net/76500-tstringlist-delete-einer-schleife.html)

Go2EITS 5. Sep 2006 15:29


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:
//T ist t:Stringlist //
for i=1 to t.count do
    begin
    if t[i]:=Suchstring then t.delete[i]
    end;
Da sich t.count in der Schleife verringert, bekomme ich natürlich einen Bereichsfehler.
Hat da jemand eine Ahnung, wie ich dies umgehen kann?

Vielen Dank für die Mühe im voraus. :hi:
Go2EITS

Meflin 5. Sep 2006 15:31

Re: TStringlist: Delete in einer Schleife
 
dann baue einfach ein if i <= t.count ein ;)


Tyrael Y. 5. Sep 2006 15:32

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 ;)

3_of_8 5. Sep 2006 15:32

Re: TStringlist: Delete in einer Schleife
 
Delphi-Quellcode:
I:=0;
while I=0<t.count do
begin
  if t[I]:=Suchstring then t.delete[I];
  inc(I);
end;
Listen sind nebenbei 0-basiert. Von 1 bis t.count kriegst du sowieso ne Exception.

Dax 5. Sep 2006 15:38

Re: TStringlist: Delete in einer Schleife
 
Zitat:

Zitat von Tyrael Y.
downto ist dein freund ;)

Der andere Freund hieße repeat oder while.

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;

Hawkeye219 5. Sep 2006 15:43

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

Bowler 5. Sep 2006 15:47

Re: TStringlist: Delete in einer Schleife
 
Zitat:

Zitat von Dax
Zitat:

Zitat von Tyrael Y.
downto ist dein freund ;)

Der andere Freund hieße repeat oder while.

Delphi-Quellcode:
i := 0;
while i < list.Count do
begin
  if list[i] = Suchstring then
    List.Delete(i);
  Inc(i);
end;

// bzw

repeat
  if list[i] = Suchstring then
    List.Delete(i);
  Inc(i);
until i = List.Count;

Aber auch nur, wenn list.Count bei jedem Durchlauf aktualisiert wird. Ansonsten gibt es IMHO den gleichen Fehler, wie in einer for-Schleife, da die while- oder repeat-Schleife dann übers Ziel hinaus läuft.

Gruß
Christian

JasonDX 5. Sep 2006 15:54

Re: TStringlist: Delete in einer Schleife
 
Zitat:

Zitat von Bowler
Aber auch nur, wenn list.Count bei jedem Durchlauf aktualisiert wird. Ansonsten gibt es IMHO den gleichen Fehler, wie in einer for-Schleife, da die while- oder repeat-Schleife dann übers Ziel hinaus läuft.

Count ist eine ReadOnly-Property, welche beim Hinzufuegen und Entfernen eines Elementes, bzw. dem Loeschen der gesamten Liste immer aktualisiert wird.
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

Angel4585 5. Sep 2006 15:56

Re: TStringlist: Delete in einer Schleife
 
Zitat:

Zitat von Tyrael Y.
Delphi-Quellcode:
for i:=t.count-1 downto 0 do
begin
  if t[i]:=Suchstring then t.delete[i]
end;

downto ist dein freund ;)

Da schliess ich mich an.. so mach ich das auch immer

Klaus01 5. Sep 2006 16:02

Re: TStringlist: Delete in einer Schleife
 
und noch eine Schleife:

Delphi-Quellcode:
while t.IndexOf(suchstring) > -1 do
  t.delete(t.indexOf(suchstring);
Grüße
Klaus


Alle Zeitangaben in WEZ +1. Es ist jetzt 22:43 Uhr.
Seite 1 von 2  1 2      

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 by Thomas Breitkreuz