Autor Beitrag
rafi@work
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 147

Win2000 Prof
D7 Enterprise
BeitragVerfasst: Fr 23.07.04 10:35 
Hi!
Ich habe in meiner ListView verschiedene Einträge. Mit diesem Code verschiebe ich jeweils den markierten Eintrag um einen Eintrag nach oben.

ausblenden 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
Luckie
Ehemaliges Mitglied
Erhaltene Danke: 1



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

Win2000 Prof
D7 Enterprise
BeitragVerfasst: 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.
Luckie
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Fr 23.07.04 15:21 
Únd welche? Wir sind hier keine Hellseher. :roll:
Bulvaye
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 37

Windows Xp
Delphi 7 Enterprise
BeitragVerfasst: Fr 23.07.04 20:07 
Hi, ich hab mir für dieses Problem folgende Prozedur geschrieben:

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

ausblenden 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

_________________
Gesegnet ist, dessen Geist zu klein für jedweden Zweifel ist.