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 VST bei OnDragOver auf das Datenobject greifen wegen Accept (https://www.delphipraxis.net/108250-vst-bei-ondragover-auf-das-datenobject-greifen-wegen-accept.html)

Kostas 9. Feb 2008 23:39


VST bei OnDragOver auf das Datenobject greifen wegen Accept
 
Hallo Zusammen,

ich habe einen Baum:
Parent1
Child1.1
Child1.2
Child1.3
Child1.4
Parent2
Child2.1
Child2.2
Child2.3
Child2.4


Jedes Node habe ich DATA Objekt hinterlegt:
Delphi-Quellcode:
type
  PTreeData = ^TTreeData;
  TTreeData = record
                FCaption: String;
                FParentID:Integer;
                FChildID:Integer;
              end;

Die Childs dürfen sich nur innerhalb demselben Parent bewegen.
Child2.* darf also nicht bei Parent1 abgelegt werden.
Das eigentliche Drag&Drop soll lediglich angezeigt werden jedoch im VST nicht ausgeführt werden.
Ich benötige also NUR den Zugriff auf das Data Object beim ziehen und ablegen, um die neue Position
in die Datenbank zu schreiben. Danach wird der komplette Bau neu aufgebaut.

Im OnDragOver würde ich gerne das darunter liegende Data Objekt abfragen und Accept:=true setzen nur wenn
die eigene ParentID die gleiche ist mit dem darunter liegenden Node.ParentID. Leider wird bei OnDragOver
das Node nicht übergeben.

Hat jemand eine Idee wir an das Node komme?

Gruß Kostas

Hawkeye219 10. Feb 2008 00:08

Re: VST bei OnDragOver auf das Datenobject greifen wegen Acc
 
Hallo Kostas,

der gewünschte Knoten wird dir zwar nicht übergeben, du kannst ihn aber über die Koordinaten des Mauszeigers ermitteln:

Delphi-Quellcode:
procedure TForm1.VSTDragOver(Sender: TBaseVirtualTree; Source: TObject;
  Shift: TShiftState; State: TDragState; Pt: TPoint; Mode: TDropMode;
  var Effect: Integer; var Accept: Boolean);
var
  Node : PVirtualNode;
begin
  Node := Sender.GetNodeAt(Pt.X, Pt.Y);
end;
Gruß Hawkeye

Kostas 10. Feb 2008 00:40

Re: VST bei OnDragOver auf das Datenobject greifen wegen Acc
 
Zitat:

Zitat von Hawkeye219
Hallo Kostas,

der gewünschte Knoten wird dir zwar nicht übergeben, du kannst ihn aber über die Koordinaten des Mauszeigers ermitteln:

Delphi-Quellcode:
procedure TForm1.VSTDragOver(Sender: TBaseVirtualTree; Source: TObject;
  Shift: TShiftState; State: TDragState; Pt: TPoint; Mode: TDropMode;
  var Effect: Integer; var Accept: Boolean);
var
  Node : PVirtualNode;
begin
  Node := Sender.GetNodeAt(Pt.X, Pt.Y);
end;
Gruß Hawkeye

Perfekt genau das hat mir gefehlt.

Denkeschön Hawkeye
Gruß Kostas

Kostas 10. Feb 2008 01:03

Re: VST bei OnDragOver auf das Datenobject greifen wegen Acc
 
Hallo Hawkeye,

würdest Du bitte noch ein Blick auf meine DragDrop Methode werfen,
der Node sollte eigentlich verschoben werden. Doch er verschwindet
einfach nach dem Drop.
Eigentlich brauche ich es nicht weil ich den Bau neu aufbauen lasse,
aber so müsste sich doch der Node verschieben lassen oder?

Delphi-Quellcode:
procedure TfrLigen.VSTDragDrop(Sender: TBaseVirtualTree; Source: TObject;
  DataObject: IDataObject; Formats: TFormatArray; Shift: TShiftState;
  Pt: TPoint; var Effect: Integer; Mode: TDropMode);

var
  SourceNode, TargetNode: PVirtualNode;
  DropMode: TVTNodeAttachMode;

begin
  inherited;
  SourceNode := VST.FocusedNode;
  TargetNode := Sender.DropTargetNode;

  case Mode of
    dmAbove: DropMode := amInsertBefore;
    dmOnNode: DropMode := amInsertAfter;
    dmBelow: DropMode := amInsertAfter;
  end;

  VST.MoveTo(SourceNode, TargetNode, DropMode, true);

end;
Gruß Kostas

Hawkeye219 10. Feb 2008 08:53

Re: VST bei OnDragOver auf das Datenobject greifen wegen Acc
 
Hallo Kostas,

hast du das Flag "TreeOptions.AutoOptions.toAutoDeleteMovedNode s" auf den Wert False gesetzt?

Gruß Hawkeye

Kostas 10. Feb 2008 13:48

Re: VST bei OnDragOver auf das Datenobject greifen wegen Acc
 
Zitat:

Zitat von Hawkeye219
Hallo Kostas,

hast du das Flag "TreeOptions.AutoOptions.toAutoDeleteMovedNode s" auf den Wert False gesetzt?

Gruß Hawkeye

Volltreffer der Kandidat hat 100 Punkte. :-)
Durchs herumprobieren habe ich es vermutlich verstellt.
Das Node wird jetzt nicht gelöscht, aber auch nicht verschoben.

Ich möchte eigentlich nur die Reihenfolge innerhalb des gleichen
Parent verändern.

//So geht es nicht
VST.MoveTo(SourceNode, TargetNode.Parent, DropMode, true);
//und aso auch nicht
VST.MoveTo(SourceNode, TargetNode, DropMode, true);


MoveTo verschiebt doch den Node oder habe ich da etwas missverstanden?

Gruß Kostas

[EDIT] HALT es geht doch.
VST.MoveTo(SourceNode, TargetNode, DropMode, false); <<< so gehts


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