Also ich mache eingentlich nichts weiter als mit der Maus einen Node auswählen, welcher dann verschoben werden kann.
Das VST wird erst zur Laufzeit und bei bestimmten aktionen erzeugt.
(Macht es einen unterschied ob im RAD hinzugefügt oder zur Laufzeit erstellt) Wie gesagt unter windows kein ding.
Ich habe gedacht es könnte vll an dem DragType liegen und habe den im Quellcode für Linux auf "dtVCL" umgestellt und siehe da es funktioniert.
Weis aber jetzt noch nicht ob ich mir damit irgendwelche späteren Drag&Drop operationen verbaue?
In meiner onDragDrop procedure steht eigentlich nichts wildes drinne
Code: Alles auswählen
// onDragDrop
procedure TOGGTab.VST_DragDrop(Sender: TBaseVirtualTree; Source: TObject;
DataObject: IDataObject; Formats: TFormatArray; Shift: TShiftState;
const Pt: TPoint; var Effect: LongWord; Mode: TDropMode);
var
node_Source, node_Target: PVirtualNode;
attMode: TVTNodeAttachMode;
i : Integer;
begin
(* Ablaufplan
- Source Node = NodeFocused , Target Node = DropTargetNode
- Abbruch wenn Source und Target gleich sind
- DropMode auswerten - attach Mode ermitteln
- Node verschieben
*)
node_Source:=(Source as TVirtualStringTree).FocusedNode;
node_Target:=Sender.DropTargetNode;
if node_Source = node_Target then // Abbruch wenn beide gleich sind
Exit;
case Mode of // DropMode auswerten
dmNowhere: // nirgendwo = target node = nil
begin// im VST-code wird bei target_node=nil immer attMode=amAddChildFirst
// ausgelöst. Daher wird der letzte Node genommen und attMode=amInsertAfter
node_Target:=Sender.GetLast(); // letzten Node im VST zuweisen
attMode:=amInsertAfter;
end;
dmAbove: attMode := amInsertBefore;
dmBelow: attMode := amInsertAfter;
dmOnNode: // Drop direkt auf einen node - kein nested node erzeugen
begin
if node_Source^.Index > node_Target^.Index then
attMode:=amInsertBefore
else
attMode:=amInsertAfter;
end;
end;
Sender.MoveTo(node_Source, node_Target, attMode, False); // Node verschieben
end;
Unter Linux ruft er mir die procedure nicht auf (Linux ist frisch aufgesetzt neustes FPC und Lazarus)