AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren

Drag&Drop mit zwei FMX ListView

Ein Thema von Kostas · begonnen am 11. Nov 2015 · letzter Beitrag vom 6. Aug 2018
Antwort Antwort
Kostas

Registriert seit: 14. Mai 2003
Ort: Gerstrhofen
1.058 Beiträge
 
Delphi 10 Seattle Enterprise
 
#1

Drag&Drop mit zwei FMX ListView

  Alt 11. Nov 2015, 15:14
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.
  Mit Zitat antworten Zitat
Benutzerbild von Harry Stahl
Harry Stahl

Registriert seit: 2. Apr 2004
Ort: Bonn
2.477 Beiträge
 
Delphi 11 Alexandria
 
#2

AW: Drag&Drop mit zwei FMX ListView

  Alt 12. Nov 2015, 00:25
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;
  Mit Zitat antworten Zitat
Kostas

Registriert seit: 14. Mai 2003
Ort: Gerstrhofen
1.058 Beiträge
 
Delphi 10 Seattle Enterprise
 
#3

AW: Drag&Drop mit zwei FMX ListView

  Alt 12. Nov 2015, 11:05
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
  Mit Zitat antworten Zitat
Benutzerbild von Mavarik
Mavarik

Registriert seit: 9. Feb 2006
Ort: Stolberg (Rhld)
4.123 Beiträge
 
Delphi 10.3 Rio
 
#4

AW: Drag&Drop mit zwei FMX ListView

  Alt 12. Nov 2015, 13:10
Wenn Du da ein "Working-Demo" hast, würde ich das gerne sehen...

Mavarik
  Mit Zitat antworten Zitat
Kostas

Registriert seit: 14. Mai 2003
Ort: Gerstrhofen
1.058 Beiträge
 
Delphi 10 Seattle Enterprise
 
#5

AW: Drag&Drop mit zwei FMX ListView

  Alt 12. Nov 2015, 13:50
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.
  Mit Zitat antworten Zitat
Benutzerbild von Harry Stahl
Harry Stahl

Registriert seit: 2. Apr 2004
Ort: Bonn
2.477 Beiträge
 
Delphi 11 Alexandria
 
#6

AW: Drag&Drop mit zwei FMX ListView

  Alt 12. Nov 2015, 18:19
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).
Miniaturansicht angehängter Grafiken
move1.jpg   move2.jpg  
Angehängte Dateien
Dateityp: zip ListViewItemDrag.zip (58,8 KB, 53x aufgerufen)

Geändert von Harry Stahl (12. Nov 2015 um 18:34 Uhr)
  Mit Zitat antworten Zitat
Kostas

Registriert seit: 14. Mai 2003
Ort: Gerstrhofen
1.058 Beiträge
 
Delphi 10 Seattle Enterprise
 
#7

AW: Drag&Drop mit zwei FMX ListView

  Alt 12. Nov 2015, 22:28
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
  Mit Zitat antworten Zitat
Benutzerbild von Harry Stahl
Harry Stahl

Registriert seit: 2. Apr 2004
Ort: Bonn
2.477 Beiträge
 
Delphi 11 Alexandria
 
#8

AW: Drag&Drop mit zwei FMX ListView

  Alt 13. Nov 2015, 17:02
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).
  Mit Zitat antworten Zitat
Dilom

Registriert seit: 25. Jul 2018
5 Beiträge
 
#9

AW: Drag&Drop mit zwei FMX ListView

  Alt 6. Aug 2018, 08:07
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 = 'OKthen
        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.
  Mit Zitat antworten Zitat
Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 15:44 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