Einzelnen Beitrag anzeigen

Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
43.199 Beiträge
 
Delphi 12 Athens
 
#20

Re: VirtualTreeView: Es klappt nicht ganz

  Alt 31. Mai 2006, 15:16
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);
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat