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/)
-   -   Ein Eintrag aus einer Listbox entfernen (https://www.delphipraxis.net/168591-ein-eintrag-aus-einer-listbox-entfernen.html)

smart 29. Mai 2012 23:34

Ein Eintrag aus einer Listbox entfernen
 
Hallo
ich wollte einen Eintrag aus einer ListBox entfernen. bekomme aber immer die Fehlermeldung: maximaler Index.....

Delphi-Quellcode:
 if ListBox1.Selected[i] = True then
       ListBox1.Items.Delete(i);
Wieso klappt der Code nicht.

Luckie 29. Mai 2012 23:39

AW: Ein Eintrag aus einer Listbox entfernen
 
Liegt er in einer Schleife und läuft die Schleife vorwärts? Also das sagt mir jetzt so meine Glaskugel. Lass die Schleife mal rückwärts laufen, dann sollte es gehen.

Bjoerk 29. Mai 2012 23:40

AW: Ein Eintrag aus einer Listbox entfernen
 
Versuch' mal so:

Prüfung auf true ist nicht schön und eventl. den Index überprüfen

Delphi-Quellcode:
  if I > -1 then
    if I < ListBox1.Items.Count then
      if ListBox1.Selected[I] then
        ListBox1.Items.Delete(I);
Gruß
Thomas

madtom 29. Mai 2012 23:44

AW: Ein Eintrag aus einer Listbox entfernen
 
Ich habe meinen Delphi Rechner gerade nicht an, aber mal ins Blaue Geräten:

ListBox1.Items[i].Delete;

Bjoerk 29. Mai 2012 23:49

AW: Ein Eintrag aus einer Listbox entfernen
 
ListBox1.DeleteSelected;

smart 30. Mai 2012 00:00

AW: Ein Eintrag aus einer Listbox entfernen
 
Zitat:

Zitat von Bjoerk (Beitrag 1168656)
Versuch' mal so:

Prüfung auf true ist nicht schön und eventl. den Index überprüfen

Delphi-Quellcode:
  if I > -1 then
    if I < ListBox1.Items.Count then
      if ListBox1.Selected[I] then
        ListBox1.Items.Delete(I);
Gruß
Thomas

OK die Fehlermeldung ist weg, aber jetzt wird auch nichts mehr gelöscht.

Luckie 30. Mai 2012 00:03

AW: Ein Eintrag aus einer Listbox entfernen
 
Zeig doch mal etwas mehr Code. So könne wir nur raten, was du da machst.

smart 30. Mai 2012 00:06

AW: Ein Eintrag aus einer Listbox entfernen
 
Zitat:

Zitat von Luckie (Beitrag 1168665)
Zeig doch mal etwas mehr Code. So könne wir nur raten, was du da machst.

Delphi-Quellcode:
procedure TForm12.RbButton4Click(Sender: TObject);
var
  i: Integer;
 begin
  if I > -1 then
     if I < ListBox1.Items.Count then
       if ListBox1.Selected[I] then
         ListBox1.Items.Delete(I);
 end;
mehr Code habe ich nicht.

BUG 30. Mai 2012 00:12

AW: Ein Eintrag aus einer Listbox entfernen
 
Zitat:

Zitat von smart (Beitrag 1168664)
OK die Fehlermeldung ist weg, aber jetzt wird auch nichts mehr gelöscht.

Das würde bedeuten, das dein Index nicht in den richtigen Grenzen liegt.

Kein Wunder:
Delphi-Quellcode:
I
wird nie initialisiert, kann also jeden beliebigen Wert haben.
Welchen Eintrag willst du denn löschen?

Zitat:

Zitat von Bjoerk (Beitrag 1168656)
und eventl. den Index überprüfen

Dann aber lieber mit Exception oder zumindest Assert.
Sonst passiert genau das, was eben passiert ist: Nichts geht mehr und keiner weiß warum.

EDIT: Glaskugel an!
Delphi-Quellcode:
procedure TForm12.RbButton4Click(Sender: TObject);
var
  i: Integer;
 begin
  for i := ListBox1.Items.Count - 1 downto 0 do
       if ListBox1.Selected[i] then
         ListBox1.Items.Delete(i);
 end;

Bjoerk 30. Mai 2012 00:19

AW: Ein Eintrag aus einer Listbox entfernen
 
#5 geht auch für MultiSelected. :?

smart 30. Mai 2012 00:40

AW: Ein Eintrag aus einer Listbox entfernen
 
Ja, jetzt klappt es. vielen Dank an euch allen!

Popov 30. Mai 2012 00:41

AW: Ein Eintrag aus einer Listbox entfernen
 
Wenn du einen bestimmten Item löschen willst, dann

Delphi-Quellcode:
var
  i: Integer;
begin
  i := 2; //Beispiel für das dritte Item
  if I > -1 then
     if I < ListBox1.Items.Count then
       ListBox1.Items.Delete(I);
end;
Wenn du einen ausgewählten Item löschen willst

Delphi-Quellcode:
  if ListBox1.ItemIndex > -1 then
    ListBox1.Items.Delete(ListBox1.ItemIndex);
Solltest du mit Multiselect mehrere Items löschen willst, denn

Delphi-Quellcode:
var
  i: Integer;
begin
  for i := ListBox1.Items.Count - 1 downto 0 do
    if ListBox1.Selected[I] then
      ListBox1.Items.Delete(I);
end;
Achte aber dabei IMMER, dass du runterzählst, sonst kommt der maximaler Index Fehler. Grund, wenn der erst und letzte Item gewählt sind und du den ersten Item löscht, ändert sich die Position des letzten Items. Wenn du runterzählst ist es egal.

Delphi-Laie 30. Mai 2012 19:11

AW: Ein Eintrag aus einer Listbox entfernen
 
Zitat:

Zitat von smart (Beitrag 1168654)
Delphi-Quellcode:
if ListBox1.Selected[i] = True then

Boolsche Variablen nicht mit Wahrheitswerten vergleichen: "if ListBox1.Selected[i] then" reicht völlig!

Daniel 30. Mai 2012 19:45

AW: Ein Eintrag aus einer Listbox entfernen
 
Zitat:

Zitat von Delphi-Laie (Beitrag 1168786)
Boolsche Variablen nicht mit Wahrheitswerten vergleichen: "if ListBox1.Selected[i] then" reicht völlig!

Bei Delphi Dank seiner strikten Typisierung ist das halb so schlimm, "TRUE" kann als Konstante angesehen werden, gegen die ich andere boolsche Variablen bedenkenlos und fehlerfrei vergleichen kann. Kritischer wird es bei anderen Programmiersprachen, die i.A. lediglich "FALSE" als konstanten Wert "0" annehmen und jeden beliebigen Wert <> "0" als "TRUE" behandeln.

//edit: Ich möchte dies keinesfalles als schönen Stil propagieren - doch ist es mir wichtig, bei solchen Aussagen wie "mache nie dies oder jenes" wenigstens eine kurze Erläuterung zu liefern.

Furtbichler 31. Mai 2012 07:46

AW: Ein Eintrag aus einer Listbox entfernen
 
Daniel, das Problem sind die Typecasts: Dann ist gibt es neben TRUE und FALSE auch Werte, die zwar wie TRUE aussehen, sich aber merkwürdig verhalten. Das ist aber ein anderes Thema.

Daniel 31. Mai 2012 09:00

AW: Ein Eintrag aus einer Listbox entfernen
 
Ich mache mal ein neues Thema auf. ;-)

//edit: Spannend. Ich sehe gerade, dass sich in Delphi das Verhalten geändert hat. Meine Beispiele von XE2 liefern unter Delphi 2007 andere Ergebnisse. Unter XE2 konnte ich gestern Abend casten wie ich wollte und hatte stets das korrekte Resultat, unter D2007 sieht das schon anders aus.

himitsu 31. Mai 2012 09:34

AW: Ein Eintrag aus einer Listbox entfernen
 
Zitat:

Zitat von Popov (Beitrag 1168671)
Delphi-Quellcode:
var
  i: Integer;
begin
  i := 2; //Beispiel für das dritte Item
  if I > -1 then
     if I < ListBox1.Items.Count then
       ListBox1.Items.Delete(I);
end;

Gerade sowas empfand ich nicht als Lösung.

Da wäre es ohne IF wesentlich benutzerfreundlicher.
Delphi-Quellcode:
var
  i: Integer;
begin
  i := 2; //Beispiel für das dritte Item
  ListBox1.Items.Delete(I);
end;
Denn so oder so, es wird nichts gelöscht, obwohl man was löschen will.
Nur daß dabei einfach nichts passiert ... nichtmal eine Fehlermeldung.


Besser den Fehler beheben (aufpassen, daß i den korrtekten Wert bekommt),
als den Fehler still und heimlich zu verschweigen, wo sich bestenfalls jemand wundert, daß irgendwas fehlt. (falls es überhaupt auffiehl, daß was nicht stimmte).



Das ist ja fast so schlimm wie ein
Delphi-Quellcode:
try
  // wichtige Daten speichern, welche unbedingt gespeichert den müssen
  // oder wichtigen Befehl ausführen, welcher unbedingt ausgeführt werden sollte
  // oder ...
except
end;

// keiner hast was gemerkt

Popov 31. Mai 2012 10:39

AW: Ein Eintrag aus einer Listbox entfernen
 
Zitat:

Zitat von himitsu (Beitrag 1168881)
Denn so oder so, es wird nichts gelöscht, obwohl man was löschen will.
Nur daß dabei einfach nichts passiert ... nichtmal eine Fehlermeldung.

Gut, mag das bei Delete so sein, wusste ich nicht, ist aber Logisch, da man nicht auf das Item als solches zugreift. Trotzdem ist nicht verkehrt vorher abzufragen, auch wenn ich es selbst anders mache. Hier habe ich den Code nur kopiert und ergänzt.


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