eine Möglichkeit schaffen, dass der Anwender die Nodes innerhalb des VST neu anordnen kann per Drag&Drop.
Ich hab das mal gemacht mithilfe der Beispiele, die im Internet im Umlauf sind.
Das waren damals zwei VSTs, die beide diese Methoden zugewiesen bekamen. Wenn von einem zum anderen gedraggt wurde, dann wurde der Node von einem Tree zum anderen kopiert; wenn innerhalb eines Trees gezogen wurde, dann dorthin verschoben.
Hoffe, das hilft.
PTreeNodeData ist ein Pointer auf eine eigene Struktur und für das Beispiel nicht wichtig.
Delphi-Quellcode:
procedure TfrmFavMan.FormCreate(Sender: TObject);
begin
trvSources.DragMode := dmAutomatic;
trvSources.OnDragOver := Tree1DragOver;
trvSources.OnDragDrop := Tree1DragDrop;
trvFavs.DragMode := dmAutomatic;
trvFavs.OnDragOver := Tree1DragOver;
trvFavs.OnDragDrop := Tree1DragDrop;
end;
procedure TfrmFavMan.Tree1DragOver(Sender: TBaseVirtualTree; Source: TObject;
Shift: TShiftState; State: TDragState; Pt: TPoint; Mode: TDropMode;
var Effect: Integer; var Accept: Boolean);
begin
Accept := (Source is TVirtualStringTree);
end;
procedure TfrmFavMan.Tree1DragDrop(Sender: TBaseVirtualTree; Source: TObject;
DataObject: IDataObject; Formats: TFormatArray; Shift: TShiftState;
Pt: TPoint; var Effect: Integer; Mode: TDropMode);
var
Attachmode : TVTNodeAttachMode;
Nodes : TNodeArray;
I : Integer;
DataOfSender : PTreeNodeData;
DataOfSource : PTreeNodeData;
DataOfParent : PTreeNodeData;
NewNode : PVirtualNode;
DrpTargetNode : PVirtualNode;
begin
if (nil = Sender.DropTargetNode) then exit;
if (Sender.GetFirst = Sender.DropTargetNode) and (Mode <> dmOnNode) then exit;
if Source = Sender then
begin
Effect := DROPEFFECT_MOVE
end
else
begin
Effect := DROPEFFECT_COPY;
end;
// Translate the drop position into an node attach mode.
case Mode of
dmAbove : AttachMode := amInsertBefore;
dmOnNode: AttachMode := amAddChildLast;
dmBelow : AttachMode := amInsertAfter;
else AttachMode := amNowhere;
end;
Nodes := TVirtualStringTree(Source).GetSortedSelection(True);
if Effect = DROPEFFECT_COPY then
begin
DrpTargetNode := Sender.DropTargetNode;
for I := 0 to High(Nodes) do
begin
NewNode := TVirtualStringTree(Sender).AddChild(DrpTargetNode);
DataOfSource := TVirtualStringTree(Source).GetNodeData(Nodes[I]);
DataOfSender := TVirtualStringTree(Sender).GetNodeData(NewNode);
if (nil <> DataOfSource) then
begin
if (nil <> DataOfSender) then
begin
// Datenabgleich machen
end;
end;
end;
TVirtualStringTree(Sender).FullExpand(DrpTargetNode);
end
else
begin
DataOfParent := TVirtualStringTree(Source).GetNodeData(Sender.DropTargetNode);
for I := 0 to High(Nodes) do
begin
TVirtualStringTree(Source).MoveTo(Nodes[I], Sender.DropTargetNode, AttachMode, False);
DataOfSource := TVirtualStringTree(Source).GetNodeData(Nodes[I]);
// Datenabgleich machen
end;
end;
end;