Einzelnen Beitrag anzeigen

Benutzerbild von himitsu
himitsu
Online

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.062 Beiträge
 
Delphi 12 Athens
 
#5

AW: Listbox auslesen

  Alt 14. Jun 2024, 11:43
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.
Neuste Erkenntnis:
Seit Pos einen dritten Parameter hat,
wird PoSex im Delphi viel seltener praktiziert.

Geändert von himitsu (14. Jun 2024 um 11:45 Uhr)
  Mit Zitat antworten Zitat