AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Listbox auslesen

Ein Thema von oldmann · begonnen am 14. Jun 2024 · letzter Beitrag vom 17. Jun 2024
Antwort Antwort
oldmann

Registriert seit: 10. Okt 2008
Ort: Weyhe
152 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#1

Listbox auslesen

  Alt 14. Jun 2024, 09:53
Hallo,
ich habe folgendes Problem.
Ich habe eine For Schleife mit der ich eine Listbox auslese.
Stimmt der Wert in Listbox1, dann wird der Wert in Listbox2 geschrieben.
Stimmt der Wert nicht, wird er mit Delete gelöscht.
Dadurch stimmt aber Form1.ListBox1.Items.Count nicht mehr und es gibt eine Fehlermeldung.
Meine Frage lautet: Wie kann ich das Problem lösen???
Gruss Oldmann

for i := 0 to Form1.ListBox1.Items.Count-1 do
if Form1.ListBox1.Items[i] = text then
Begin
Form5.ListBox2.Items.Add(Form1.ListBox1.Items[i]);
End else
begin
Form1.ListBox1.Items.Delete(i);
end;
  Mit Zitat antworten Zitat
Benutzerbild von dummzeuch
dummzeuch

Registriert seit: 11. Aug 2012
Ort: Essen
1.603 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#2

AW: Listbox auslesen

  Alt 14. Jun 2024, 10:03
Üblicherweise durch eine for Schleife von count-1 bis 0:

Delphi-Quellcode:
for i := Form1.ListBox1.Items.Count-1 downto 0 do begin
// hier verarbeiten
end;
Das hat allerdings den Nachteil, dass in der listbox2 dann die Einträge in umgekehrter Reihenfolge erscheinen. Das kann man lösen, indem man Insert(0, ...) statt Add(...) verwendet.
Thomas Mueller
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.623 Beiträge
 
Delphi 12 Athens
 
#3

AW: Listbox auslesen

  Alt 14. Jun 2024, 10:24
Oder man nimmt eine while-Schleife, dann darf man aber nicht vergessen, die Laufvariable auch zu erhöhen, sonst kommt man da ggf. nie wieder raus.
Aus dem Kopf:
Delphi-Quellcode:
i := 0;
while i < ListBox.Items.Count do
  begin
    if Bedingung then
      begin
        TuWas;
        inc(i);
      end
    else
      ListBox.Items.Delete(i);
  end;
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
oldmann

Registriert seit: 10. Okt 2008
Ort: Weyhe
152 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#4

AW: Listbox auslesen

  Alt 14. Jun 2024, 10:28
Hallo,

danke an die beiden Antworten.
Das hat mir sehr geholfen.
Jetzt klappt es.
Gruss Oldmann
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

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
Hobbycoder

Registriert seit: 22. Feb 2017
955 Beiträge
 
#6

AW: Listbox auslesen

  Alt 17. Jun 2024, 12:46
Ich hätte da auch noch eine Möglichkeit:

Delphi-Quellcode:
procedure xyz(SuchStr: string);
var
  i: Integer;
  sl: TStringList;
begin
  sl:=TStringList.Create;
  try
    sl.assign(Listbox1.items);
    for i:=0 to sl.count-1 do
      if sl[i].contains(SuchStr) then //oder if pos(SuchStr, SL[i])>0 then
      begin
        ListBox2.Items.Add(sl[i]);
        ListBox1.items.delete(ListBox1.items.IndexOf(sl[i]));
      end;
  finally
     sl.free;
  end;
end;
So würde die Reihenfolge von ListBox2 nicht ungekehrt.
Gruß Hobbycoder
Alle sagten: "Das geht nicht.". Dann kam einer, der wusste das nicht, und hat's einfach gemacht.
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe

Registriert seit: 20. Jan 2006
Ort: Lübbecke
11.452 Beiträge
 
Delphi 12 Athens
 
#7

AW: Listbox auslesen

  Alt 17. Jun 2024, 13:12
Ein ganz anderer Ansatz wäre MoveSelection (geht aber nur wenn MultiSelect = true ist):
Delphi-Quellcode:
  for var I := 0 to ListBox1.Count - 1 do
    ListBox1.Selected[I] := (ListBox1.Items[I] = text);
  ListBox1.MoveSelection(ListBox2);
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 18:48 Uhr.
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