![]() |
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 |
AW: Eintrag aus TStringListe löschen
Hallo p80286
danke fürs Zitieren; du hast wahrscheinlich meine Antwort weiter oben nicht gelesen - ich habe ja von for abgeraten und ziemlich genau den gleichen while Code gepostet wie nun du. ...und im gleichen Post auch den Tipp gegeben, mal in die Hilfedateien (oder in die Deklaration von TStringList) zu schauen und nach der (nicht existierenden) Eigenschaft Items zu suchen und Strings empfohlen. Bin raus - wir drehen uns in der Ellipse. Gute Nacht... Gruss M |
AW: Eintrag aus TStringListe löschen
Dann werfe ich noch etwas in den Raum. :stupid:
Strings ist die Standardeigenschaft von TStringList. Von daher würde auch ein
Delphi-Quellcode:
reichen. :cyclops:
liste[i]
|
AW: Eintrag aus TStringListe löschen
Macht es ein wenig mühsam, wenn du den Code änderst + nicht neu postest.
Wenn du einen Eintrag löscht, wird die Anzahl der Elemente geringer + deine for-Schleife erzeugt gegen Ende zu einen Indexfehler - weil die Grenzen/Werte für i nur 1x und zwar zu Beginn gesetzt werden. Dann ist es besser so: for i:=wortliste.items.count-1 downto 0 do begin if ... then wortliste.items.delete(i); end; |
AW: Eintrag aus TStringListe löschen
@Michael II
Pardon da hatte ich etwas verwechselt, ich wollte mich nicht mit Deinen Federn schmücken. Gruß K-H |
Alle Zeitangaben in WEZ +1. Es ist jetzt 15:59 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