Delphi-PRAXiS
Seite 2 von 2     12   

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 TVirtualStringTree: nachträglich Objekt am Knoten tauschen (https://www.delphipraxis.net/150426-tvirtualstringtree-nachtraeglich-objekt-am-knoten-tauschen.html)

Keks 25. Sep 2010 18:41

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:
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;
Ich habe mal ein neues Projekt aufgesetzt, das nur zum Testen von diesem Problem gedacht ist (VST + Button).
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!

Stevie 25. Sep 2010 21:10

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:
type
  TNodeData = record
    Data: TObject
  end;
  PNodeData = ^TNodeData;
Dann setzt du die MyTree.NodeDataSize := SizeOf(TNodeData) und schon kannst du mit GetNodeData lustig Objekte austauschen.
Schreib dir dazu am besten ne Methode, z.B.:
Delphi-Quellcode:
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;
Code ist ohne Delphi bzw VST geschrieben, also nicht 100% compile Garantie :D

Keks 25. Sep 2010 21:48

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:
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;
Das sollte dann ja die ersten beiden Knoten des Baums vertauschen, oder? Passiert aber nichts. Oder muss man die Anzeige noch irgendwie aktualisieren?


Alle Zeitangaben in WEZ +1. Es ist jetzt 05:04 Uhr.
Seite 2 von 2     12   

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