![]() |
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. |
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; |
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 |
AW: Drag&Drop mit zwei FMX ListView
Wenn Du da ein "Working-Demo" hast, würde ich das gerne sehen...
Mavarik |
AW: Drag&Drop mit zwei FMX ListView
Zitat:
|
AW: Drag&Drop mit zwei FMX ListView
Liste der Anhänge anzeigen (Anzahl: 3)
Zitat:
Delphi-Quellcode:
Hier wird als 2. Parameter immer eine Bitmap erwartet, die muss gültig, kann aber auch leer sein.
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; Beim ziehen über die 2. Listview setzt Du dann die gewünschte Operation (für das optische Feedback):
Delphi-Quellcode:
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:
procedure TForm33.ListView2DragOver(Sender: TObject;
const [Ref] Data: TDragObject; const [Ref] Point: TPointF; var Operation: TDragOperation); begin Operation := TDragOperation.Move; end;
Delphi-Quellcode:
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).
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; 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). |
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 |
AW: Drag&Drop mit zwei FMX ListView
Zitat:
Die TListview-Komponente und einige Informationen dazu werden in meinem nächsten FMX-Buch zu Delphi 10 Seattle drin sein (Erscheinungszeitpunkt voraussichtlich Januar 2016). |
AW: Drag&Drop mit zwei FMX ListView
Zitat:
Multiselect: Listview1 > Listview2, drag and drop ok.
Delphi-Quellcode:
Listview1, up or down.
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; Listview2, up or down. how can I do it. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 19:56 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz