![]() |
VirtualTreeView + Drag&Drop ohne das Knoten angehängt we
Hi @ll,
es geht mal wieder um das leidige Thema Drag&Drop im VST. Ich habe mir dazu eine ganze Menge Beiträge im Forum durchgelesen, sonst wäre ich wahrscheinlich nicht soweit gekommen, also folgendes erst mal erkläre ich was ich möchte. Ich habe 2 VirtualStringTrees der linke enthält eine Baumstruktur und der rechte Baum eine Tabellarische Ansicht wie eine ListView. Ich möchte jetzt dem linken Baum Einträge aus dem rechten Baum zuweisen, per Drag&Drop. Aber die Einträge sollen nicht an die Knoten gehangen werden, ich speichere lediglich 2 Werte aus den jeweiligen Knoten, also aus dem Quellknoten eine ID und aus dem Zielknoten eine ID, die beiden Werte speichere ich dann in einer Tabelle einer Datenbank. Mehr soll garnicht passieren. Ich habe das soweit auch implementiert, das Problem ist nur das wenn ich aus der rechten Seite einen Knoten dem linken Baum zuweise, wird das Wertepaar ca. 63 mal in meine Tabelle gespeichert, was natürlich Mist ist. Ich will das Wertepaar nur einmal speichern. Entweder bin ich auf dem Holzweg oder ich speichere die Werte im falschen Ereignis in die DB, was ich mal vermute. Da wahrscheinlich das DragOver während des ziehens ausgeführt wird, ich dachte vielleicht könnte ich das DragEnd nehmen, aber da habe ich zu wenig Parameter um an beide Knoten zu kommen oder?
Delphi-Quellcode:
Hierzu noch der Quellcode:
procedure TForm1.VSTlinkerBaumEndDrag(Sender, Target: TObject; X, Y: Integer);
Delphi-Quellcode:
An den Eigenschaften der Bäume hab ich nicht viel verändert, bei beiden procedure TForm1.VSTlinkerBaumDragOver(Sender: TBaseVirtualTree; Source: TObject; Shift: TShiftState; State: TDragState; Pt: TPoint; Mode: TDropMode; var Effect: Integer; var Accept: Boolean); var zielKnoten : PVirtualNode; quellKnoten : PVirtualNode; zielDaten : PTreeData; quellDaten : PTreeData; quellID : String; zielID : String; begin if source = VSTRechterBaum then begin if Assigned(VSTRechterBaum.FocusedNode) then begin accept := true; zielKnoten := VSTLinkerBaum.GetNodeAt(PT.X,PT.Y); zielDaten := VSTLinkerBaum.GetNodeData(zielKnoten); zielID := TTreeDataClass(zielDaten.FObject).ID; quellKnoten := VSTRechterBaum.FocusedNode; quellDaten := VSTRechterBaum.GetNodeData(quellKnoten); quellID := TTreeDataClass(quellDaten.FObject).ID; if((zielID <> '') and (quellID <> ''))then begin //fuelle das Wertepaar in die Datenbank end; end; end; end; procedure TForm1.VSTRechterBaumDragAllowed(Sender: TBaseVirtualTree; Node: PVirtualNode; Column: TColumnIndex; var Allowed: Boolean); begin Allowed := true; end; DragMode = dm Manual DragType = dtOle Bei den ClipboardFormats hab ich nix angekreuzt. Thx for help greetz Lun |
Re: VirtualTreeView + Drag&Drop ohne das Knoten angehäng
Nur mal so in's Blaue geschossen (Hab' g'rad' kein Delphi zur Hand):
Delphi-Quellcode:
Wenn Sender den Quell-VST und Target den Ziel-VST enthält und X,Y den Zielknoten unter der Maus bestimmt, dann kannst Du doch den / die Quellknoten durch die Selected Eigenschaft des Quell-VST ermitteln. :gruebel:
procedure TForm1.VSTlinkerBaumEndDrag(Sender, Target: TObject; X, Y: Integer);
|
Re: VirtualTreeView + Drag&Drop ohne das Knoten angehäng
Hi Karotte,
vielen Dank hast ins Schwarze getroffen ;o) Nur das EndDrag Ereignis vom rechten Baum muss genommen werden nicht vom linken danach funktioniert es *freu* greetz Lun ;o) *rumhüpf* P.S: Manchmal sieht man eben die Bäume nicht wenn man im Wald steht... hier nochmal der Quellcode falls das mal einer braucht:
Delphi-Quellcode:
procedure TForm1.VSTRechterBaumEndDrag(Sender, Target: TObject; X, Y: Integer); var zielKnoten : PVirtualNode; quellKnoten : PVirtualNode; zielDaten: PTreeData; quellDaten : PTreeData; quellID : String; zielID : String; begin if Sender = VSTRechterBaum then begin if Assigned(VSTRechterBaum.FocusedNode) then begin zielKnoten := VSTlinkerBaum.GetNodeAt(X,Y); zielDaten := VSTlinkerBaum.GetNodeData(zielKnoten); zielID := TTreeDataClass(zielDaten.FObject).ID; quellKnoten := VSTRechterBaum.FocusedNode; quellDaten := VSTRechterBaum.GetNodeData(quellKnoten); quellId := TTreeDataClass(quellDaten.FObject).ID; if((zielID <> '') and (quellID <> ''))then begin //fülle Wertepaar in Datenbank end; end; end; end; |
Re: VirtualTreeView + Drag&Drop ohne das Knoten angehäng
Zitat:
Zitat:
Zu Deinem Quelltext: Bei FocusedNode ist doch, glaub' ich, nur der zuletzt aktive "gewählt". Was ist denn wenn es mehrere sind (oder hast Du Multiselect := false) ??? |
Re: VirtualTreeView + Drag&Drop ohne das Knoten angehäng
Hi,
hab Multiselect := false in den Tree Options. Aber da fehlen natürlich noch ein paar Sachen, auch noch ein paar Prüfungen, zum Beispiel was ist wenn ich den Knoten vom rechten Baum im rechten Baum fallen lasse... Aber das kommt noch, war jetzt erstmal primär das Wertepaar in die DB zu bekommen. nochmal thx greetz Lun |
Alle Zeitangaben in WEZ +1. Es ist jetzt 21:04 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 by Thomas Breitkreuz