Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Delphi VirtualTreeView - Drag'n'Drop nur in jeweiliger Ebene? (https://www.delphipraxis.net/138574-virtualtreeview-dragndrop-nur-jeweiliger-ebene.html)

Hedge 12. Aug 2009 22:56


VirtualTreeView - Drag'n'Drop nur in jeweiliger Ebene?
 
Ich habe ein VirtualTreeView mit 2 Ebenen.
1. Ebene: Ordner
2. Ebene: Einträge

Wenn man jetzt via Drag'n'Drop (im selben VTV) einen Ordner auf einen der Einträge 2. Ebene dropped, dann wird der Ordner ein Ordner 2. Ebene.
Diesen Fall möchte ich verbieten im OnDragOver-Event. Es soll hingegen gestattet sein einen Ordner auf einen anderen zu ziehen, da dieser dann lediglich verschoben wird aber nicht eine Ebene tiefer rutscht.

Wie erkenne ich, dass sich bei den zu draggenden Items ein Ordner befindet?

Bei den Einträgen soll verboten sein, dass diese auf einen Ordner gezogen werden (bzw. wenn sie daraufgezogen werden, dann werden sie zum letzten Eintrag des Ordners).
Ausserdem soll verboten werden, dass diese in die Ordner-Ebene verschoben werden.

Habt ihr da ein paar Ideen?

anse 12. Aug 2009 23:13

Re: VirtualTreeView - Drag'n'Drop nur in jeweiliger Ebene?
 
Schau dir mal die Events OnDragOver und OnDragDrop an. In OnDragOver kannst du die "Erlaubnis" des droppens über eine "Accept" Variable steuern. Z.B.:
Delphi-Quellcode:
procedure Bla.VTDragOver(Sender: TBaseVirtualTree;
  Source: TObject; Shift: TShiftState; State: TDragState; Pt: TPoint;
  Mode: TDropMode; var Effect: Integer; var Accept: Boolean);
var
  Node: PVirtualNode;
begin
  Accept := False;
  if Source = Sender then begin
    Node := Sender.GetNodeAt(Pt.X, Pt.Y);
    Accept := Assigned(Node) and (Sender.GetNodeLevel(Node) = 1);
  end;
end;

Hedge 12. Aug 2009 23:37

Re: VirtualTreeView - Drag'n'Drop nur in jeweiliger Ebene?
 
Ah danke.
Habe jetzt das gewünscht Verhalten erreicht.

OnDragDrop sieht so aus:

Delphi-Quellcode:
Node := Sender.DropTargetNode;
DropMode := amInsertAfter;
if ((VST.GetNodeLevel(VST.FocusedNode)=1) AND (VST.GetNodeLevel(Node)=0)) then
DropMode := amAddChildLast;
Sender.ProcessDrop(DataObject, Node, Effect, DropMode);
und OnDragOver so:

Delphi-Quellcode:
  Node := Sender.GetNodeAt(Pt.X, Pt.Y);
  case Mode of
    dmOnNode: Accept := true;
  else
    Accept := false;
  end;
  if (Sender.GetNodeLevel(Sender.FocusedNode)=0) and (Sender.GetNodeLevel(Node)=1) then
      Accept := false;


Alle Zeitangaben in WEZ +1. Es ist jetzt 13:23 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