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