Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Delphi Drag&Drop mit VirtualTreeView (https://www.delphipraxis.net/134990-drag-drop-mit-virtualtreeview.html)

Alois 2. Jun 2009 23:30


Drag&Drop mit VirtualTreeView
 
Liste der Anhänge anzeigen (Anzahl: 3)
Hi,

ich brauch mal kurz etwas Schützenhilfe, stehe etwas auf dem Schlauch beim VST.

Während ich eine Zeile per Drag&Drop verschiebe, wird eine andere Zeile automatisch markiert sobald ich die Drag&Drop-Zeile über einen Texteintrag bewege.
(siehe Screenshot 1)

Problematisch wird es wenn ich die Markierte Zeile Nr.2 auf die erste Zeile verschieben möchte. Das geht nicht, da beide Zeilen jetzt einen Focus haben.
(siehe Screenshot 2)

Workaround: Ich kann das umgehen wenn ich die Drag&Drop-Zeile nicht über einen Texteintrag bewege. Dann werden auch die Drop-Markierungen über der ersten Zeile sichtbar.
(siehe Screenshot 3)

Als weitere Information kann ich erkennen das die Markierte Zeile die ich verschieben will die Farben FocusSelectionColor/FocusSelctionBorderColor hat und die Zeile
die ich nicht markiert bekommen möchte die Farben DragTargetColor/DragTargetBorderColor hat. Scheint als irgendein Drag&Drop Feature zu sein.

Kennt jemand eine Lösung für mein Problem, damit nur die zu verschiebende Zeile ihren Fokus behält und der Fokus der darunterliegenden Zeilen abgeschaltet bleibt?

Vielen Dank,

Alois ;)

generic 5. Jun 2009 13:39

Re: Drag&Drop mit VirtualTreeView
 
Ich glaube nicht das du den Focus meinst.
Der Focus ist die gepunktet Linie um einen Eintrag.

Es kann nur ein oder kein Element den Focus bekommen.
Delphi-Quellcode:
vst.focusednode
Enthält das Element.

Du kämpfst mit der Selection und dem Hotover bzw. wo gedropt werden soll.

Es gibt verschiedene Arten beim Drag und Drop.
Vor oder nach einen Knoten einfügen oder als Kind.
Bei der als Kind-Variante wird das ganze Element selektiert/markiert.

Wenn ich dein Problem richtig erkenne, möchtest du die Priorität der Downloads festlegen.
Daher macht ein Drop auf ein Element kein Sinn, da es nicht als Kind eingefügt werden soll.

Daher die Problemstellung:
Wie vermeide ich das ein "add as child" durchgeführt wird und auch die Möglichkeit nicht angezeigt wird.

Richtig verstanden?

Alois 5. Jun 2009 20:40

Re: Drag&Drop mit VirtualTreeView
 
Hi generic,

erst mal Danke für die Antwort. Ich hatte vergessen bei dmOnNode -> Accept := true zu setzen.
Damit kann ich die Zeile zumindest auf die oberste Stelle verschieben.

Das Problem das die darunterliegende Zeile markiert wird bleibt aber bestehen.
Das passiert an allen Spalten die einen Text enthalten (egal obe Zeichen oder Zahl).
Nur bei der Spalte mit der Grafik passiert das nicht.

Delphi-Quellcode:
procedure TfrmMain.vstDragOver(Sender: TBaseVirtualTree; Source: TObject;
  Shift: TShiftState; State: TDragState; Pt: TPoint; Mode: TDropMode;
  var Effect: Integer; var Accept: Boolean);
begin
  case Mode of
    dmAbove, dmBelow, dmOnNode: Accept := true;      // **** hier hat dmOnNode gefehlt
  else
    Accept := false;
  end;
end;

procedure TfrmMain.vstDragDrop(Sender: TBaseVirtualTree; Source: TObject;
  DataObject: IDataObject; Formats: TFormatArray; Shift: TShiftState;
  Pt: TPoint; var Effect: Integer; Mode: TDropMode);
var
  Node: PVirtualNode;
  AttachMode: TVTNodeAttachMode;
begin
(* Eigenschaften setzen für drag and drop:
   DragMode = dmAutomatic
   DragType = dtOLE
   ClipboardFormat - Virtual Tree Data auf True *)
  Node := Sender.DropTargetNode;
  case Mode of
    dmAbove: AttachMode := amInsertBefore;
    dmBelow: AttachMode := amInsertAfter;
    dmOnNode: AttachMode := amInsertBefore;
  else
    exit;
  end;
  Sender.ProcessDrop(DataObject, Node, Effect, AttachMode);
end;
Gruss Alois ;)


Alle Zeitangaben in WEZ +1. Es ist jetzt 20:21 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