Zitat:
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.
Auf die Schnelle hab ich <List:TStringList> durch <List:string> ersetzt und muss nun jedesmal das entsprechende Element innerhalb des strings suchen.
Das Kopieren bei Drag and Drop funktioniert jetzt.
Die Daten musste ich allerdings streamen.
Delphi-Quellcode:
// 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;
Das kann es doch nicht sein! Es gibt bestimmt einen eleganten Weg.
Bei "OnDragDrop" gibt es doch "DataObject: IDataObject". Mit diesem müsste sich doch was machen lassen.
Ich hab keine Ahnung wie das geht.
Erich