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/)
-   -   Eintrag aus TStringListe löschen (https://www.delphipraxis.net/193726-eintrag-aus-tstringliste-loeschen.html)

G4schi 1. Sep 2017 15:08

Eintrag aus TStringListe löschen
 
Guten Tag,

kann mir jemand erklären wo mein Fehler in diesem Code ist?

Delphi-Quellcode:
procedure TForm1.btn_deleteClick(Sender: TObject);
var wortliste: TStringList;
    sWort: String;
begin
    wortliste := TStringList.Create;
    try
       wortliste.LoadFromFile('Wortliste.txt');
       sWort:=ed_eintragen.Text;
       for i:=0 to wortliste.Items.Count -1 do
       begin
         if wortliste.Items[i] = sWort then
         wortliste.Delete(wortliste.Items[i]);
       end;
       wortliste.SaveToFile('Wortliste.txt');
    finally
      wortliste.Free;
    end;

end;
Ich kriege einen Fehler angezeigt [dcc32 Fehler] Buchstabensuche.pas(118): E2003 Undeklarierter Bezeichner: 'Items'


MfG

Edit: Müsste ich erst mit Get size, die Größe der Wortliste ermitteln?

SProske 1. Sep 2017 15:19

AW: Eintrag aus TStringListe löschen
 
Delphi-Quellcode:
wortliste.Count
und
Delphi-Quellcode:
wortliste[I]

Außerdem solltest du zum Löschen eine downto-Schleife verwenden. Und TStringList.Delete erwartet den Index, nicht den zu löschenden String.

Jumpy 1. Sep 2017 15:22

AW: Eintrag aus TStringListe löschen
 
Ich glaube Delete braucht entweder nur den Index, also:
wortliste.Delete(i)

Oder du Deletest direkt ein Item, dann:
wortliste.Items[i].Delete
bzw:
wortliste[i].Delete


Auf jeden Fall solltest du aber die Schleife rückwärts laufen lassen, sonst hast du den nächsten Fehler:

for i:=wortliste.Items.Count -1 downto 0 do

Uwe Raabe 1. Sep 2017 15:27

AW: Eintrag aus TStringListe löschen
 
Zitat:

Zitat von Jumpy (Beitrag 1380140)
Oder du Deletest direkt ein Item, dann:
wortliste.Items[i].Delete
bzw:
wortliste[i].Delete

Ein String kennt aber keine Methode Delete (zumindest noch nicht - und wenn, würde sie etwas anders tun).

G4schi 1. Sep 2017 15:27

AW: Eintrag aus TStringListe löschen
 
Ok, danke ich werde das testen.

Könnt ihr erklären, wieso es ratsam wäre die Schleife Rückwärts laufen zu lassen?


MfG

Glados 1. Sep 2017 15:28

AW: Eintrag aus TStringListe löschen
 
Weil man bei einer vorwärts-laufenden Schleife sonst ggf. auf Items zugreift die nicht mehr existieren.

Michael II 1. Sep 2017 15:47

AW: Eintrag aus TStringListe löschen
 
Ich empfehle dir immer möglichst auf Wiederverwendbarkeit zu achten, indem du solche Aufgaben in eine Prozedur/Funktion auslagerst. Mit der Zeit hast du einen Pool von Funktionen, welche du bei Bedarf einfach nur noch in deinen Code kopieren kannst.

Also etwa so:
Wort:string aus liste:TStringList entfernen:

Delphi-Quellcode:
procedure wort_aus_liste_entfernen( wort : string; liste : TStringList );
var i : integer;
begin
  i := 0;
  while i < liste.Count do
    if liste.strings[i] = wort then liste.Delete( i ) else inc(i);
end;

Dein "Items-Fehler": Fahr mal mit dem Mauszeiger auf TStringList und drücke F1, dann dort unter Eigenschaften und suche nach der Eigenschaft Items. TStringList kennt übrigens die Eigenschaft Strings.

for Schleife: Wie andere bereits erwähnt haben: Du definierst eine for... Schleife. Enthält deine Liste zum Beispiel 1000 Einträge, dann wird deine Schleife 1000 Mal durchlaufen. Wenn du nun innerhalb dieser Schleife Listenelemente löschst, dann greifst du irgendwann via Index i auf Listenelemente zu, welche es an Position i gar nicht mehr gibt.

Uwe Raabe 1. Sep 2017 16:57

AW: Eintrag aus TStringListe löschen
 
Zitat:

Zitat von Michael II (Beitrag 1380144)
Wenn du nun innerhalb dieser Schleife Listenelemente löschst, dann greifst du irgendwann via Index i auf Listenelemente zu, welche es an Position i gar nicht mehr gibt.

Insbesondere werden dann auch nicht mehr alle Strings überprüft. Kommt das Wort nämlich zweimal direkt hintereinander vor, rutscht einem das zweite Vorkommen durch die Lappen.

Michael II 1. Sep 2017 18:02

AW: Eintrag aus TStringListe löschen
 
Zitat:

Zitat von Uwe Raabe (Beitrag 1380151)
Insbesondere werden dann auch nicht mehr alle Strings überprüft. Kommt das Wort nämlich zweimal direkt hintereinander vor, rutscht einem das zweite Vorkommen durch die Lappen.

Natürlich; daran hatte ich auch gedacht (siehe Code: entweder Element löschen oder Index rauf), ich hätt's auch schreiben sollen :).

p80286 1. Sep 2017 23:13

AW: Eintrag aus TStringListe löschen
 
Zitat:

Zitat von Michael II (Beitrag 1380152)

Natürlich; daran hatte ich auch gedacht (siehe Code: entweder Element löschen oder Index rauf), ich hätt's auch schreiben sollen :).

innerhalb einer for..to Schleife solltest Du bei einer solchen Vorgehensweise auf wenig Gegenliebe stoßen.
a) entweder
Delphi-Quellcode:
for i:=liste.count-1 downto 0 do
oder
b)
Delphi-Quellcode:
while i<liste.count do
     if Bedingung then liste.Delete(i)
     else inc(i);
c) Die TStringlist kennt keine Items, sondern Strings also statt Liste.Items[i] Liste.Strings[i]. Die Syntax von Liste.Delete ist in beiden Fällen , Tlist, Tstringlist, die gleiche.

Gruß
K-H


Alle Zeitangaben in WEZ +1. Es ist jetzt 01:07 Uhr.
Seite 1 von 2  1 2      

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz