Einzelnen Beitrag anzeigen

formosa

Registriert seit: 8. Apr 2006
Ort: Shanghai
29 Beiträge
 
Delphi 7 Professional
 
#1

Nodes in VirtualStringTree verschieben.

  Alt 19. Dez 2006, 20:52
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
  Mit Zitat antworten Zitat