Autor Beitrag
boebel
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 16


Delphi 7, Microsoft Visual C# 2010
BeitragVerfasst: Mi 28.03.07 11:59 
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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 629


D7
BeitragVerfasst: Mi 28.03.07 12:32 
ausblenden Delphi-Quelltext
1:
ListBox.ItemIndex := IndexDesZuMarkierendenEintrags;					
Jakob Schöttl
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 929
Erhaltene Danke: 1


Delphi 7 Professional
BeitragVerfasst: Mi 28.03.07 13:30 
user profile iconIngoD7 hat folgendes geschrieben:
ausblenden 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 260

Win XP Prof
D7 Enterprise
BeitragVerfasst: 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

ausblenden 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;

_________________
rein statistisch gesehen darf man keiner statistik trauen die man nicht selbst gefälscht hat.
IngoD7
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 629


D7
BeitragVerfasst: 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: :)

ausblenden Delphi-Quelltext
1:
2:
ListBox.ItemIndex := Pred(ListBox.ItemIndex);  //Markierung rauf
ListBox.ItemIndex := Succ(ListBox.ItemIndex);  //Markierung runter
Lannes
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2352
Erhaltene Danke: 4

Win XP, 95, 3.11, IE6
D3 Prof, D4 Standard, D2005 PE, TurboDelphi, Lazarus, D2010
BeitragVerfasst: 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:
ausblenden Delphi-Quelltext
1:
2:
3:
  with ListBox do
    if ItemIndex > 0 then
      Items.Move(Pred(ItemIndex),ItemIndex);

_________________
MfG Lannes
(Nichts ist nicht Nichts) and ('' <> nil ) and (Pointer('') = nil ) and (@('') <> nil )
IngoD7
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 629


D7
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2352
Erhaltene Danke: 4

Win XP, 95, 3.11, IE6
D3 Prof, D4 Standard, D2005 PE, TurboDelphi, Lazarus, D2010
BeitragVerfasst: 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:

_________________
MfG Lannes
(Nichts ist nicht Nichts) and ('' <> nil ) and (Pointer('') = nil ) and (@('') <> nil )
Jakob Schöttl
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 929
Erhaltene Danke: 1


Delphi 7 Professional
BeitragVerfasst: 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: :)

ausblenden 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 16


Delphi 7, Microsoft Visual C# 2010
BeitragVerfasst: 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