Autor Beitrag
Holgerwa
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 325

WIN XP Pro, Vista Business
Delphi 7 Pro, BDS 2006 Pro
BeitragVerfasst: Di 08.02.05 00:31 
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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 2754

SNES, GB, GBA, CPC, A500, 486/66, P4/3.0HT: NintendOS, AmigaOS, DoS
Delphi 5, Delphi 7
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 38


D6 Prof / D2005 Prof
BeitragVerfasst: 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.
ausblenden 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:
ausblenden 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 325

WIN XP Pro, Vista Business
Delphi 7 Pro, BDS 2006 Pro
BeitragVerfasst: Di 08.02.05 21:09 
Hallo,

super, das funktioniert!
Vielen Dank!

Gruß,
Holger