Entwickler-Ecke

Grafische Benutzeroberflächen (VCL & FireMonkey) - Listbox-Einträge verschieben


boebel - Mi 28.03.07 11:59
Titel: Listbox-Einträge verschieben
Hallo Leute

Ich habe eine Listbox mit mehreren Einträgen. Mit zwei Buttons kann ein markierter Eintrag nach oben bzw. nach unten geschoben werden. Soweit so gut. Nur leider muss der Eintrag nach dem Klicken auf den Button wieder markiert werden.

Also ziemlich mühsam wenn ein Eintrag einige Zeilen nach oben geschoben werden soll.

Kann mir jemand einen Tipp geben wie ich das hinkriege ohne immer wieder markieren zu müssen?


Vielen Dank

Gruss Michael


IngoD7 - Mi 28.03.07 12:32


Delphi-Quelltext
1:
ListBox.ItemIndex := IndexDesZuMarkierendenEintrags;                    


Jakob Schöttl - Mi 28.03.07 13:30

user profile iconIngoD7 hat folgendes geschrieben:

Delphi-Quelltext
1:
ListBox.ItemIndex := IndexDesZuMarkierendenEintrags;                    


oder beim rauf ^: ListBox.ItemIndex := Inc(ListBox.ItemIndex);
und beim runter v: ListBox.ItemIndex := Pred(ListBox.ItemIndex);

EDIT: Ach nein, du musst davor noch eine Prüfung machen, dass der ItemIndex nicht (Count -1) über- bzw. 0 unterschreitet.


DrRzf - Fr 30.03.07 01:16

Ich hab in einem programm sowas in ähnlicher Form drinnen.
2 Buttons mit Up Down und man kann damit die einträge in der Liste nach markieren eines eintrages rauf und runter schieben.
Allerdings werden hier nicht die Zeilen im StringGrid verschoben, sondern zahlen in einem Array, Die Daten aus dem Array werden danach wieder mit SetSchussreihenfolgeToEditor(AktSR); in das Stringgrid geschrieben. (hierbei werden aber dann daten aus einem anderen Array(record) angezeigt.

hier die 2 routinen der Buttons


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
procedure TForm1.BtnSRDownClick(Sender: TObject);
var
  puf,pos : integer;
begin
  pos := ListBoxSeSR.ItemIndex;
  if pos = -1 then Exit;               //ist was ausgewählt ?
  if pos = AnzSchiffe - 1 then Exit;   //bereichsprüfung dass nicht unten rausgeschoben wird
  pos := pos + 1;                      //anpassen an SRArray
  puf := AktSr[pos];                   //zwischenspeichern der nach unten zu verschiebenden zeile
  AktSR[pos] := AktSR[pos + 1];        //untere zeile nach oben schieben
  AktSR[pos + 1] := puf;               //obere zeile (im puffer) unten rein
  SetSchussreihenfolgeToEditor(AktSR); //werte im stringgrid aktualisieren
  ListBoxSeSR.ItemIndex := pos;        //index wieder auf den verschobenen eintrag
end;

procedure TForm1.BtnSRUpClick(Sender: TObject);
var
  puf,pos : integer;
begin
  pos := ListBoxSeSR.ItemIndex;
  if pos = -1 then Exit;               //ist was ausgewählt ?
  if pos < 1 then Exit;                //bereichsprüfung dass man nicht nach oben rausschiebt
  pos := pos + 1;                      //anpassen an SRArray
  puf := AktSr[pos];                   //zwischenspeichern der nach oben zu verschiebenden zeile
  AktSR[pos] := AktSR[pos - 1];        //obere zeile nach unten schieben
  AktSR[pos - 1] := puf;               //untere zeile (im puffer) oben rein
  SetSchussreihenfolgeToEditor(AktSR); //werte im stringgrid aktualisieren
  ListboxSeSr.ItemIndex := pos - 2;    //index wieder auf den verschobenen eintrag
end;


IngoD7 - Fr 30.03.07 08:59

user profile iconJakob Schöttl hat folgendes geschrieben:

oder beim rauf ^: ListBox.ItemIndex := Inc(ListBox.ItemIndex);
und beim runter v: ListBox.ItemIndex := Pred(ListBox.ItemIndex);


Eher dann doch so: :)


Delphi-Quelltext
1:
2:
ListBox.ItemIndex := Pred(ListBox.ItemIndex);  //Markierung rauf
ListBox.ItemIndex := Succ(ListBox.ItemIndex);  //Markierung runter


Lannes - Fr 30.03.07 09:28

Hallo,

verschiebt man die Items mit der richtigen Prozedur muss nicht neu markiert werden, Move nimmt die Markierung mit:

Delphi-Quelltext
1:
2:
3:
  with ListBox do
    if ItemIndex > 0 then
      Items.Move(Pred(ItemIndex),ItemIndex);


IngoD7 - Fr 30.03.07 10:38

user profile iconLannes hat folgendes geschrieben:
Move nimmt die Markierung mit:

Sagen wir lieber: Es lässt die Markierung stehen. ;)

Denn genau genommen verschiebst du (mit der von dir gewählten Reihenfolge der Argumente von Move) nicht den selektierten Eintrag, sondern den "Zieleintrag". Anders herum wäre die Markierung weg. So wandert sie scheinbar mit.

Letztlich ist es so aber tatsächlich am besten gelöst.


Lannes - Fr 30.03.07 12:14

Hallo,

da siehst Du wohl richtig, ist auch schon etwas älter der Code-Schnipsel.
Das kommt davon, Copy & Paste und nicht überlegen was da abläuft :angel:


Jakob Schöttl - Fr 30.03.07 12:28

user profile iconIngoD7 hat folgendes geschrieben:
user profile iconJakob Schöttl hat folgendes geschrieben:

oder beim rauf ^: ListBox.ItemIndex := Inc(ListBox.ItemIndex);
und beim runter v: ListBox.ItemIndex := Pred(ListBox.ItemIndex);


Eher dann doch so: :)


Delphi-Quelltext
1:
2:
ListBox.ItemIndex := Pred(ListBox.ItemIndex);  //Markierung rauf
ListBox.ItemIndex := Succ(ListBox.ItemIndex);  //Markierung runter


ups :oops: , Genau das meinte ich natürlich - nur benutz ich diese Prozeduren und Funktionen selten, deswegen hab ichs verwechselt...


boebel - Mo 02.04.07 15:29

Obowohl ich mir nicht sicher bin behaupte ich mal dass Move die sinnvollste Lösung für mein Problem ist.


Vielen Dank für eure Tipps.



gruss Michael