Entwickler-Ecke

Grafische Benutzeroberflächen (VCL & FireMonkey) - ListBox Einträge löschen


majolo - Mo 08.07.02 17:22
Titel: ListBox Einträge löschen
Hab mal wieder ein kleines KOMPONENTEN Problem. Wie kann man ein oder mehrere markierte Einträge aus einer ListBox löschen?
Dank im vorraus
majolo


Christian S. - Mo 08.07.02 18:40

Hi!

Hiermit geht es einfach aber unelegant (vielleicht fällt mir noch was besseres ein):


Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
VAR i, gewaehlt : INTEGER;
begin
  gewaehlt:=ListBox1.SelCount;
  i:=ListBox1.Count;
  while gewaehlt > 0 do
  begin
    dec(i);
    if ListBox1.Selected[i] then
    begin
      ListBox1.Items.Delete(i);
      dec(gewaehlt);
    end;
  end;
end;


MfG,
Peter


majolo - Mo 08.07.02 19:38

Danke, Peter, aber leider funzt der Code nicht. Hast du was vergessen oder gibt es noch andere funktionierende Lösungen
majolo


Christian S. - Mo 08.07.02 19:51

Hi!

Habe vergessen, zu beschreiben, wie die Situation bei mir aussieht:

1. Listbox mit Namen ListBox1 (MultiSelect = true)
2. Ein Button, der den Code enthält, den ich angegeben habe.

Ich habe gerade mal getestet: ich habe den Code von der Internetseite in die Prozedur für das OnClick-Ereignis des (neu erstellten) Buttons kopiert. Nur ein "begin" und ein "end;" musste ich rausschmeissen, dann funktionierte es.

Habe ich vielleicht das Problem falsch verstanden?

MfG, Peter


majolo - Mo 08.07.02 20:39

Hi!

Du hast das Problem schon richtig verstanden. Es funktioniert jetzt. Auch hatte nur vergessen Multiselect auf True zu setzen. Jetzt klappts.
Danke
majolo :D


Chatfix - Mi 10.07.02 01:10

ich hätte das ganze in eine rückwertslaufende For-Schleife geschrieben.. dann würde es mit oder ohne multi-selct funktionieren...

wenn du den code brauchst sag bescheit


Christian S. - Mi 10.07.02 11:14

Chatfix hat folgendes geschrieben:
ich hätte das ganze in eine rückwertslaufende For-Schleife geschrieben.. dann würde es mit oder ohne multi-selct funktionieren...

wenn du den code brauchst sag bescheit


Hi, mich würde dieser Code schon interessieren. Geht er alle Eintäge der Listbox durch, um zu prüfen, ob sie markiert sind?

Habe hier noch eine Ergänzung, mit der mein Code auch ohne MultiSelect funktioniert:

Quelltext
1:
2:
  if ListBox1.MultiSelect = false then
  gewaehlt:=1 else gewaehlt:=ListBox1.SelCount;


Aber ohne Multiselect macht der ganze Aufwand auch nicht gerade Sinn, oder?

MfG,
Peter


Chatfix - Mi 10.07.02 19:48

also mit folgendem code kannst du alles nutzen, egal ob multi select oder nicht...


Quelltext
1:
2:
3:
4:
5:
for I:=listbox1.items.count-1 downto 0 do
begin
  if listbox1.selected[i] then
  listbox1.items.delete(i);
end;


Christian S. - Mi 10.07.02 20:29

Chatfix hat folgendes geschrieben:
also mit folgendem code kannst du alles nutzen, egal ob multi select oder nicht...


Stimmt, und überprüfst bei einer ListBox mit 1000 Einträgen, von denen nur 5 makriert sind, trotzdem alle 1000! Nicht gerade optimal, oder?


Chatfix - Mi 10.07.02 20:32

vieleicht nicht optimal, aber du musst bei einer listbox immer alle überprüfen, es sei denn sie ist nicht, multiselect, dann kannst du ja noch ein


Quelltext
1:
break;                    


rein hauen fg


Christian S. - Mi 10.07.02 21:10

Chatfix hat folgendes geschrieben:
aber du musst bei einer listbox immer alle überprüfen, es sei denn sie ist nicht, multiselect


Nein, bei meinem Code musst Du ja eben nicht alle überprüfen. Sobald Du soviele Einträge gelöscht hast, wie vorher markiert waren, beendet sich der Algorithmus.

MfG


Chatfix - Mi 10.07.02 21:13

ja und wie bekommt man raus wieviel einträge markiert wurden?


Christian S. - Mi 10.07.02 21:27

Über die Eigenschaft SelCount. Zu beachten ist dabei, dass das nur bei MultiSelect=true funktioniert. Das Problem löst die Code-Ergänzung, die ich nach meinem Hauptcode gemacht habe (mein 3. Eintrag bei diesem Topic).


Pit - Mi 10.07.02 22:25



Christian S. - Do 11.07.02 19:22

Wie hast Du die Laufzeit von LB_GETSELITEMS veranschlagt? Ansonsten scheint Deine Version wirklich die optimalste Lösung zu sein. Kennst Du ein gutes Tutorial für diese Windows-API-Befehle (sind es doch, oder?)? Ich habe mich nämlich noch nie damit beschäftigt, aber sie scheinen sehr interessante Möglichkeiten zu beinhalten.


Pit - Do 11.07.02 19:47