![]() |
Re: VST: Drag/Drop funktioniert nicht ganz
hmm okay dann werde ich wahrscheinlich auf "DragOperations" = [doCopy] umsteigen und danndie änderungen an einem Node "von Hand" den anderen Nodes mitteilen...
Ich denke das gibt nicht allzu viel Arbeit, und eigentlich dürfte ich dann bei onFreeNode wirklich ALLE Nodes freigeben oder?! Sind ja dann alle Nodes sozusagen eigenständig... Werde mich gleich dransetzen und ausprobieren! Jetzt habe ich aber schon wieder ein Problem :D Ich will per Button-Klick ALLE Nodes in einem VST per Zufall anordnen, also wild durcheinander mischen. Sollte ja irgendwie mit Random() möglich sein, aber ich kriegs einfach nicht hin! Also so hab ich mal begonnen:
Delphi-Quellcode:
Jedoch geht das schonmal theoretishc nicht, da sich "Node" ja dann selber verschieben würde, und bei GetNext(node) ein Node an einem ganz anderen ort aufgerufen wird, sprich: die schlaufe bearbeitet nicht ein Node nach dem anderen ab!
procedure TForm1.ShufflePlaylist;
var node: pVirtualNode; i: integer; begin node := VST2.GetFirst; while assigned(node) do begin randomize; vst2.MoveTo(node, was jetzt???); node := VST2.GetNext(node); end; end; Ausserdem will ich ja Nodes verschieben, doch bei MoveTo() brauch ich ja das "TargetNode" welches ich nicht habe. Und ein VST.GetNodeAtIndex(25) gibts ja leider nicht. Habt Ihr mir da vielleicht irgendwelche Lösungsansätzt :?: |
Re: VST: Drag/Drop funktioniert nicht ganz
Hab ein ähnliches Problem. Verwende die OLE-Demo als Vorlage und arbeite mit Objects und nicht mit Records.
Verschieben per DragDrop funktioniert bestens, beim kopieren sind die Daten weg.
Delphi-Quellcode:
Auch bei Rocords mit Objects besteht dieses Problem.
PNodeDataBasic = ^TNodeDataBasic;
TNodeDataBasic = class Caption : string; end; NodeDataGroup = ^TNodeDataGroup; TNodeDataGroup = class(TNodeDataBasic) Filename : string; end; NodeDataFile = ^TNodeDataFile; TNodeDataFile = class(TNodeDataGroup) Status : integer; List : TStringList; end; NodeDataTest = ^TNodeDataTest; TNodeDataTest = class(TNodeDataBasic) Nr : integer; Count : integer; List : TStringList; end;
Delphi-Quellcode:
Wie werden die einzelen Knoten mit den Daten kopiert? Muss ich da LoadNode und SaveNode oder sonst noch was füttern.
PNodeData = ^TNodeData;
TNodeData = record Caption: String; List: TStringList; Daten:string; end; Erich |
Re: VST: Drag/Drop funktioniert nicht ganz
Die Daten sind weg (oder es kann zu Problemen kommen) wenn du in deinen Records Dinge ablegst, welche Zeiger nutzen.
z.B. lange Strings, Objekte, Zeigertypen etc. |
Re: VST: Drag/Drop funktioniert nicht ganz
Zitat:
Das Kopieren bei Drag and Drop funktioniert jetzt. Die Daten musste ich allerdings streamen.
Delphi-Quellcode:
Das kann es doch nicht sein! Es gibt bestimmt einen eleganten Weg.
// Stream ----------------------------------------------------------------------
procedure TMainForm.vstLoadNode(Sender: TBaseVirtualTree; Node: PVirtualNode; Stream: TStream); var Data: PNodeData; Len: Integer; begin Data := Sender.GetNodeData(Node); if not assigned(Data) then exit; MemoMsg('LoadNode:'+Data^.Caption); Stream.Read(Data^.ID, SizeOf(Data^.ID) ); //ID Stream.Read(Data^.ImageIndex, SizeOf(Data^.ImageIndex) ); //ImageIndex Stream.Read(Data^.NodeType, SizeOf(Data^.NodeType) ); //NodeType Stream.Read(Data^.Status, SizeOf(Data^.Status) ); //Status Stream.Read(Data^.Nr, SizeOf(Data^.Nr) ); //Nr Stream.Read(Len, SizeOf(Len)); //Caption SetLength(Data^.Caption, Len div 2); Stream.Read(Data^.Caption[1], Len); Stream.Read(Len, SizeOf(Len)); //Data SetLength(Data^.Data, Len div 2); Stream.Read(Data^.Data[1], Len); end; procedure TMainForm.vstSaveNode(Sender: TBaseVirtualTree; Node: PVirtualNode; Stream: TStream); var Data: PNodeData; Len: Integer; begin Data := Sender.GetNodeData(Node); if not assigned(Data) then exit; MemoMsg('SaveNode:'+Data^.Caption); Stream.Write(Data^.ID, SizeOf(Data^.ID) ); //ID Stream.Write(Data^.ImageIndex, SizeOf(Data^.ImageIndex) ); //ImageIndex Stream.Write(Data^.NodeType, SizeOf(Data^.NodeType) ); //NodeType Stream.Write(Data^.Status, SizeOf(Data^.Status) ); //Status Stream.Write(Data^.Nr, SizeOf(Data^.Nr) ); //Nr Len := Length(Data^.Caption) * 2; //Caption Stream.Write(Len, SizeOf(Len) ); Stream.Write(Data^.Caption[1], Len); Len := Length(Data^.Data) * 2; //Data Stream.Write(Len, SizeOf(Len) ); Stream.Write(Data^.Data[1], Len); end; Bei "OnDragDrop" gibt es doch "DataObject: IDataObject". Mit diesem müsste sich doch was machen lassen. Ich hab keine Ahnung wie das geht. Erich |
Alle Zeitangaben in WEZ +1. Es ist jetzt 04:44 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