![]() |
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:
Um dann noch zu überprüfen, ob die Node an der neuen Position abgelegt werden darf, steht folgendes im OnDragOver-Ereignis:
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;
Delphi-Quellcode:
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).
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; 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 |
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:
Funktioniert einwandfrei. :)
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; Chris |
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 08:38 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