Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Delphi Mehrere Listbox Einträge löschen (https://www.delphipraxis.net/87734-mehrere-listbox-eintraege-loeschen.html)

ebber 5. Mär 2007 12:50


Mehrere Listbox Einträge löschen
 
Hallo

ich habe jetzt dieses:

Delphi-Quellcode:

Listbox1.Items.Delete(Listbox1.ItemIndex);
Wie kann ich das bei Multiselect mit mehreren Einträgen machen ?

MfG

uwewo 5. Mär 2007 12:55

Re: Mehrere Listbox Einträge löschen
 
Delphi-Quellcode:
ListBox1.SelCount
liefert Dir die Anzahl der markierten Elemente.

Einfach eine Schleife programmieren

Delphi-Quellcode:
For i := 0 to ListBox1.SelCount-1 do

Pfoto 5. Mär 2007 13:11

Re: Mehrere Listbox Einträge löschen
 
Hi!

ich würde es so machen:

Delphi-Quellcode:
var
  i: integer;
begin
  i:= 0;
  repeat
    If Listbox1.Selected[i] then
      Listbox1.Items.Delete(i) else
      inc(i);
  until (i = Listbox1.items.count);

Gruß
Pfoto

Matze 5. Mär 2007 13:12

Re: Mehrere Listbox Einträge löschen
 
Die Codevervollständigung hilft häufig weiter ;)

Delphi-Quellcode:
ListBox1.DeleteSelected;

mkinzler 5. Mär 2007 13:14

Re: Mehrere Listbox Einträge löschen
 
@Pfoto: Beim Löschen, von oben anfangen!

uwewo 5. Mär 2007 13:15

Re: Mehrere Listbox Einträge löschen
 
Zitat:

Zitat von Pfoto
Hi!

ich würde es so machen:

Delphi-Quellcode:
var
  i: integer;
begin
  i:= 0;
  repeat
    If Listbox1.Selected[i] then
      Listbox1.Items.Delete(i) else
      inc(i);
  until (i = Listbox1.items.count);

Gruß
Pfoto

So würde es auch gehen, allerding möchte er ja nicht alle löschen

Delphi-Quellcode:
until (i = Listbox1.SelCount-1

IngoD7 5. Mär 2007 13:56

Re: Mehrere Listbox Einträge löschen
 
Zitat:

Zitat von uwewo
Zitat:

Zitat von Pfoto
Hi!

ich würde es so machen:

Delphi-Quellcode:
var
  i: integer;
begin
  i:= 0;
  repeat
    If Listbox1.Selected[i] then
      Listbox1.Items.Delete(i) else
      inc(i);
  until (i = Listbox1.items.count);

Gruß
Pfoto

So würde es auch gehen, allerding möchte er ja nicht alle löschen

Delphi-Quellcode:
until (i = Listbox1.SelCount-1

@uwewo
Du bist auf dem falschen Dampfer. Sieh doch mal in der Hilfe nach, was TListBox.Selected[] genau ist.

Abgesehen davon müsste die until-Anweisung wie folgt lauten, um nicht auf die Nase zu fallen, wenn der letzte Listeneintrag auch markiert war:
Delphi-Quellcode:
until i >= Listbox1.Count;
Abgesehen davon sollte man - wie hier schon erwähnt wurde - von oben löschen, also mit dem höchsten Index anfangen und runterzählen. Dann verhindert man zuverlässig die Möglichkeit, dass man sich "den Boden unter den Füßen weglöscht". ;)

Abgesehen davon gibt es - wie hier auch schon erwähnt wurde - ein TListBox.DeleteSelected.

Abgesehen davon .. ach nö, das reicht nun. :wink:

uwewo 5. Mär 2007 14:10

Re: Mehrere Listbox Einträge löschen
 
@Ingo, natürlich hast Du Recht, hätte mir eigentlich auffallen müssen :wall:

Delphi-Quellcode:
var i: integer;
begin
  i := Listbox1.Items.Count-1;
   repeat
    If Listbox1.Selected[i] then
      Listbox1.Items.Delete(i);
      dec(i);
  until (i < 0);
Vielleicht können wir uns darauf einigen :lol:

[Edit]
Delphi-Quellcode:
TListBox.DeleteSelected
gibt es nicht in allen Delphi Versionen.
[/Edit]

Khabarakh 5. Mär 2007 14:22

Re: Mehrere Listbox Einträge löschen
 
Was habt ihr denn gegen den armen Pfoto, sein Code ist vollkommen richtig - den einzigen kleinen Fehler habt ihr aber übersehen: EListError bei leeren Items.

Noch weniger zu sagen gibts natürlich gegen Matzes Methode ;) .

