![]() |
DragDrop mit TTreeViewItem als Ziel
Hallo,
ich plage mich mit dem Versuch aus einem TListView Informationen zu einem TTreeViewItem in einem TTreeView zu ziehen und leider klappt es nicht. Das Ziehen (Drag) scheint soweit zu funktionieren:
Delphi-Quellcode:
Auch DragOver funktioniert:
procedure TFormViewZuordnen.ListViewZuordnenMouseMove(Sender: TObject; Shift: TShiftState; X, Y: Single);
var Svc: IFMXDragDropService; DragData: TDragObject; begin if (SsLeft in Shift) and (Assigned(TListView(sender).Selected)) and TPlatformServices.Current.SupportsPlatformService(IFMXDragDropService, Svc) then begin log('Ich werde gezogen'); DragData.Source:= TListView(sender).Selected; DragData.Data:= TKonto(TListView(sender).Selected.TagObject); Svc.BeginDragDrop(Self, DragData, Image1.Bitmap); end; end;
Delphi-Quellcode:
Aber bei DragDrop keine Reaktion:
procedure TFormViewZuordnen.TreeViewEBilanzDragOver(Sender: TObject; const Data: TDragObject; const Point: TPointF;
var Operation: TDragOperation); begin TTreeView(Sender).Selected:= TTreeView(Sender).ItemByPoint(Point.X, Point.y); //Funktioniert, zeigt wunderbare blaue Balken Operation:= TDragOperation.Copy end;
Delphi-Quellcode:
Es wird nichts im Log angezeigt, im Gegensatz zum Start. Offensichtlich wird die Funktion nicht mal ausgeführt.
procedure TFormViewZuordnen.TreeViewEBilanzDragDrop(Sender: TObject; const Data: TDragObject; const Point: TPointF);
var Item: TTreeViewItem; begin log('DragDrop'); Item:= TTreeView(Sender).ItemByPoint(Point.X, Point.y); log(Item.Text); end; Was mache ich falsch? Kann mir jemand helfen? Danke schon mal. Gruß Peter |
AW: DragDrop mit TTreeViewItem als Ziel
Lass doch mal das
Delphi-Quellcode:
TTreeView(Sender).Selected:= TTreeView(Sender).ItemByPoint(Point.X, Point.y); //Funktioniert, zeigt wunderbare blaue Balken
weg. Nehme an, dass dadurch die items den Fokus erhalten, daher wird dann das Event des Treeviews nicht mehr ausgeführt. Wenn es das nicht ist, lad mal eine demo hier hoch, damit man es konkret nachvollziehen kann. |
AW: DragDrop mit TTreeViewItem als Ziel
Liste der Anhänge anzeigen (Anzahl: 1)
Hallo Harry,
danke, dass Du Dich meinem Problem annimmst. Die besagte Zeile habe ich auskommentiert und bekomme eine Fehlermeldung. Eine Kopie habe ich beigefügt. Wenn ich die Zeile drin lasse, kommt zwar keine Fehlermeldung, aber immer wieder der Logeintrag.Jetzt habe ich den Verdacht, dass es an der Methode ListViewZuordnenMouseMove liegt. Denn die Maus bewegt sich ja immer und offensichtlich wird die Routine oft aufgerufen. Kann dies irgendwie unterbrochen werden? Gibt es einen Befehl, wenn DragDrop begonnen ist, nicht noch mal starten? Kann es sein, dass da das Problem liegt? Gruß Peter |
AW: DragDrop mit TTreeViewItem als Ziel
Die Fehlermeldung kommt dann aus dem DragDropEvent.
Da musst Du es wie folgt machen:
Delphi-Quellcode:
Item:= TTreeViewItem(Sender);
Denn da ist der Sender nicht der TTreeview sondern das Item selbst. |
AW: DragDrop mit TTreeViewItem als Ziel
Um sicherzugehen wäre auch ein sicherer Cast sinnvoll:
Delphi-Quellcode:
Dann wäre die Meldung deutlich verständlich gewesen.
Item := Sender as TTreeViewItem;
// Zumindest wenn es unerklärliche Fehler gibt zum Debuggen Zeitkritisch ist die Stelle ja nicht, deshalb würde ich dort gar keine harten Casts machen. |
AW: DragDrop mit TTreeViewItem als Ziel
Liste der Anhänge anzeigen (Anzahl: 1)
Danke für eure Antworten.
Ich habe es jetzt umgebaut:
Delphi-Quellcode:
Die Funktion TreeViewEBilanzDragDrop wird offensichtlich nicht aufgerufen.
procedure TFormViewZuordnen.ListViewZuordnenMouseMove(Sender: TObject; Shift: TShiftState; X, Y: Single);
var Svc: IFMXDragDropService; DragData: TDragObject; Item: TListViewItem; List: TListView; begin if (SsLeft in Shift) then begin List:= Sender as TListView; Item:= TListViewItem(List.Selected); if Assigned(Item) and TPlatformServices.Current.SupportsPlatformService(IFMXDragDropService, Svc) then begin log('Ich werde gezogen ' + sender.ClassName + ' ' + Item.Text); DragData.Source:= Item; DragData.Data:= Item.TagObject; Svc.BeginDragDrop(Self, DragData, Image2.Bitmap); end; end; end; procedure TFormViewZuordnen.TreeViewEBilanzDragDrop(Sender: TObject; const Data: TDragObject; const Point: TPointF); var Item: TTreeViewItem; begin log('DragDrop'); item:= (Sender as TTreeViewItem).ItemByPoint(Point.X, Point.y); // Item:= TTreeView(Sender).ItemByPoint(Point.X, Point.y); log(Item.Text); end; procedure TFormViewZuordnen.TreeViewEBilanzDragOver(Sender: TObject; const Data: TDragObject; const Point: TPointF; var Operation: TDragOperation); var Item: TTreeViewItem; begin // TTreeView(Sender).Selected:= TTreeView(Sender).ItemByPoint(Point.X, Point.y); //Funktioniert, zeigt wunderbare blaue Balken Operation:= TDragOperation.Copy end; Das Mausziehen wird jetzt korrekt ausgeführt und ins Log eingetragen, aber aus der Funktion DragDrop kommt nichts ins Log. Ich habe auch verschiedene Schalter ausprobiert beim Baum. AllowDrag:= True oder False Gruß Peter |
AW: DragDrop mit TTreeViewItem als Ziel
DragDrop müsste jedenfalls so lauten:
Delphi-Quellcode:
Wenn das immer noch nicht funktioniert: Mach doch bitte mal ein kurzes Demo (also die Listview mit Items drin (und Treeview mit Items) und mit den hier gezeigten Events) und lade es hier (ohne Exe) einmal hoch.
procedure TFormViewZuordnen.TreeViewEBilanzDragDrop(Sender: TObject; const Data: TDragObject; const Point: TPointF);
var Item: TTreeViewItem; begin log('DragDrop'); item:= (Sender as TTreeViewItem); //.ItemByPoint(Point.X, Point.y); // Item:= TTreeView(Sender).ItemByPoint(Point.X, Point.y); log(Item.Text); end; |
AW: DragDrop mit TTreeViewItem als Ziel
Danke Harry für die schnelle Antwort und Dein Angebot sich ein Demo anzuschauen.
Leider klappt es immer noch nicht. Das Demo mache ich fertig und stelle es ein. Vermutlich nur eine Bagatelle, wie ich mich kenne. Vorab eine Frage:
Delphi-Quellcode:
Ich hätte jetzt gedacht, dass der Sender TTreeView ist und nicht das Item?
item:= (Sender as TTreeViewItem); //.ItemByPoint(Point.X, Point.y);
Bislang glaubte ich das zwischen Sender as TTreeViewItem und TTreeViewItem(sender) kein Unterschied ist. Gruß Peter |
AW: DragDrop mit TTreeViewItem als Ziel
Zitat:
|
AW: DragDrop mit TTreeViewItem als Ziel
Danke Peter,
das heißt vom Ergebnis ist die Vorgehensweise identisch. Jetzt verstehe ich auch was Sebastian meinte, dass ich bei einem Typcast mit as eine verständlichere Fehlermeldung bekomme. Gruß Peter |
AW: DragDrop mit TTreeViewItem als Ziel
Liste der Anhänge anzeigen (Anzahl: 1)
Hallo Harry,
entschuldige, es hat etwas gedauert bis ich die Demodatei fertig machte. Wenn Du noch magst, schau es Dir bitte an. Ich habe nach wie vor keine Reaktion auf seiten des TTreeview. So wie oben beschrieben. Irgendwas mache ich da falsch. Danke Peter |
AW: DragDrop mit TTreeViewItem als Ziel
Liste der Anhänge anzeigen (Anzahl: 1)
Letztlich willst Du ja ein Event auf das TreeviewItem verwenden, also musst Du denen zunächst auch die Events (am besten zur Laufzeit) zuordnen. Das habe ich im Create-Event gemacht. Da gibt es wohl einen Bug (?), da die Zuordnung nur funktioniert, wenn das TTreeView einmal expandiert wurde.
In der Anlage findest Du die lauffähige Demo, wo somit das Drag & Drop auf die Items auch funktioniert. Hier der angepasste Source:
Delphi-Quellcode:
unit Unit1;
interface uses System.SysUtils, System.Types, System.UITypes, System.Classes, System.Variants, FMX.Types, FMX.Controls, FMX.Forms, FMX.Graphics, FMX.Dialogs, FMX.ListView.Types, FMX.ListView.Appearances, FMX.ListView.Adapters.Base, FMX.ListView, FMX.TreeView, FMX.Layouts,FMX.Platform, FMX.Objects; type TForm1 = class(TForm) TreeView1: TTreeView; TreeViewItem1: TTreeViewItem; TreeViewItem2: TTreeViewItem; TreeViewItem3: TTreeViewItem; TreeViewItem4: TTreeViewItem; TreeViewItem5: TTreeViewItem; TreeViewItem6: TTreeViewItem; TreeViewItem7: TTreeViewItem; TreeViewItem8: TTreeViewItem; TreeViewItem9: TTreeViewItem; TreeViewItem10: TTreeViewItem; ListView1: TListView; Image1: TImage; procedure FormCreate(Sender: TObject); procedure ListView1MouseMove(Sender: TObject; Shift: TShiftState; X, Y: Single); procedure TreeView1DragOver(Sender: TObject; const Data: TDragObject; const Point: TPointF; var Operation: TDragOperation); procedure TreeView1DragDrop(Sender: TObject; const Data: TDragObject; const Point: TPointF); private { Private-Deklarationen } public { Public-Deklarationen } end; var Form1: TForm1; implementation {$R *.fmx} procedure TForm1.FormCreate(Sender: TObject); var Item: TListViewItem; i: integer; begin for i := 1 to 10 do begin Item:= ListView1.Items.Add; Item.Text:= 'Item' + i.ToString end; TreeView1.ExpandAll; // Ohne das funktioniert die Zuweisung nicht für untergeordnete Elemente! (Bug?) for i := 0 to TreeView1.GlobalCount-1 do begin TreeView1.ItemByGlobalIndex(i).OnDragDrop := TreeView1DragDrop; TreeView1.ItemByGlobalIndex(i).OnDragOver := TreeView1DragOver; end; TreeView1.CollapseAll; end; procedure TForm1.ListView1MouseMove(Sender: TObject; Shift: TShiftState; X, Y: Single); var Svc: IFMXDragDropService; DragData: TDragObject; Item: TListViewItem; List: TListView; begin if (SsLeft in Shift) then begin List:= Sender as TListView; Item:= TListViewItem(List.Selected); if Assigned(Item) and TPlatformServices.Current.SupportsPlatformService(IFMXDragDropService, Svc) then begin DragData.Source:= Item; // DragData.Data:= Item.TagObject; Svc.BeginDragDrop(Self, DragData, Image1.Bitmap); end; end; end; procedure TForm1.TreeView1DragDrop(Sender: TObject; const Data: TDragObject; const Point: TPointF); begin if Assigned(TreeView1.Selected) then begin Treeview1.Selected.Text:= TListViewItem(Data.Source).Text end; end; procedure TForm1.TreeView1DragOver(Sender: TObject; const Data: TDragObject; const Point: TPointF; var Operation: TDragOperation); begin Operation:= TDragOperation.copy; TTreeView(Sender).Selected:= TTreeView(Sender).ItemByPoint(Point.X, Point.y); end; end. |
AW: DragDrop mit TTreeViewItem als Ziel
Hallo Harry,
vielen Dank für Deine schnelle Anwort. Klingt einleuchtend den Treeviewitems die zwei Events zuzuordnen. Ja Du hast Recht, ich möchte die Items beeinflussen. Die Events sind ganz normal die von TTreeView? Also die ich auch angelegt habe? Klasse, Drag und Drop edelt doch jede Anwendung. Da ich die Items auch dynamisch herstelle, kann ich dann gleich die Events anhängen. Danke noch mal für Deine Hilfe. Jetzt wo man es weiß, klingt es einfach, aber da wäre ich nie drauf gekommen. Gruß Peter |
AW: DragDrop mit TTreeViewItem als Ziel
Zitat:
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 22:47 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