Delphi-PRAXiS

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 VirtualStringTree und Drag'n'Drop (https://www.delphipraxis.net/26431-virtualstringtree-und-dragndrop.html)

CalganX 23. Jul 2004 20:47


VirtualStringTree und Drag'n'Drop
 
Hi,
ich habe inzwischen die Grundlagen des Drag'n'Drop's beim VirtualStringTree realisieren können. Sprich die Items lassen sich bewegen.
Dazu habe ich (aus der Doku) folgendes im OnDragDrop-Eregnis stehen:
Delphi-Quellcode:
procedure TfrmMain.vstDataDragDrop(Sender: TBaseVirtualTree;
  Source: TObject; DataObject: IDataObject; Formats: TFormatArray;
  Shift: TShiftState; Pt: TPoint; var Effect: Integer; Mode: TDropMode);
var
  i: Integer;
  AttachMode: TVTNodeAttachMode;
begin
  if Length(Formats) > 0 then
  begin
    for i:=0 to High(Formats) do
      if Formats[i] = CF_VIRTUALTREE then
      begin
        case Mode of
          dmAbove:
            AttachMode := amInsertBefore;
          dmBelow:
            AttachMode := amInsertAfter;
          dmOnNode:
            AttachMode := amNowhere;
        else
          if Assigned(Source) and (Source is TBaseVirtualTree) and (Sender <> Source) then
            AttachMode := amInsertBefore
          else
            AttachMode := amNowhere;
        end;
        Sender.ProcessDrop(DataObject, Sender.DropTargetNode, Effect, AttachMode);
        Break;
      end;
  end;
end;
Um dann noch zu überprüfen, ob die Node an der neuen Position abgelegt werden darf, steht folgendes im OnDragOver-Ereignis:
Delphi-Quellcode:
procedure TfrmMain.vstDataDragOver(Sender: TBaseVirtualTree;
  Source: TObject; Shift: TShiftState; State: TDragState; Pt: TPoint;
  Mode: TDropMode; var Effect: Integer; var Accept: Boolean);
begin
  case Mode of
    dmAbove, dmBelow:
      Accept := true;
  else
    Accept := false;
  end;
end;
Mein Problem ist jetzt, dass das, was dort steht nicht uneingeschränkt gilt. Genauer gesagt, dürfen die Nodes nur auf Ihrer Ebene bleiben (das heißt Ebene und Parent müssen gleich bleiben).
Nur komme ich nicht an die Node dran, die gerade verschoben wird und vorallem nicht an die Position, wo es hinsoll. Okay... Wenn ich das richtig sehe habe ich die Koordinaten, allerdings bringt mir das nichts, um darauf zu schließen in welcher Ebene das landen wird.

Kennt jemand eine elegante Möglichkeit dieses kleine Problem zu lösen?

Chris

CalganX 24. Jul 2004 12:54

Re: VirtualStringTree und Drag'n'Drop
 
Hi,
so... Habe es gerade selber lösen können. :firejump:

Für die, die an der Lösung interessiert sind:
Delphi-Quellcode:
procedure TfrmMain.vstDataDragOver(Sender: TBaseVirtualTree;
  Source: TObject; Shift: TShiftState; State: TDragState; Pt: TPoint;
  Mode: TDropMode; var Effect: Integer; var Accept: Boolean);
var
  pUsedNode, pTargetNode: PVirtualNode;
begin
  pUsedNode := vstData.FocusedNode;
  pTargetNode := vstData.DropTargetNode;

  if (pUsedNode <> nil) and (pTargetNode <> nil) then begin
    Accept := (pUsedNode.Parent = pTargetNode.Parent);
  end;
end;
Funktioniert einwandfrei. :)

Chris

stho 6. Nov 2009 16:05

Re: VirtualStringTree und Drag'n'Drop
 
ich weiß das der thread schon einige jahre alt ist, aber, WO gibt es diese doku zu Drag&Drop?
Hätte da GROOOOOOßES interesse dran :-)


Alle Zeitangaben in WEZ +1. Es ist jetzt 10:28 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