AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein GUI-Design mit VCL / FireMonkey / Common Controls Delphi TVirtualStringTree: nachträglich Objekt am Knoten tauschen
Thema durchsuchen
Ansicht
Themen-Optionen

TVirtualStringTree: nachträglich Objekt am Knoten tauschen

Ein Thema von Brainshock · begonnen am 16. Apr 2010 · letzter Beitrag vom 25. Sep 2010
Antwort Antwort
Seite 2 von 2     12   
Keks

Registriert seit: 25. Mai 2005
122 Beiträge
 
#11

AW: TVirtualStringTree: nachträglich Objekt am Knoten tauschen

  Alt 25. Sep 2010, 19:41
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!
Angehängte Dateien
Dateityp: zip VST-Test.zip (4,3 KB, 2x aufgerufen)
  Mit Zitat antworten Zitat
Benutzerbild von Stevie
Stevie

Registriert seit: 12. Aug 2003
Ort: Soest
4.017 Beiträge
 
Delphi 10.1 Berlin Enterprise
 
#12

AW: TVirtualStringTree: nachträglich Objekt am Knoten tauschen

  Alt 25. Sep 2010, 22:10
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
Stefan
“Simplicity, carried to the extreme, becomes elegance.” Jon Franklin

Delphi Sorcery - DSharp - Spring4D - TestInsight
  Mit Zitat antworten Zitat
Keks

Registriert seit: 25. Mai 2005
122 Beiträge
 
#13

AW: TVirtualStringTree: nachträglich Objekt am Knoten tauschen

  Alt 25. Sep 2010, 22:48
@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?
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 2 von 2     12   


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 16:29 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