![]() |
Feststellen ob VirtualTreeView gerade im "Drag-Mode" ist
Moin!
Hat der VST eine eingebaute Möglichkeit um festzustellen ob er gerade "eins übergezogen" bekommt? ;-) Hintergrund ist folgender: Ich möchte eine Möglichkeit schaffen, dass der Anwender die Nodes innerhalb des VST neu anordnen kann per Drag&Drop. Die Methodik dazu ist mir soweit klar. Allerdings benutze ich auch das Event VST.OnNodeClick, welches fälschlicherweise auch ausgelöst wird wenn man gerade einen Node "herumschubst" und über einem anderen Node loslässt. Heißt also, ich müsste in OnNodeClick abfragen ob gerade was "gedragt" wird oder nicht. Im Zweifel mache ich das über eine globale Boolean, aber eleganter wäre es über eine abfragbare Property. Grüße Cody |
AW: Feststellen ob VirtualTreeView gerade im "Drag-Mode" ist
Hi Codehunter,
schau dir mal die VirtualTreeView.TreeStates an. Da sollte dabei sein was du suchst. Unten mal ein Auszug. Das sollte eigentlich schon alles sein.
Delphi-Quellcode:
tsVCLDragging, // VCL drag'n drop in progress.
tsVCLDragPending, // One-shot flag to avoid clearing the current selection on implicit mouse up for VCL drag. tsVCLDragFinished, // Flag to avoid triggering the OnColumnClick event twice tsOLEDragging, // OLE dragging in progress. tsOLEDragPending, // User has requested to start delayed dragging. |
AW: Feststellen ob VirtualTreeView gerade im "Drag-Mode" ist
Hmmm jaaaa, prinzipiell wäre das die Lösung gewesen. Nur dummerweise scheint es so zu sein, dass OnNodeClick erst ausgelöst wird nachdem die Drag-Aktion schon abgearbeitet und tsDragXXX aus TreeStates entfernt wurde.
Das scheint allgemein ein Bug im VST zu sein. Denn ein NodeClick ist nach meiner Definition einmal LButtonDown und einmal LButtonUp auf dem selben Node, nicht auf zwei verschiedenen Nodes. Das macht es aber auch mit einer globalen Boolean nicht einfacher weil OnDragDrop vor OnNodeClick gefeuert wird. So ein Shitkram :-( |
AW: Feststellen ob VirtualTreeView gerade im "Drag-Mode" ist
Müsste mir das jetzt auch genauer anschauen. Die Frage ist, was willst du damit bezwecken? Worum geht es dir? Ich musste die TreeStates bisher noch nie selbst auswerten.
Vielleicht ist dein Ansatz noch nicht ganz richtig und man könnte das viel einfacher lösen. Die andere Frage wäre, ob du nicht mit OnMouseDown und OnMouseUp arbeiten könntest?! |
AW: Feststellen ob VirtualTreeView gerade im "Drag-Mode" ist
Einfach die fokussierte (gedraggte) Node mit HitInfo.HitNode vergleichen und noch ggf HitInfo.HitPositions abchecken.
Ist es dieselbe dann wars nen Klick, ansonsten hast du die Node woanders hingezogen und fallen gelassen. Die genauen Überprüfungen kannst du auch im TBaseVirtualTree.HandleMouseUp sehen, ziemlich am Ende unter dem Kommentar: // Is the mouse still over the same node? |
AW: Feststellen ob VirtualTreeView gerade im "Drag-Mode" ist
Zitat:
Zitat:
|
AW: Feststellen ob VirtualTreeView gerade im "Drag-Mode" ist
Zitat:
|
AW: Feststellen ob VirtualTreeView gerade im "Drag-Mode" ist
Zitat:
![]() |
AW: Feststellen ob VirtualTreeView gerade im "Drag-Mode" ist
Zitat:
Die Komponente ist auch eigentlich DER Grund wieso ich nicht schonmal mit FMX gearbeitet habe. Würde mich brennend interessieren, aber ich will den VST nicht loslassen weil nahezu alle meine Anwendung daraus bestehen bzw. mindestens einen benutzen. |
AW: Feststellen ob VirtualTreeView gerade im "Drag-Mode" ist
Zitat:
Das waren damals zwei VSTs, die beide diese Methoden zugewiesen bekamen. Wenn von einem zum anderen gedraggt wurde, dann wurde der Node von einem Tree zum anderen kopiert; wenn innerhalb eines Trees gezogen wurde, dann dorthin verschoben. Hoffe, das hilft. PTreeNodeData ist ein Pointer auf eine eigene Struktur und für das Beispiel nicht wichtig.
Delphi-Quellcode:
procedure TfrmFavMan.FormCreate(Sender: TObject);
begin trvSources.DragMode := dmAutomatic; trvSources.OnDragOver := Tree1DragOver; trvSources.OnDragDrop := Tree1DragDrop; trvFavs.DragMode := dmAutomatic; trvFavs.OnDragOver := Tree1DragOver; trvFavs.OnDragDrop := Tree1DragDrop; end; procedure TfrmFavMan.Tree1DragOver(Sender: TBaseVirtualTree; Source: TObject; Shift: TShiftState; State: TDragState; Pt: TPoint; Mode: TDropMode; var Effect: Integer; var Accept: Boolean); begin Accept := (Source is TVirtualStringTree); end; procedure TfrmFavMan.Tree1DragDrop(Sender: TBaseVirtualTree; Source: TObject; DataObject: IDataObject; Formats: TFormatArray; Shift: TShiftState; Pt: TPoint; var Effect: Integer; Mode: TDropMode); var Attachmode : TVTNodeAttachMode; Nodes : TNodeArray; I : Integer; DataOfSender : PTreeNodeData; DataOfSource : PTreeNodeData; DataOfParent : PTreeNodeData; NewNode : PVirtualNode; DrpTargetNode : PVirtualNode; begin if (nil = Sender.DropTargetNode) then exit; if (Sender.GetFirst = Sender.DropTargetNode) and (Mode <> dmOnNode) then exit; if Source = Sender then begin Effect := DROPEFFECT_MOVE end else begin Effect := DROPEFFECT_COPY; end; // Translate the drop position into an node attach mode. case Mode of dmAbove : AttachMode := amInsertBefore; dmOnNode: AttachMode := amAddChildLast; dmBelow : AttachMode := amInsertAfter; else AttachMode := amNowhere; end; Nodes := TVirtualStringTree(Source).GetSortedSelection(True); if Effect = DROPEFFECT_COPY then begin DrpTargetNode := Sender.DropTargetNode; for I := 0 to High(Nodes) do begin NewNode := TVirtualStringTree(Sender).AddChild(DrpTargetNode); DataOfSource := TVirtualStringTree(Source).GetNodeData(Nodes[I]); DataOfSender := TVirtualStringTree(Sender).GetNodeData(NewNode); if (nil <> DataOfSource) then begin if (nil <> DataOfSender) then begin // Datenabgleich machen end; end; end; TVirtualStringTree(Sender).FullExpand(DrpTargetNode); end else begin DataOfParent := TVirtualStringTree(Source).GetNodeData(Sender.DropTargetNode); for I := 0 to High(Nodes) do begin TVirtualStringTree(Source).MoveTo(Nodes[I], Sender.DropTargetNode, AttachMode, False); DataOfSource := TVirtualStringTree(Source).GetNodeData(Nodes[I]); // Datenabgleich machen end; end; end; |
Alle Zeitangaben in WEZ +1. Es ist jetzt 06:53 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz