Delphi-PRAXiS
Seite 2 von 2     12   

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/)
-   -   Delphi DragDrop mit TTreeViewItem als Ziel (https://www.delphipraxis.net/212058-dragdrop-mit-ttreeviewitem-als-ziel.html)

Peter-Pascal 2. Jan 2023 17:26

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

Harry Stahl 3. Jan 2023 10:48

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.

Peter-Pascal 3. Jan 2023 15:37

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

Harry Stahl 5. Jan 2023 14:43

AW: DragDrop mit TTreeViewItem als Ziel
 
Zitat:

Zitat von Peter-Pascal (Beitrag 1516931)
Hallo Harry,
vielen Dank für Deine schnelle Anwort.
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

Prima, freut mich, dass das jetzt so für Dich passt. Zugegebenermaßen war die Lösung evtl. nicht so direkt offensichtlich, insbesondere die Sache mit dem notwendigen Expand.


Alle Zeitangaben in WEZ +1. Es ist jetzt 14:03 Uhr.
Seite 2 von 2     12   

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