Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Listview items verschieben (https://www.delphipraxis.net/95161-listview-items-verschieben.html)

Van HelF 2. Jul 2007 11:29


Listview items verschieben
 
Ich habe folgendes Problem,
ich möchte die markierten Items einer listview mit "strg+Pfeil auf" und "strg+Pfeil" runter verschieben.
Das hochschieben der Items funktioniert ohne Probleme, jedoch das herunterschieben nicht, die Items werden aus mir unerklärlichen gründen nicht verschoben.

Delphi-Quellcode:
function MoveListViewItem(listView: TListView; ItemFrom, ItemTo: Word): Boolean;
var Source, Target: TListItem;
begin
  Result := False;
  listview.Items.BeginUpdate;
  try
    Source := listview.Items[ItemFrom];
    Target := listview.Items.Insert(ItemTo);
    Target.Assign(Source);
    Source.Free;
    Result := True;
  finally
    listview.Items.EndUpdate;
  end;
end;

procedure TForm1.items_nach_oben;
var i:integer;
begin

  for i:=0 to lv1.Items.Count-1 do
  begin
    if lv1.Items.Item[i].Selected then
    begin
      if i<>0 then
      begin
        MoveListViewItem(lv1,i,i-1);
        lv1.Items.Item[i-1].Selected:=true;
      end;
    end;
  end;
end;

procedure TForm1.items_nach_unten;
var i:integer;
begin

  for i:=0 to lv1.Items.Count-1 do
  begin
    if lv1.Items.Item[i].Selected then
    begin
      if i<lv1.Items.Count-1 then
      begin
        MoveListViewItem(lv1,i,i+1);
        lv1.Items.Item[i+1].Selected:=true;
      end;
    end;
  end;
end;



Aufruf:
  if key=38 then if KeyPressed(vk_Control) then items_nach_oben;
  if key=40 then if KeyPressed(vk_Control) then items_nach_unten;

SirThornberry 2. Jul 2007 12:21

Re: Listview items verschieben
 
geh die schleife einfach mal schritt für schritt durch dann wirst du sehen das es daran liegt das du selected in der schleife änderst und somit das nächste item dann selektiert ist. Du solltest auf die Schleife ganz verzichten und direkt das selektierte Item ansteuern.

Van HelF 2. Jul 2007 12:48

Re: Listview items verschieben
 
Es sollen aber alle markierten Items verschoben werden.

SirThornberry 2. Jul 2007 12:58

Re: Listview items verschieben
 
naja, wie gesagt solltest du da mal im einzelschritt durchgehen.
Stelle dir vor das 0te Item ist selektiert:
du verschiebst das 0te Item an Position1
dann verschiebst du das 1te Item (was früher das 0te war) an Position 2
dann verschiebst du das 2te Item (was früher das 0te war) an Position 3
etc.

Zudem kannst du die schleife auch bis count - 2 laufen lassen und kannst dir damit das if sparen.

Deine Move-Methode ist auch fehlerhaft. Willst du Beispielsweise ein Item von 2 nach 3 verschieben legst du an Position 3 ein neues Item an und löschst danach das zweite weg. dadurch wird das neue auber von position 3 auf position2 verschoben

Van HelF 2. Jul 2007 15:24

Re: Listview items verschieben
 
Für alle die es interessiert, so funktionierts :
Delphi-Quellcode:
procedure TForm1.items_nach_unten;
var i:integer;
begin
  for i:=lv1.Items.count-2 downto 0 do
  begin
    if lv1.Items.Item[i].Selected then
    begin
      MoveListViewItem(lv1,i,i+2);
      lv1.Items.Item[i+1].Selected:=true;
    end;
  end;
end;

CCRDude 2. Jul 2007 15:40

Re: Listview items verschieben
 
Zusätzlich könntest Du noch überlegen, da es ja nur um Verschieben geht, einfach das Index des TListItem zu ändern, statt ihn in einen neu angelegten zu kopieren...


Alle Zeitangaben in WEZ +1. Es ist jetzt 15:34 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz