![]() |
AW: TVirtualStringTree: nachträglich Objekt am Knoten tauschen
Liste der Anhänge anzeigen (Anzahl: 1)
OK, verstehe. Hatte das ohne Ableitung versucht, weil ich dachte, das kommt aufs Gleiche raus.
Jetzt kompiliert das Ganze, aber getauscht werden die Knoten dennoch nicht.
Delphi-Quellcode:
Ich habe mal ein neues Projekt aufgesetzt, das nur zum Testen von diesem Problem gedacht ist (VST + Button).
procedure TForm1.VSTDragDrop(Sender: TBaseVirtualTree; Source: TObject;
DataObject: IDataObject; Formats: TFormatArray; Shift: TShiftState; Pt: TPoint; var Effect: Integer; Mode: TDropMode); var AttachMode : TVTNodeAttachMode; lNewData : PTreeData; lNode : PVirtualNode; begin case Mode of dmAbove: AttachMode := amInsertBefore; dmBelow: AttachMode := amInsertAfter; dmOnNode: begin lNode:= VST.FocusedNode; lNewData := VST.GetNodeData(Sender.DropTargetNode); TVirtualStringTreeEx(VST).ReplaceNodeData(lNode, lNewData); //AttachMode := amInsertAfter; end; else exit; end; //ohne diese Zeile verschwindet der gezogene Knoten einfach - evtl. liegt hier der Fehler Sender.ProcessDrop(DataObject, lNode, Effect, AttachMode); end; Es befindet sich im Anhang. Vielleicht hilft das ja zum Nachvollziehen des Fehlers und erspart das Aufsetzen eines neuen Projektes. Vielen Dank für die Hilfe! |
AW: TVirtualStringTree: nachträglich Objekt am Knoten tauschen
Normalerweise überlässt man dem Tree das Speichermanagement. Wenn du allerdings Objekte daran hängen willst, solltest du sowas machen:
Delphi-Quellcode:
Dann setzt du die MyTree.NodeDataSize := SizeOf(TNodeData) und schon kannst du mit GetNodeData lustig Objekte austauschen.
type
TNodeData = record Data: TObject end; PNodeData = ^TNodeData; Schreib dir dazu am besten ne Methode, z.B.:
Delphi-Quellcode:
Code ist ohne Delphi bzw VST geschrieben, also nicht 100% compile Garantie :D
function GetObjectOfNode(Node: PVirtualNode; Tree: TBaseVirtualTree): TObject
var LNodeData: PNodeData; begin LNodeData := Tree.GetNodeData(LNodeData); if Assigned(LNodeData) then Result := LNodeData.Data else Result := nil; end; procedure SetObjectOfNode(Node: PVirtualNode; Tree: TBaseVirtualTree; Obj: TObject); var LNodeData: PNodeData; begin LNodeData := Tree.GetNodeData(LNodeData); if Assigned(LNodeData) then LNodeData.Data := Obj; end; |
AW: TVirtualStringTree: nachträglich Objekt am Knoten tauschen
@Stevie
Danke für den Alternativvorschlag. Bekomme es damit aber leider auch nicht hin... Ich nehme mal an, das müsste "LNodeData := Tree.GetNodeData(Node);" in beiden Funktionen heißen. Dann hab ich das so versucht:
Delphi-Quellcode:
Das sollte dann ja die ersten beiden Knoten des Baums vertauschen, oder? Passiert aber nichts. Oder muss man die Anzeige noch irgendwie aktualisieren?
procedure TForm1.Button1Click(Sender: TObject);
var obj1, obj2 : TObject; begin obj1 := GetObjectOfNode(VST.GetFirst, VST); obj2 := GetObjectOfNode(VST.GetFirst.NextSibling, VST); SetObjectOfNode(VST.GetFirst.NextSibling, VST, obj1); SetObjectOfNode(VST.GetFirst, VST, obj2); end; |
Alle Zeitangaben in WEZ +1. Es ist jetzt 05: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-2025 by Thomas Breitkreuz