Entwickler-Ecke

Grafische Benutzeroberflächen (VCL & FireMonkey) - Treeview - Drag/Drop erlauben abhängig vom TreeNode


Holgerwa - Di 08.02.05 00:31
Titel: Treeview - Drag/Drop erlauben abhängig vom TreeNode
Hallo,

ich habe einen TreeView, in dem ich einzelne TreeNodes einfach per Drag&Drop innerhalb des TreeViews verschieben kann.
Auch das Verhindern des "Drops" über einem TreeNode, über dem das nicht gemacht werden soll, funktioniert.
Dazu gibt es auch entsprechende Events, die das einfach ermöglichen.

Jetzt aber brauche ich etwas, das anscheinend nicht so normal ist:
Ich möchte, abhängig vom TreeNode, den der Benutzer "draggen" will, entscheiden, ob er diesen überhaupt "draggen" darf.
Anders ausgedrückt: Angenommen, ich habe die Nodes "1", "2" und "3". Jetzt kann der Benutzer ja jeden einzelnen "draggen". Ich möchte aber verhindern, daß z.B. der Node "3" gedraggt werden kann. Das soll einfach nicht funktionieren, man müßte also das Draggen direkt beim Start abbrechen.
Der OnStartDrag Event scheint das nicht zu können.

Hat jemand eine Idee?

Vielen Dank!
Holger


retnyg - Di 08.02.05 03:20

könntest ja im onclick ereignis prüfen ob GetNodeAT(x,y) gedraggt werden darf falls nicht disablest du die acceptdrag geschichte


wwwdirk - Di 08.02.05 09:50

Habe letzte Woche ein ähnliches Verhalten implementiert, allerdings habe ich nicht das Draggen einiger Knoten unterbunden, sondern das Ablegen im OnDragOver-Ereignis.

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
procedure TfrmConfigMenu.trvMenuExplorerDragOver(Sender, Source: TObject;
  X, Y: Integer; State: TDragState; var Accept: Boolean);
var
  target, origin: TTreeNode;
begin
  target := trvMenuExplorer.GetNodeAt (X, Y);
  origin := trvMenuExplorer.Selected;
  Accept := (target.Level > 0and (origin.Level > 0and (target <> origin);
end;

Um das Draggen zu unterbinden, solltest Du mal versuchen die Eigenschaft DragMode erst zur Laufzeit (unter Berücksichtigung gewünschter Kriterien) zu setzen:

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
procedure TfrmConfigMenu.trvMenuExplorerClick(Sender: TObject);
begin
  with trvMenuExplorer.Selected do
    // Level oder andere Kriterien prüfen ...
    if Level = 0 then
      trvMenuExplorer.DragMode := dmManual
    else
      trvMenuExplorer.DragMode := dmAutomatic;
end;


Moderiert von user profile iconraziel: Code- durch Delphi-Tags ersetzt.


Holgerwa - Di 08.02.05 21:09

Hallo,

super, das funktioniert!
Vielen Dank!

Gruß,
Holger