Einzelnen Beitrag anzeigen

Erich07

Registriert seit: 1. Mär 2007
4 Beiträge
 
#14

Re: VST: Drag/Drop funktioniert nicht ganz

  Alt 28. Nov 2009, 09:48
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
  Mit Zitat antworten Zitat