![]() |
Eintrag aus TStringListe löschen
Guten Tag,
kann mir jemand erklären wo mein Fehler in diesem Code ist?
Delphi-Quellcode:
Ich kriege einen Fehler angezeigt [dcc32 Fehler] Buchstabensuche.pas(118): E2003 Undeklarierter Bezeichner: 'Items'
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; MfG Edit: Müsste ich erst mit Get size, die Größe der Wortliste ermitteln? |
AW: Eintrag aus TStringListe löschen
Delphi-Quellcode:
und
wortliste.Count
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. |
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 |
AW: Eintrag aus TStringListe löschen
Zitat:
|
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 |
AW: Eintrag aus TStringListe löschen
Weil man bei einer vorwärts-laufenden Schleife sonst ggf. auf Items zugreift die nicht mehr existieren.
|
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. |
AW: Eintrag aus TStringListe löschen
Zitat:
|
AW: Eintrag aus TStringListe löschen
Zitat:
|
AW: Eintrag aus TStringListe löschen
Zitat:
a) entweder
Delphi-Quellcode:
oder
for i:=liste.count-1 downto 0 do
b)
Delphi-Quellcode:
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.
while i<liste.count do
if Bedingung then liste.Delete(i) else inc(i); Gruß K-H |
Alle Zeitangaben in WEZ +1. Es ist jetzt 23:01 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