AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein GUI-Design mit VCL / FireMonkey / Common Controls Delphi VirtualTreeView - Drag'n'Drop nur in jeweiliger Ebene?
Thema durchsuchen
Ansicht
Themen-Optionen

VirtualTreeView - Drag'n'Drop nur in jeweiliger Ebene?

Ein Thema von Hedge · begonnen am 12. Aug 2009 · letzter Beitrag vom 13. Aug 2009
Antwort Antwort
Hedge

Registriert seit: 30. Jun 2007
278 Beiträge
 
Delphi 2009 Professional
 
#1

VirtualTreeView - Drag'n'Drop nur in jeweiliger Ebene?

  Alt 12. Aug 2009, 23:56
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?
٩๏̯͡๏)۶
  Mit Zitat antworten Zitat
Benutzerbild von anse
anse

Registriert seit: 30. Okt 2006
Ort: Neuenkirchen
197 Beiträge
 
Delphi 11 Alexandria
 
#2

Re: VirtualTreeView - Drag'n'Drop nur in jeweiliger Ebene?

  Alt 13. Aug 2009, 00:13
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;
Ansgar Becker
  Mit Zitat antworten Zitat
Hedge

Registriert seit: 30. Jun 2007
278 Beiträge
 
Delphi 2009 Professional
 
#3

Re: VirtualTreeView - Drag'n'Drop nur in jeweiliger Ebene?

  Alt 13. Aug 2009, 00:37
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;
٩๏̯͡๏)۶
  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 03:54 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