Wo kommt den der Fehler und warum willst du unbedingt das gesamte Objekt din haben?
Es ist zumindestens Platzsparender, wenn nur der Pointer in der VTV steht und man bräuchte dann das Objekt nicht zu zerlegen...
Aber versuch es mal so:
Delphi-Quellcode:
Stream.Write(TSessionObject(Data.FObject).Name[1], Len);
Stream.Read(TSessionObject(Data.FObject).Name[1], Len);
oder
Delphi-Quellcode:
Stream.Write(@TSessionObject(Data.FObject).Name[1], Len);
Stream.Read(@TSessionObject(Data.FObject).Name[1], Len);
Ich weiß nicht, ob Write/Read 'nen VAR-Parameter (ersteres), oder 'nen Pointer (zweiteres) will.
[add]
OK, Markierung gesehn ^^
Dann lag es bestimmt an der Stringübergabe (siehe Code)
[/add]
PS: @generic
Na ja, eigentlichj ist es von der interen Speicherung in der VTV her egal
wo man die Daten übergibt, aber
wie man sie übergibt/ließt ist da schon wichtig.
Delphi-Quellcode:
vst.addchild(nil, [b]Data[/b]);
[i][b]Pointer[/b][/i] := [b]Data[/b];
vst.addchild(nil, [i][b]Pointer[/b][/i]);
N := vst.addchild(nil);
AVST.SetNodeData(N, [b]Data[/b]);
[i][b]Pointer[/b][/i] := [b]Data[/b];
n := vst.addchild(nil);
AVST.SetNodeData(N, [i][b]Pointer[/b][/i]);
... // vieles, vieles mehr
Hier ist ja mehr das Problem, wie die Daten in der VTV gespeichert/verwaltet sollen.
So, nun noch der wohl einfachere Weg ... das Objekt erzeigen und nur die referenz daruf übergeben:
Delphi-Quellcode:
procedure insertSession();
var SessionObject: TSessionObject;
begin
SessionObject := TSessionObject.Create;
SessionObject.datum:=DateTimeToUnix(Form1.DateTimePicker1.Date);
SessionObject.sessiontyp:=Form1.ComboBox1.Text;
SessionObject.protokollant:=Form1.Edit1.text;
SessionObject.teilnehmer:=Form1.Edit2.Text;
SessionObject.verteiler:=Form1.Edit3.Text;
SessionObject.ndatum:=DateTimeToUnix(Form1.DateTimePicker2.Date);
Result:=Form1.VST1.AddChild(nil, SessionObject);
end;
Diese kann auch ins OnCreate der Form (falls man es nicht auch direkt im
OI ändern kann/will) ... einmal reicht ja, die Größe ändert sich ja nicht (PS: SizeOf(TTreeData) = Pointer = 4 Byte, also
4)
VST1.NodeDataSize:=SizeOf(TTreeData);
Delphi-Quellcode:
procedure deleteSession(Node: PVirtualNode);
var SessionObject: TSessionObject;
begin
TSessionObject(Form1.VST1.GetNodeData(Node)).Free;
Form1.VST1.Delete; // keine Ahnung ob das wirklich so heißt
end;
Folgendes kann auch ins OnCreate der Form (falls man es nicht direkt im
OI ändern kann/will) ... einmal reicht ja, die Größe ändert sich schließlich nicht (PS: SizeOf(TTreeData) = Pointer = 4 Byte, also
4)
VST1.NodeDataSize:=SizeOf(TTreeData);