AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Nodes in VirtualStringTree verschieben.

Ein Thema von formosa · begonnen am 19. Dez 2006 · letzter Beitrag vom 21. Dez 2006
Antwort Antwort
formosa

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

Nodes in VirtualStringTree verschieben.

  Alt 19. Dez 2006, 19: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
Alloc

Registriert seit: 18. Apr 2005
Ort: Griesheim
167 Beiträge
 
Delphi 2006 Professional
 
#2

Re: Nodes in VirtualStringTree verschieben.

  Alt 19. Dez 2006, 20:49
Hi Chris,

im Prinzip ist ein Großteil des Codes ja nur dazu da, zu erkennen, ob die Move-Aktion erlaubt werden soll.
Das VST bietet dazu zwei Events:
1. OnDragAllowed: Dort kann man beim Versuch des Nutzers einen Node zu bewegen sagen, ob der gerade aktive Node verschiebbar sein soll.
2. OnDragOver: In diesem Event kann man während des Bewegens eines Nodes angeben, ob der Node an der aktuellen Stelle eingefügt werden darf. Den Parameter "Mode" beachten. In dem Event kannst du dem Nutzer auch visuell zeigen, dass er einen Node an der aktuellen Stelle nicht droppen kann.

Hilft zwar nicht unbedingt soviel beim Code sparen, aber damit hast du schonmal einiges an Übersichtlichkeit gewonnen. =)

Gruß,
Chris

/Edit: Um den zu verschiebenden Node und das aktuelle Ziel-Node in OnDragOver zu bekommen, VST.FocusedNode und VST.DropTargetNode verwenden.
Christian Illy
ONI2.net, basicly every important link about Oni.
  Mit Zitat antworten Zitat
formosa

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

Re: Nodes in VirtualStringTree verschieben.

  Alt 21. Dez 2006, 10:21
Hallo,

Ich hab jetzt die meisten Abfragen was, wie verschoben werden kann ins OnDragOver Event veschoben. Hab den Event aus irgendwelchen Gründen komplett vernachlässigt, und mich nur auf OnDragDrop konzentriert.

Vielen Dank noch,

Gruss Chris
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 15:53 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz