AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

DragDrop mit TTreeViewItem als Ziel

Ein Thema von Peter-Pascal · begonnen am 10. Dez 2022 · letzter Beitrag vom 5. Jan 2023
Antwort Antwort
Seite 1 von 2  1 2      
Peter-Pascal

Registriert seit: 18. Feb 2007
Ort: 32139 Spenge
197 Beiträge
 
Delphi 11 Alexandria
 
#1

DragDrop mit TTreeViewItem als Ziel

  Alt 10. Dez 2022, 10:30
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:
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;
Auch DragOver funktioniert:

Delphi-Quellcode:
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;
Aber bei DragDrop keine Reaktion:

Delphi-Quellcode:
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;
Es wird nichts im Log angezeigt, im Gegensatz zum Start. Offensichtlich wird die Funktion nicht mal ausgeführt.

Was mache ich falsch? Kann mir jemand helfen?

Danke schon mal.

Gruß Peter
Peter Niemeier
  Mit Zitat antworten Zitat
Benutzerbild von Harry Stahl
Harry Stahl

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

AW: DragDrop mit TTreeViewItem als Ziel

  Alt 12. Dez 2022, 18:15
Lass doch mal das

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.
  Mit Zitat antworten Zitat
Peter-Pascal

Registriert seit: 18. Feb 2007
Ort: 32139 Spenge
197 Beiträge
 
Delphi 11 Alexandria
 
#3

AW: DragDrop mit TTreeViewItem als Ziel

  Alt 12. Dez 2022, 20:07
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
Miniaturansicht angehängter Grafiken
dragdrop.png  
Peter Niemeier
  Mit Zitat antworten Zitat
Benutzerbild von Harry Stahl
Harry Stahl

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

AW: DragDrop mit TTreeViewItem als Ziel

  Alt 12. Dez 2022, 21:56
Die Fehlermeldung kommt dann aus dem DragDropEvent.

Da musst Du es wie folgt machen:

Item:= TTreeViewItem(Sender);

Denn da ist der Sender nicht der TTreeview sondern das Item selbst.
  Mit Zitat antworten Zitat
Benutzerbild von jaenicke
jaenicke

Registriert seit: 10. Jun 2003
Ort: Berlin
9.345 Beiträge
 
Delphi 11 Alexandria
 
#5

AW: DragDrop mit TTreeViewItem als Ziel

  Alt 12. Dez 2022, 22:30
Um sicherzugehen wäre auch ein sicherer Cast sinnvoll:
Delphi-Quellcode:
Item := Sender as TTreeViewItem;
// Zumindest wenn es unerklärliche Fehler gibt zum Debuggen
Dann wäre die Meldung deutlich verständlich gewesen.

Zeitkritisch ist die Stelle ja nicht, deshalb würde ich dort gar keine harten Casts machen.
Sebastian Jänicke
Alle eigenen Projekte sind eingestellt, ebenso meine Homepage, Downloadlinks usw. im Forum bleiben aktiv!

Geändert von jaenicke (12. Dez 2022 um 22:33 Uhr)
  Mit Zitat antworten Zitat
Peter-Pascal

Registriert seit: 18. Feb 2007
Ort: 32139 Spenge
197 Beiträge
 
Delphi 11 Alexandria
 
#6

AW: DragDrop mit TTreeViewItem als Ziel

  Alt 13. Dez 2022, 15:49
Danke für eure Antworten.
Ich habe es jetzt umgebaut:

Delphi-Quellcode:
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;
Die Funktion TreeViewEBilanzDragDrop wird offensichtlich nicht aufgerufen.
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
Miniaturansicht angehängter Grafiken
dragdrop.png  
Peter Niemeier
  Mit Zitat antworten Zitat
Benutzerbild von Harry Stahl
Harry Stahl

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

AW: DragDrop mit TTreeViewItem als Ziel

  Alt 13. Dez 2022, 16:00
DragDrop müsste jedenfalls so lauten:

Delphi-Quellcode:
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;
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.

Geändert von Harry Stahl (13. Dez 2022 um 16:04 Uhr)
  Mit Zitat antworten Zitat
Peter-Pascal

Registriert seit: 18. Feb 2007
Ort: 32139 Spenge
197 Beiträge
 
Delphi 11 Alexandria
 
#8

AW: DragDrop mit TTreeViewItem als Ziel

  Alt 13. Dez 2022, 16:22
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:

item:= (Sender as TTreeViewItem); //.ItemByPoint(Point.X, Point.y); Ich hätte jetzt gedacht, dass der Sender TTreeView ist und nicht das Item?

Bislang glaubte ich das zwischen Sender as TTreeViewItem und TTreeViewItem(sender) kein Unterschied ist.

Gruß Peter
Peter Niemeier
  Mit Zitat antworten Zitat
peterbelow

Registriert seit: 12. Jan 2019
Ort: Hessen
672 Beiträge
 
Delphi 11 Alexandria
 
#9

AW: DragDrop mit TTreeViewItem als Ziel

  Alt 14. Dez 2022, 11:36
Vorab eine Frage:

item:= (Sender as TTreeViewItem); //.ItemByPoint(Point.X, Point.y); Ich hätte jetzt gedacht, dass der Sender TTreeView ist und nicht das Item?

Bislang glaubte ich das zwischen Sender as TTreeViewItem und TTreeViewItem(sender) kein Unterschied ist.

Gruß Peter
Ein "as" typecast erzeugt eine Exception (EInvalidCast oder so) wenn das Objekt (Sender in diesem Fall) nicht eine Instanz der Zielklasse (oder einer Ableitung davon) ist. Ein "hard cast" macht das nicht, der Compiler nimmt da an, der Programmierer wisse schon, was er tut. Das kann unerwartete Effekte haben, wenn der Programmierer irrt...
Peter Below
  Mit Zitat antworten Zitat
Peter-Pascal

Registriert seit: 18. Feb 2007
Ort: 32139 Spenge
197 Beiträge
 
Delphi 11 Alexandria
 
#10

AW: DragDrop mit TTreeViewItem als Ziel

  Alt 14. Dez 2022, 12:44
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
Peter Niemeier
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


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 07:57 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