Entwickler-Ecke

Grafische Benutzeroberflächen (VCL & FireMonkey) - Eintrag in Listview nach unten schieben


rafi@work - Fr 23.07.04 10:35
Titel: Eintrag in Listview nach unten schieben
Hi!
Ich habe in meiner ListView verschiedene Einträge. Mit diesem Code verschiebe ich jeweils den markierten Eintrag um einen Eintrag nach oben.


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
procedure TFormIvrHmpConfigTool.ButtonUpClick(Sender: TObject);
var
  i, SourceIndex : Integer;
  ListItem, SourceItem, DestItem: TListItem;
begin
  SourceIndex  := ListViewactiveCodecs.Selected.Index;
  SourceItem := ListViewactiveCodecs.Items.Item[SourceIndex];
  DestItem := ListViewactiveCodecs.Items.Item[SourceIndex-1];

  ListViewactiveCodecs.Items.Insert(SourceIndex+1);
  ListViewactiveCodecs.Items.Item[SourceIndex+1] := DestItem;
  ListViewactiveCodecs.Items.Item[SourceIndex-1] := SourceItem;
  ListViewactiveCodecs.Items.Item[SourceIndex].Delete;
  ButtonUp.Enabled:=false;
end;


Jetzt möchte ich das gleiche machen nur umgekehrt, also einen markierten Eintrag eins nach unten schieben. Wie muss ich denn Code korrekt anpassen? Danke für eure Hilfe!

Grüsse


Delete - Fr 23.07.04 10:37

Wenn du den Source nicht verstehst, probier doch mal was passiert, wenn du die Plus in Minus änderst.


rafi@work - Fr 23.07.04 10:47

Ja, wäre im Prinzip noch logisch, habe ich aber schon vor meiner Frage ausprobiert. Es erscheint aber eine Exception.


Delete - Fr 23.07.04 15:21

Únd welche? Wir sind hier keine Hellseher. :roll:


Bulvaye - Fr 23.07.04 20:07

Hi, ich hab mir für dieses Problem folgende Prozedur geschrieben:


Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
procedure MoveSelectedItem(ListView: TListView; MoveUp: Boolean);
var Item: TListItem;
begin
  with ListView do
  begin
    if MoveUp and (Selected.Index > 0)
      or not MoveUp and (Selected.Index  < Pred(Items.Count)) then
    begin
      if MoveUp then
        Item := Items.Insert(Selected.Index-1)
      else
        Item := Items.Insert(Selected.Index+2);
      Item.Assign(Selected);
      Selected.Delete;
      Item.Selected := True;
      Selected.Focused := True;
      Selected.MakeVisible(False);
    end;
    SetFocus;
  end;
end;


Du definierst einfach eine einzige OnClick-Ereignis-Prozedur, in der Du dann MoveSelectedItem() wie folgt aufrufst:


Quelltext
1:
MoveSelectedItem(ListViewactiveCodecs, Sender=ButtonUpClick);                    


Die Prozedur MoveSelectedItem() hat gegenüber Deiner Methode folgende Vorteile:

a) Es findet eine Bereichsüberprüfung vor der Aktion statt (also keine Fehlermeldungen)
b) Die Selektion und der Focus werden entsprechend mit verschoben.
c) Es wird dafür gesorgt, daß nach dem Verschieben das selektierte Item immer sichtbar ist.

Ich hoffe, das hilft Dir bei Deinem Projekt ein wenig weiter.

Grüße