Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Listenelemente verschieben - Riesenproblem (https://www.delphipraxis.net/167666-listenelemente-verschieben-riesenproblem.html)

Marco Steinebach 12. Apr 2012 08:41

Listenelemente verschieben - Riesenproblem
 
Liste der Anhänge anzeigen (Anzahl: 1)
Hallo zusammen,
ich möchte in einer ListView ein bestimmtes Element nach oben bzw. unten verschieben - sollte ja kein Problem darstellen.
Ich habe mir dazu einen Code gebastelt, habe, weil er nicht ging, hier in der DP geschaut, und den hier vorgestellten genommen, es bleibt aber beim selben Problem.
Das Problem ist das folgende: stehe ich z.B. auf dem dritten Listeneintrag und verschiebe diesen, sind alle Einträge, auch die, die vorher nicht markiert waren, markiert - und ich begreife absolut nicht, warum.
Würde sich das bitte mal jemand ansehen?
Für einen Tipp wäre ich wirklich sehr dankbar!
Viele Grüße
Marco

Marco Steinebach 15. Apr 2012 06:13

AW: Listenelemente verschieben - Riesenproblem
 
*** fällt denn keinem was dazu ein... *winsel! ***

zeras 15. Apr 2012 08:42

AW: Listenelemente verschieben - Riesenproblem
 
Ich habe D 2009 und das Verschieben mittels +/- Taste geht erst mal. Was bei mir nicht geht, ist die Eigenschaft Checked. Diese wird nicht mit dem Objekt mitgenommen, sondern wird dann, mir unverständlich, an eine andere Zeile weitergegeben, die dann aber mit dem Text nicht übereinstimmt.

ASM 15. Apr 2012 20:35

AW: Listenelemente verschieben - Riesenproblem
 
Der ursprüngliche Quellcode ist leider unzureichend und daher fehlerhaft.
Versuche es hiermit:
Code:
procedure MoveLVItem(LV: TListView; Direction: TSearchDirection);
var
  aItem, NextItem, TmpItem: TListItem;
  fChecked: array of Boolean;
  i: integer;
  temp: Boolean;
begin
  with LV do
  begin
    if IsEditing or not Assigned(ItemFocused) then
      exit; // raus wenn Item editiert wird oder kein Item selektiert ist
    aItem := ItemFocused;
    setlength(fchecked, items.Count);
    for i := 0 to items.count - 1 do
      fChecked[i] := Items.item[i].checked;
    case Direction of
      sdAbove:
        begin
          if aItem.Index = 0 then exit; // Erstes Item ist markiert > raus
          temp := items[aItem.Index - 1].checked;
          fChecked[aItem.Index - 1] := items[aItem.Index].checked;
          fChecked[aItem.Index] := temp;
        end;
      sdBelow:
        begin
          if aItem.Index = Items.Count - 1 then exit; // Letztes Item ist markiert > raus
          temp := items[aItem.Index + 1].checked;
          fChecked[aItem.Index + 1] := items[aItem.Index].checked;
          fChecked[aItem.Index] := temp;
        end;
    end;
    NextItem := GetNextItem(aItem, Direction, [isNone]);
    Items.BeginUpdate;
    TmpItem := TListItem.Create(Items);
    try
      TmpItem.Assign(NextItem);
      NextItem.Assign(aItem);
      aItem.Assign(TmpItem);
      aItem.Selected := NextItem.Selected;
      NextItem.MakeVisible(True);
      ItemFocused := NextItem;
      Selected := NextItem;
    finally
      TmpItem.Free;
    end;
    for i := 0 to items.count - 1 do
      items.item[i].checked := fChecked[i];
    Items.EndUpdate;
  end;
end;

Marco Steinebach 18. Apr 2012 09:20

AW: Listenelemente verschieben - Riesenproblem
 
Hallo,
und ganz herzlichen Dank für die Antwort.
Ich konte echt nicht glauben, daß im eigentlichen VCL-Quellcode ein Fehler drin ist - und hab gedacht, ich wäre zu blöd.
Also gut, ;-), speichern wir die .Checked eben erst...
Viele Grüße
Marco


Alle Zeitangaben in WEZ +1. Es ist jetzt 00:58 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