Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi TListBox: Löschen von markierten Elementen (https://www.delphipraxis.net/66654-tlistbox-loeschen-von-markierten-elementen.html)

Kill0r 2. Apr 2006 00:50


TListBox: Löschen von markierten Elementen
 
Hi!
Ich habe mal wieder ein Problem.
Ich denke es ist eher ein Denkfehler von mir ^^
Also kommen wir zur Sache:
Ich habe eine TListBox in der ich mehrere Elemente, welche markiert sind, löschen möchte.
Leider funktioniert das nicht wirklich, das heisst es gibt eine Exception mit einem EListError der lautet: "Listenindex überschreitet das Maximum (3)"
Ich versuche das Löschen über folgenden Code:
Delphi-Quellcode:
procedure TfrmMain.btnDeleteClick(Sender: TObject);
var
  index: integer;
begin
  for index := 0 to listSource.Count-1 do
  begin
    if listSource.Selected[index] then
    begin
      DeleteFromList(index);
    end;
  end;
end;
Und hier der Quellcode von der Prozedur "DeleteFromList":
Delphi-Quellcode:
procedure DeleteFromList(id: integer);
var
  pic: integer;
begin
  if not (id = -1) then
  begin
    for pic := id to frmMain.listSource.Count-2 do
    begin
      Image[pic] := Image[pic+1];
    end;
    frmMain.listsource.Items.Delete(id);
    SetLength(Image,frmMain.listsource.Count);
  end;
  if frmMain.listsource.Items.Count = 0 then
  begin
    frmMain.btnDelete.Enabled := false;
  end;
end;
Ich hoffe auf eure Hilfe, denn mein Kopf raucht so langsam :roteyes:

Tschüssi
Kill0r

Muetze1 2. Apr 2006 02:21

Re: TListBox: Löschen von markierten Elementen
 
1. DeleteSelected als Methode von der TListBox mal anschauen
2. Immer von Count abwärts zählen, da die For Schleifen ihre Start- und Endwerte nur einmalig vor dem ersten Durchlauf ermitteln. Das bedeutet die For Schleife rennt immer durch alle Elemente durch, die die ListBox zu Anfang hatte.

Grishnak 2. Apr 2006 02:23

Re: TListBox: Löschen von markierten Elementen
 
Wenn du ein Element aus der Liste löschst, dann rutschen alle dahinter stehenden eine Position vor:
Code:
Pos Element
 0      A
 1      B
 2      C
 3      D
 4      E
 5      F
Nach dem Löschen vom Element mit Index 2:
Code:
Pos Element
 0      A
 1      B
 2      D
 3      E
 4      F
Nun haben alle Elemente einen um eins niedrigeren Index!

Wenn du also z.B. Element 2 ("C"), 5 ("E") und 3 ("D") löschen willst, dann solltest du immer das Element mit dem höchsten Index zuerst löschen: zuerst 5, dann 3 und dann 2.


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