AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein GUI-Design mit VCL / FireMonkey / Common Controls Delphi Feststellen ob VirtualTreeView gerade im "Drag-Mode" ist
Thema durchsuchen
Ansicht
Themen-Optionen

Feststellen ob VirtualTreeView gerade im "Drag-Mode" ist

Ein Thema von Codehunter · begonnen am 26. Sep 2016 · letzter Beitrag vom 27. Sep 2016
Antwort Antwort
Benutzerbild von Codehunter
Codehunter

Registriert seit: 3. Jun 2003
Ort: Thüringen
2.272 Beiträge
 
Delphi 10.4 Sydney
 
#1

Feststellen ob VirtualTreeView gerade im "Drag-Mode" ist

  Alt 26. Sep 2016, 09:21
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
Ich mache grundsätzlich keine Screenshots. Schießen auf Bildschirme gibt nämlich hässliche Pixelfehler und schadet der Gesundheit vom Kollegen gegenüber. I und E zu vertauschen hätte den selben negativen Effekt, würde aber eher dem Betriebsklima schaden
  Mit Zitat antworten Zitat
Aviator

Registriert seit: 3. Jun 2010
1.611 Beiträge
 
Delphi 10.3 Rio
 
#2

AW: Feststellen ob VirtualTreeView gerade im "Drag-Mode" ist

  Alt 26. Sep 2016, 09:39
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.

Geändert von Aviator (26. Sep 2016 um 09:48 Uhr) Grund: Sorry. Property Name falsch im Kopf gehabt!
  Mit Zitat antworten Zitat
Benutzerbild von Codehunter
Codehunter

Registriert seit: 3. Jun 2003
Ort: Thüringen
2.272 Beiträge
 
Delphi 10.4 Sydney
 
#3

AW: Feststellen ob VirtualTreeView gerade im "Drag-Mode" ist

  Alt 26. Sep 2016, 09:58
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
Ich mache grundsätzlich keine Screenshots. Schießen auf Bildschirme gibt nämlich hässliche Pixelfehler und schadet der Gesundheit vom Kollegen gegenüber. I und E zu vertauschen hätte den selben negativen Effekt, würde aber eher dem Betriebsklima schaden
  Mit Zitat antworten Zitat
Aviator

Registriert seit: 3. Jun 2010
1.611 Beiträge
 
Delphi 10.3 Rio
 
#4

AW: Feststellen ob VirtualTreeView gerade im "Drag-Mode" ist

  Alt 26. Sep 2016, 10:01
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?!
  Mit Zitat antworten Zitat
Benutzerbild von Stevie
Stevie

Registriert seit: 12. Aug 2003
Ort: Soest
4.027 Beiträge
 
Delphi 10.1 Berlin Enterprise
 
#5

AW: Feststellen ob VirtualTreeView gerade im "Drag-Mode" ist

  Alt 26. Sep 2016, 10:03
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?
Stefan
“Simplicity, carried to the extreme, becomes elegance.” Jon Franklin

Delphi Sorcery - DSharp - Spring4D - TestInsight

Geändert von Stevie (26. Sep 2016 um 10:15 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von Codehunter
Codehunter

Registriert seit: 3. Jun 2003
Ort: Thüringen
2.272 Beiträge
 
Delphi 10.4 Sydney
 
#6

AW: Feststellen ob VirtualTreeView gerade im "Drag-Mode" ist

  Alt 26. Sep 2016, 10:15
Die andere Frage wäre, ob du nicht mit OnMouseDown und OnMouseUp arbeiten könntest?!
Es führen immer mehrere Wege nach Rom... OnMouseXX geht auch, hat aber den Nachteil dass man sich immer erst per GetNodeAt und Client-Screen-Koordinatenumrechnung den Zielnode holen muss. Da ist OnNodeClick manchmal komfortabler, manchmal aber auch kontraproduktiv.
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.
Jupp, das scheint zu funktionieren. Scheint so als hättest du das Problem auch schon mal gehabt, ansonsten kommt man ja so schnell nicht darauf oder? ^^
Ich mache grundsätzlich keine Screenshots. Schießen auf Bildschirme gibt nämlich hässliche Pixelfehler und schadet der Gesundheit vom Kollegen gegenüber. I und E zu vertauschen hätte den selben negativen Effekt, würde aber eher dem Betriebsklima schaden
  Mit Zitat antworten Zitat
Benutzerbild von Stevie
Stevie

Registriert seit: 12. Aug 2003
Ort: Soest
4.027 Beiträge
 
Delphi 10.1 Berlin Enterprise
 
#7

AW: Feststellen ob VirtualTreeView gerade im "Drag-Mode" ist

  Alt 26. Sep 2016, 10:20
Scheint so als hättest du das Problem auch schon mal gehabt, ansonsten kommt man ja so schnell nicht darauf oder? ^^
Nicht genau dieses aber ich hab schon das eine oder andere mit dem Virtual Treeview gemacht
Stefan
“Simplicity, carried to the extreme, becomes elegance.” Jon Franklin

Delphi Sorcery - DSharp - Spring4D - TestInsight
  Mit Zitat antworten Zitat
Benutzerbild von Codehunter
Codehunter

Registriert seit: 3. Jun 2003
Ort: Thüringen
2.272 Beiträge
 
Delphi 10.4 Sydney
 
#8

AW: Feststellen ob VirtualTreeView gerade im "Drag-Mode" ist

  Alt 26. Sep 2016, 10:56
Nicht genau dieses aber ich hab schon das eine oder andere mit dem Virtual Treeview gemacht
Ich ja eigentlich auch. Allerdings ist es bei dem Featuremonster nicht ganz einfach den Überblick zu behalten ^^
Ich mache grundsätzlich keine Screenshots. Schießen auf Bildschirme gibt nämlich hässliche Pixelfehler und schadet der Gesundheit vom Kollegen gegenüber. I und E zu vertauschen hätte den selben negativen Effekt, würde aber eher dem Betriebsklima schaden
  Mit Zitat antworten Zitat
Aviator

Registriert seit: 3. Jun 2010
1.611 Beiträge
 
Delphi 10.3 Rio
 
#9

AW: Feststellen ob VirtualTreeView gerade im "Drag-Mode" ist

  Alt 26. Sep 2016, 11:10
Nicht genau dieses aber ich hab schon das eine oder andere mit dem Virtual Treeview gemacht
Ich ja eigentlich auch. Allerdings ist es bei dem Featuremonster nicht ganz einfach den Überblick zu behalten ^^
Er ist schon sehr umfangreich, dass ist richtig. Aber wenn man sich mehrere Jahre mit der Komponente und deren SourceCode beschäftigt hat, dann ist sie eigentlich wie jede andere Komponente auch. Nur eben sehr viel umfangreicher.

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.
  Mit Zitat antworten Zitat
Benutzerbild von ConnorMcLeod
ConnorMcLeod

Registriert seit: 13. Okt 2010
Ort: Bayern
490 Beiträge
 
Delphi 10.4 Sydney
 
#10

AW: Feststellen ob VirtualTreeView gerade im "Drag-Mode" ist

  Alt 27. Sep 2016, 18:17
eine Möglichkeit schaffen, dass der Anwender die Nodes innerhalb des VST neu anordnen kann per Drag&Drop.
Ich hab das mal gemacht mithilfe der Beispiele, die im Internet im Umlauf sind.
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;
Nr.1 Delphi-Tool: [F7]
  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 18:51 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