Wenn du auf die globale Variable "Form1" zugreifen mußt, dann läuft da bestimmt irgendwas falsch.
Wenn man nach dem "einen" Löschen die Schleife abbricht, dann ist es egal, ob vor oder zurück. (wobei zurück theoretisch einen Hauch an Speicher und Bytecode einspart, also vermutlich eine millionstel Nanosekunde schneller würde)
Delphi-Quellcode:
//for var i := 0 to ListBox1.Items.Count - 1 do // egal wierum
for var i := ListBox1.Items.Count - 1 downto 0 do
if ListBox1.Items[i] = text then begin
ListBox1.Items.Delete(i);
Break;
end;
Alternativ geht es auch, wenn man vorher eine Kopie der Liste anfertigt, mit welcher dann gearbeitet wird.
Da ist es auch vollkommen egal, ob sich Indize verschieben, also Items gelöscht/erstellt/verschoben werden.
Delphi-Quellcode:
//for var S in ListBox1.Items do // ohne Kopie
for var S in ListBox1.Items.ToStringArray do
if S = text then
ListBox1.Items.Delete(ListBox1.Items.IndexOf(S));
Problem ist einfach, dass FOR sich vom SchleifenEnde zu Beginn eine Kopie macht und Diese verwendet.
Das ist bei WHILE und REPEAT anders.
Delphi-Quellcode:
// aus
for i := 0 to X.Length - 1 do
X.Delete(i);
// wird intern ein
Kopie := X.Length - 1;
for i := 0 to Kopie do
X.Delete(i); // hier ändert sich Length, aber dass bekommt die Schleife nicht mit
Drum funktioniert es rückwärts, da sich hierbei das untere Ende der Liste (0) nicht ändert.