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/)
-   -   Drag&Drop mit zwei FMX ListView (https://www.delphipraxis.net/187248-drag-drop-mit-zwei-fmx-listview.html)

Kostas 11. Nov 2015 14:14

Drag&Drop mit zwei FMX ListView
 
Hallo Zusammen,

in einem FMX Projekt sind zwei ListView nebeneinander. Ich versuche ein Item von der linken ListView auf die Rechte ListView zu verschieben. Leider hat die ListView kein ItemByPoint wie die ListBox. Wie komme ich bitte an die zwei Items der jeweiligen ListView Controls. Hat jemand eine Idee?

Gruß Kostas.

Harry Stahl 11. Nov 2015 23:25

AW: Drag&Drop mit zwei FMX ListView
 
Um das gezogene Objekt von der Listview1 zu ermitteln kannst Du entweder das Listview1.selected verwenden oder im DragDropEvent der Listview2 das Data.source-Objekt.

Das Element (das ListItem), über welchem Du die Maus über der Listview2 loslässt, kannst Du mit einer kleinen Hilfsfunktion innerhalb des DropEvents ermitteln:

Delphi-Quellcode:
Function GetIndexAtPos (LV: TListView; TP: TPointF): Integer;
var
  I: Integer;
  TR: TRectF;
begin
  Result := -1;

  for I := 0 to LV.Items.Count-1 do begin
    TR := LV.GetItemRect (I);

    if TR.Contains (TP) then begin
      Result := I;
      Break;
    end;
  end;
end;

Kostas 12. Nov 2015 10:05

AW: Drag&Drop mit zwei FMX ListView
 
Hallo Harry,

genau das habe ich gesucht. Besten Dank dafür.

Noch eine Kleinigkeit, bei Drug&Drop wird die komplette Tabelle animiert und nicht die Row.
Gibt es eine Möglichkeit das zu ändern?

Gruß Kostas

Mavarik 12. Nov 2015 12:10

AW: Drag&Drop mit zwei FMX ListView
 
Wenn Du da ein "Working-Demo" hast, würde ich das gerne sehen...

Mavarik

Kostas 12. Nov 2015 12:50

AW: Drag&Drop mit zwei FMX ListView
 
Zitat:

Zitat von Mavarik (Beitrag 1321283)
Wenn Du da ein "Working-Demo" hast, würde ich das gerne sehen...

Mavarik

Hi, klar mache ich. Ich arbeite gerade an dem Projekt und werde bis Morgen eine Demo erzeugen.

Harry Stahl 12. Nov 2015 17:19

AW: Drag&Drop mit zwei FMX ListView
 
Liste der Anhänge anzeigen (Anzahl: 3)
Zitat:

Zitat von Kostas (Beitrag 1321267)
Hallo Harry,

genau das habe ich gesucht. Besten Dank dafür.

Noch eine Kleinigkeit, bei Drug&Drop wird die komplette Tabelle animiert und nicht die Row.
Gibt es eine Möglichkeit das zu ändern?

Gruß Kostas

Gerne. Man muss den Dragvorgang dann selber einleiten (also DragMode für die beiden Listen auf Manual stellen) und hier beim Ziehen über die Listview das benötigte Objekt angeben:

Delphi-Quellcode:
procedure TForm33.ListView1MouseMove(Sender: TObject; Shift: TShiftState; X,
  Y: Single);
begin
  if (SsLeft in Shift) and (ListView1.Selected <> NIL) then begin
    BeginInternalDrag(Listview1.Selected, Image1.Bitmap);
  end;
end;
Hier wird als 2. Parameter immer eine Bitmap erwartet, die muss gültig, kann aber auch leer sein.

Beim ziehen über die 2. Listview setzt Du dann die gewünschte Operation (für das optische Feedback):

Delphi-Quellcode:
procedure TForm33.ListView2DragOver(Sender: TObject;
  const [Ref] Data: TDragObject; const [Ref] Point: TPointF;
  var Operation: TDragOperation);
begin
  Operation := TDragOperation.Move;
end;
Ich habe jetzt hier keine Verschieben implementiert, das kriegst Du auch selber hin, gefragt war ja nur, wie man das Item ermitteln kann, über dem die Maustaste losgelassen wird. Im Demo habe ich das Item zuvor gesetzt, damit man ein Feedback hat:

Delphi-Quellcode:
procedure TForm33.ListView2DragDrop(Sender: TObject;
  const [Ref] Data: TDragObject; const [Ref] Point: TPointF);
var
  obj: IControl;
  Index: Integer;
begin
  obj := ObjectAtPoint (Screen.MousePos);
  if obj <> NIL then begin
    Index := GetIndexATPos (ListView2, Point);

    if Index <> -1 then begin
      // Aktuelle Zeile setzen    
      Listview2.ItemIndex := Index;
      ShowMessage ('Gezogen: ' + TListViewItem (Data.Source).Text + 'auf Zeile ' + TListView (obj).ItemIndex.ToString + ' = ' + TListViewItem (ListView2.Selected).text);
    end;
  end;
end;
In Aktion sieht es dann wie auf den beiden Screenshots aus, das "Demo-Projekt" habe ich angehängt. In einer zuverlässigen App musst Du natürlich noch ein paar Prüfungen einbauen (z.B. ist das gezogene Objekt auch vom Typ ListViewItem usw).

Zum besseren Verständnis habe ich hier mit "Listview2" gearbeitet (was im echten Leben eine kleine Todsünde wäre). Um es allgemeingültig zu machen, verwendest Du statt dessen z.B "(Sender as TListView)" oder nimmst eine lokale Variable TL: TListview, die Du am Anfang einmal zuweist (TL:= TListView(Sender)") und fortan damit arbeitest. So kannst Du ein und die gleiche Ereignisprozedur für mehrere Listviews verwenden (z.B. wenn Du die Elemente zwischen beiden Listviews hin und her schieben willst).

Kostas 12. Nov 2015 21:28

AW: Drag&Drop mit zwei FMX ListView
 
Tausend Dank Harry,

unter Delphi 10 Seattle funktioniert dein Demo einwandfrei.
Es ist ziemlich unschön dass sich das Drag&Drop zwischen ListView und ListBox so sehr unterscheiden.
Für meinen Fall kann ich deine Demo 1:1 verwenden. Dankeschön nochmals.

Dir noch eine schöne Zeit.

P.S. Das könntest du in dein FMX Buch integrieren und ich kaufe dir gleich ein Update ab.
Meine Kontaktdaten hast du ja.

Gruß Kostas

Harry Stahl 13. Nov 2015 16:02

AW: Drag&Drop mit zwei FMX ListView
 
Zitat:

Zitat von Kostas (Beitrag 1321367)
Tausend Dank Harry,
Für meinen Fall kann ich deine Demo 1:1 verwenden. Dankeschön nochmals.

P.S. Das könntest du in dein FMX Buch integrieren und ich kaufe dir gleich ein Update ab.
Gruß Kostas

Freut mich, dass es passt.

Die TListview-Komponente und einige Informationen dazu werden in meinem nächsten FMX-Buch zu Delphi 10 Seattle drin sein (Erscheinungszeitpunkt voraussichtlich Januar 2016).

Dilom 6. Aug 2018 07:07

AW: Drag&Drop mit zwei FMX ListView
 
Zitat:

Zitat von Harry Stahl (Beitrag 1321454)
Zitat:

Zitat von Kostas (Beitrag 1321367)
Tausend Dank Harry,
Für meinen Fall kann ich deine Demo 1:1 verwenden. Dankeschön nochmals.

P.S. Das könntest du in dein FMX Buch integrieren und ich kaufe dir gleich ein Update ab.
Gruß Kostas

Freut mich, dass es passt.

Die TListview-Komponente und einige Informationen dazu werden in meinem nächsten FMX-Buch zu Delphi 10 Seattle drin sein (Erscheinungszeitpunkt voraussichtlich Januar 2016).

Hello;

Multiselect: Listview1 > Listview2, drag and drop ok.
Delphi-Quellcode:
procedure TForm1.ListView2DragDrop(Sender: TObject;
  const [Ref] Data: TDragObject; const [Ref] Point: TPointF);
var
  Obj: IControl;
  Index, I: Integer;
begin
  Obj := ObjectAtPoint(Screen.MousePos);
  if Obj <> Nil then
  begin
    Index := GetIndexAtPos(ListView2, Point);
    if Index <> -1 then
    begin
      for I := ListView1.Items.Count - 1 downto 0 do
      begin
        if ListView1.Items[I].Data['Select'].ToString = 'OK' then
        begin
          ListView2.Items.Insert(Index);
          ListView2.Items[Index].Data['Fit'] := ListView1.Items[I].Data['Fit'].ToString;
        end;
      end;
    end;
  end;
end;
Listview1, up or down.
Listview2, up or down. how can I do it.


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