Hallo zusammen,
Ich habe mich Heute mit dem verschieben von Nodes in der VirtualStringTree Komponente auseinander gesetzt. Da ich noch Anfänger bin hat es mich sehr viel Zeit gekostet.
In meinem Tree gibt es momentan nur zwei Arten von Nodes. Node "A", der weitere Nodes aufnehmen kann (so ne Art Ordner) und Node "B", welcher keine haben kann (wäre dann wohl die Datei). Also wollte ich das nur "A" nach "A" oder "B" nach "A" verschoben werden kann.
Weiterhin kann ein ParentNode nicht in einen ChildNode verschoben werden. Nodes welche auf einen anderen Node gezogen werden, sollten als Child hinzugefügt werden.
Gibt es eine Möglichkeit meinen Code etwas zu verkleinern?
Delphi-Quellcode:
//------------ Drag&Drop bei VST starten (verschieben) -------------
procedure TForm1.VSTDragDrop(Sender: TBaseVirtualTree; Source: TObject;
DataObject: IDataObject; Formats: TFormatArray; Shift: TShiftState;
Pt: TPoint; var Effect: Integer; Mode: TDropMode);
var
TempNode, SourceNode, TargetNode : PVirtualNode;
DropMode : TVTNodeAttachMode;
Data : PTreeData;
begin
SourceNode := VST.FocusedNode;
TargetNode := Sender.DropTargetNode;
If TargetNode = nil then exit; // Kein Node als Zeil = Exit;
Data := VST.GetNodeData(TargetNode); // Daten von ZielNode holen;
If Data^.FAnimal = true then // Wenn Ziel Ein Tier = Exit;
begin
beep;
exit;
end;
If SourceNode = TargetNode then exit; // Wenn Quelle = Ziel -> Exit;
while vst.GetNodeLevel(TargetNode)>0 do // Ist Source Parent von Target?
begin
TargetNode:=TargetNode.Parent;
If SourceNode = TargetNode then // Wenn Source = Parent von Target
begin
beep;
exit; // Exit; Weil Uebergertneter Node kann sich nicht in sich selbst verschieben;
end;
end;
TargetNode := Sender.DropTargetNode; // Target nochmals holen. Wegen Parent Test oben;
case Mode of
dmAbove: DropMode := amInsertBefore;
dmOnNode: DropMode := amInsertAfter;
dmBelow: DropMode := amInsertAfter;
else exit;
end;
if Mode = dmOnNode then // Abgelegt AUF Node = Als Child verschieben;
begin
if not VST.HasChildren[TargetNode] then // Node hat noch KEIN Child;
begin
VST.BeginUpdate;
TempNode := TargetNode; // Kopie von TagetNode erstellen;
TempNode := VST.AddChild(TempNode); // Dem Temporaeren Node ein Child hinzufügen;
VST.MoveTo(SourceNode, TempNode, DropMode, false); // Den SourceNode hinzufügen;
VST.DeleteNode(TempNode); // TempNode wieder löschen;
VST.Expanded[TargetNode]:=True; // TargetNode aufklappen;
VST.EndUpdate;
exit; // Exit:
end
else // Wenn TargetNode schon ein Child hat;
begin
TargetNode := TargetNode.LastChild; // TargetNode auf letztes Child setzten
end;
end;
VST.MoveTo(SourceNode, TargetNode, DropMode, false); // verschieben;
end;
//-------------------------------------------------------------------
Hab mich den ganzen Tag durch X Tutorials gearbeitet.
Für Vorschläge wie ich den Code verbessern kann wäre ich dankbar.
Schönen Gruss,
Chris