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?
procedure TForm1.VSTlinkerBaumEndDrag(Sender, Target: TObject; X, Y: Integer);
Hierzu noch der Quellcode:
Delphi-Quellcode:
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;
An den Eigenschaften der Bäume hab ich nicht viel verändert, bei beiden
DragMode = dm Manual
DragType = dtOle
Bei den ClipboardFormats hab ich nix angekreuzt.
Thx for help
greetz Lun