AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Drag&Drop mit VirtualTreeView

Offene Frage von "Alois"
Ein Thema von Alois · begonnen am 2. Jun 2009 · letzter Beitrag vom 5. Jun 2009
Antwort Antwort
Alois

Registriert seit: 23. Jul 2005
71 Beiträge
 
Delphi 10 Seattle Professional
 
#1

Drag&Drop mit VirtualTreeView

  Alt 2. Jun 2009, 23:30
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
Miniaturansicht angehängter Grafiken
vstbild3_207.png   vstbild2_117.png   vstbild1_116.png  
  Mit Zitat antworten Zitat
generic

Registriert seit: 24. Mär 2004
Ort: bei Hannover
2.415 Beiträge
 
Delphi XE5 Professional
 
#2

Re: Drag&Drop mit VirtualTreeView

  Alt 5. Jun 2009, 13:39
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.
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?
Coding BOTT - Video Tutorials rund um das Programmieren - https://www.youtube.com/@codingbott
  Mit Zitat antworten Zitat
Alois

Registriert seit: 23. Jul 2005
71 Beiträge
 
Delphi 10 Seattle Professional
 
#3

Re: Drag&Drop mit VirtualTreeView

  Alt 5. Jun 2009, 20:40
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
  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 21:20 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