ebber 5. Mär 2007 15:03

Re: Mehrere Listbox Einträge löschen
 
Danke für eure Bemühungen. :thumb:

Da

Delphi-Quellcode:
TListBox.DeleteSelected;
bei mir geht denke ich mal es ist das einfachste.

MfG

IngoD7 5. Mär 2007 15:20

Re: Mehrere Listbox Einträge löschen
 
Zitat:

Zitat von Khabarakh
[...] [Pfotos] Code ist vollkommen richtig [...]

Nein (das hatte ich schon im Verlaufe dieses Threads erwähnt).
Wenn das letzte Element der Liste selektiert ist und gelöscht wird, dann ist in seinem Code danach i größer als ListBox.Items.Count. Dann hält die Schleife nicht an und es scheppert beim nächsten Schleifendurchlauf. :!:

Hawkeye219 5. Mär 2007 15:52

Re: Mehrere Listbox Einträge löschen
 
Hallo Ingo,

vielleicht hat dich nur die unglückliche Formatierung des Quelltextes irritiert. Nach dem Löschen des Elements wird der Schleifenzähler nicht erhöht und die Schleife damit aufgrund der erfüllten Abbruchbedingung beendet.

Gruß Hawkeye

Pfoto 5. Mär 2007 15:54

Re: Mehrere Listbox Einträge löschen
 
Zitat:

Zitat von IngoD7
Zitat:

Zitat von Khabarakh
[...] [Pfotos] Code ist vollkommen richtig [...]

Nein (das hatte ich schon im Verlaufe dieses Threads erwähnt).
Wenn das letzte Element der Liste selektiert ist und gelöscht wird, dann ist in seinem Code danach i größer als ListBox.Items.Count. Dann hält die Schleife nicht an und es scheppert beim nächsten Schleifendurchlauf. :!:

Also bei mir funktioniert mein Code auch bei Löschung des letzten Elementes in der Liste...
aber egal, Hauptsache, das Problem ist gelöst.

Gruß
Pfoto

IngoD7 5. Mär 2007 16:20

Re: Mehrere Listbox Einträge löschen
 
Zitat:

Zitat von Hawkeye219
Nach dem Löschen des Elements wird der Schleifenzähler nicht erhöht und die Schleife damit aufgrund der erfüllten Abbruchbedingung beendet.

:shock:

Zitat:

Zitat von Pfoto
Also bei mir funktioniert mein Code auch bei Löschung des letzten Elementes in der Liste...

:shock: :shock:

Zitat:

Zitat von Khabarakh
Was habt ihr denn gegen den armen Pfoto, sein Code ist vollkommen richtig - den einzigen kleinen Fehler habt ihr aber übersehen: EListError bei leeren Items.

:pale:
Zitat:

Zitat von IngoD7
Nein (das hatte ich schon im Verlaufe dieses Threads erwähnt).

:oops: :oops:

Ihr habt Recht. Ich nehme alles zurück und behaupte das Gegenteil. :wall: Sorry, Jungs!

Zitat:

Zitat von Hawkeye219
vielleicht hat dich nur die unglückliche Formatierung des Quelltextes irritiert.

Darauf kannst du wetten! Trotzdem schwaches Bild von mir ... :|


//Edit:
Khabarakhs Zitat vervollständigt (Stichwort: Fehler bei leerer Liste), um nicht noch mehr Verwirrung zu stiften.

Kedariodakon 5. Mär 2007 16:33

Re: Mehrere Listbox Einträge löschen
 
Nunja, Pfotos Code ist solange richtig, solange es mindestens ein Item gibt...
Bei einer leeren Liste fällt er mit der Funktion auf die Nase...

Performater und schöner wär es so:
Delphi-Quellcode:
Var i: Integer;
  For i := Listbox1.Items.Count - 1 Downto 0 Do Begin
    If Listbox1.Selected[ i ] Then Listbox1.Items.Delete( i );
  End;
Weil, nur eine einzige Abfrage in der Methode durchgeführt wird und nicht 2 wie bei
Pfoto...
Edit: Und weil diese auch bei leeren Listen funktioniert...

Viel Spass noch :zwinker:

Bye Christian


Alle Zeitangaben in WEZ +1. Es ist jetzt 22:25 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