Entwickler-Ecke

Grafische Benutzeroberflächen (VCL & FireMonkey) - TListBox Item Löschen


Xearox - Fr 03.06.11 13:44
Titel: TListBox Item Löschen
Mahlzeit zusammen,

folgendes Problem, habe mein Programm bis auf eine ganz kleine Sache, fertig.


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
procedure TForm2.LB_Aus_ArtikelDblClick(Sender: TObject);
var
i: Integer;
begin
  with LB_Aus_Artikel do
  begin
    i := 0;
    while (i <= Items.Count - 1and (SelCount > 0do
      begin
        while (i <= Items.Count - 1and Selected[i] do
          Items.Delete(i);
          ArtikelAuswahl[i].Ind:='';
          ArtikelAuswahl[i].Anzahl:='';
          ArtikelAuswahl[i].Name:='';
          LB_Aus_ArtikelAnz.items.delete(i);
          inc(i);
      end;
      ArtikelAnz:=ArtikelAnz - 1;

  end;
end;


Der code soll folgendes bewirken.
Doppel klick auf einen Artikel, Artikel wird aus liste gelöscht.
Links neben der Artikelliste ist eine weitere liste, welche die Stückzahlen enthält.
Dort soll auch der Eintrag gelöscht werden. Jedoch löscht er immer mehr als er soll.
Wenn ich nun 13 Artikel in der liste habe, und lösche den 13. Artikel, dann wird links in der Stückzahlliste genau 7 Einträge rausschmissen.
Ich weiß mir leider keinen Rat mehr, woran das liegen könnte.

Weiß jemand von euch, wie ich das am besten lösen kann?

Gruß Chris


jaenicke - Fr 03.06.11 13:50

Wenn du Einträge löschen willst, musst du von hinten anfangen oder i nur erhöhen, wenn du nicht gelöscht hast...

Überlege einmal selbst:
Du bist bei Eintrag 0, löschst den und erhöhst i. Welchen Eintrag prüfst du jetzt als nächstes? Den an Position 1... Und was ist mit dem, der jetzt an Position 0 ist?

Zudem hast du den Quelltext falsch eingerückt, da fehlt wohl ein begin..end...

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
procedure TForm2.LB_Aus_ArtikelDblClick(Sender: TObject);
var
i: Integer;
begin
  with LB_Aus_Artikel do
  begin
    i := 0;
    while (i <= Items.Count - 1and (SelCount > 0do
    begin
      while (i <= Items.Count - 1and Selected[i] do
        Items.Delete(i);
      // und hier ist die innere while Schleife zu Ende!
      ArtikelAuswahl[i].Ind:='';
      ArtikelAuswahl[i].Anzahl:='';
      ArtikelAuswahl[i].Name:='';
      LB_Aus_ArtikelAnz.items.delete(i);
      inc(i);
    end;
    ArtikelAnz:=ArtikelAnz - 1;
  end;
end;


Xearox - Fr 03.06.11 13:54

jetzt wo du es sagst, stimmt, hab ein begin vergessen und natürlich ein end;

aber dennoch funktioniert es nicht.
der löscht immer noch mehr als nur ein item...


jaenicke - Fr 03.06.11 13:59

Ich verstehe auch den Aufwand nicht wirklich... :gruebel:

Was spricht dagegen es ganz einfach so zu machen?

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
procedure TForm2.LB_Aus_ArtikelDblClick(Sender: TObject);
var
  CurrentIndex: Integer;
begin
  CurrentIndex := LB_Aus_Artikel.ItemIndex;
  if CurrentIndex >= 0 then
  begin
    LB_Aus_ArtikelAnz.Items.Delete(CurrentIndex);
    LB_Aus_Artikel.Items.Delete(CurrentIndex); 
    ...
  end;
end;


Xearox - Fr 03.06.11 14:01

weil ich das ausm internet hatte den code.
und ich vorher damit noch garnicht gearbeitet habe.


Narses - Fr 03.06.11 14:03

Moin!

user profile iconjaenicke hat folgendes geschrieben Zum zitierten Posting springen:
Ich verstehe auch den Aufwand nicht wirklich... :gruebel:
Er hat Multiselect aktiviert, dann kann es mehr als ein markiertes Item geben. :idea: ;)

Vorschlag:

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
procedure TForm2.LB_Aus_ArtikelDblClick(Sender: TObject);
  var
    i: Integer;
begin
  for i := LB_Aus_Artikel.Count -1 downto 0 do
    if LB_Aus_Artikel.Selected[i] then begin
      LB_Aus_Artikel.Items.Delete(i); 
      LB_Aus_ArtikelAnz.Items.Delete(i);
      //... 
    end;
end;
cu
Narses


jaenicke - Fr 03.06.11 14:13

Meinst du wirklich, dass er das möchte?
user profile iconXearox hat folgendes geschrieben Zum zitierten Posting springen:
Der code soll folgendes bewirken.
Doppel klick auf einen Artikel, Artikel wird aus liste gelöscht.
:zwinker:

Abgesehen davon bezweifle ich, dass bei Multiselect in OnDblClick noch andere markiert bleiben. :gruebel:


Narses - Fr 03.06.11 14:16

Moin!

user profile iconjaenicke hat folgendes geschrieben Zum zitierten Posting springen:
Meinst du wirklich, dass er das möchte?
user profile iconXearox hat folgendes geschrieben Zum zitierten Posting springen:
Der code soll folgendes bewirken.
Doppel klick auf einen Artikel, Artikel wird aus liste gelöscht.
:zwinker:
Er hatte es in dem anderen Topic geschrieben. :nixweiss:

user profile iconjaenicke hat folgendes geschrieben Zum zitierten Posting springen:
Abgesehen davon bezweifle ich, dass bei Multiselect in OnDblClick noch andere markiert bleiben. :gruebel:
Wenn du statt des letzten Klicks einen Doppelklick machst (mit Strg oder Shift), dann bleibt die Auswahl stehen, ja. ;) (ich gebe zu, habe ich auch erst ausprobieren müssen :oops:)

cu
Narses