Hallo Delphi Community, teamrocket hier.
Ich bastle gerade ein Programm das eine Remote Desktop Manager werden soll, da ich mit dem auf dem Markt vorhanden Zeug irgendwie nicht zufrieden bin.
Als Übersicht versuche ich ein "VirtualStringTree" zu verwenden.
Das füttern mit Informationen der jeweiligen "Parent-Node" bzw. "Child-Node" funktioniert glaube ich schon ganz gut.
Auch das verwenden der "Meta-Daten" des jweiligen Node funktioniert erstmal. Glaube ich...
Das was ich derzeit nicht auf die Reihe bekomme ist, den gesamten "VirtualStringTree" samt "Meta-Daten" in einem "Stream" zu sichern.
Also, das speichern scheint zwar zu erfolgen und das Laden des Stream auch, jedoch erhalte ich nach dem Laden der "Stream-Datei" eine Fehlermeldung.
Zugrifsverletzung bei Adresse "Blakeks" in Modul "Project1.exe"...
In der officellen Dokumentation finde ich folgende Zeile, mit der ich nichts anfangen kann.
Delphi-Quelltext
1: 2: 3:
| begin Stream.Write(Art, SizeOf(Art)); |
Ich habe mich an folgenden Beitrag aus dem "Stackoverflow" Forum gehalten
HTML-Dokument
1:
| https://stackoverflow.com/questions/45606992/how-to-save-load-to-from-file-in-virtualtree-component-using-delphi |
Kennt sich jemand von euch mit dem speichern des "VirtualStringTree" aus?
Mein bisheriger Quellcode:
VirtualStringView Typ-Deklaration
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14:
| type PMyRec = ^TMyRec; TMyRec = record Caption: WideString; ServerAdress: String; Username: String; Domain: String; ClearPW: WideString; wallpaper: Integer; reconnection: Integer; clipboard: Integer; printers: Integer; PointerNodeData:Pointer; end; |
im FreeNode-Ereigniss
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11:
| procedure TForm1.VirtualStringTree1FreeNode(Sender: TBaseVirtualTree; Node: PVirtualNode); var Data: PMyRec; begin Data := Sender.GetNodeData(Node); Finalize(Data^); end; |
im GetNodeDatraSize-Ereigniss
Delphi-Quelltext
1: 2: 3: 4: 5:
| procedure TForm1.VirtualStringTree1GetNodeDataSize(Sender: TBaseVirtualTree; var NodeDataSize: Integer); begin NodeDataSize := SizeOf(TMyRec);end; |
Das OnGetText-Ereigniss
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11:
| procedure TForm1.VirtualStringTree1GetText(Sender: TBaseVirtualTree; Node: PVirtualNode; Column: TColumnIndex; TextType: TVSTTextType; var CellText: string); var Data: PMyRec; begin Data := Sender.GetNodeData(Node); if Assigned(Data) then CellText := Data.Caption; end; |
Das OnInitNode-Ereigniss
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14:
| procedure TForm1.VirtualStringTree1InitNode(Sender: TBaseVirtualTree; ParentNode, Node: PVirtualNode; var InitialStates: TVirtualNodeInitStates); var Data: PMyRec; begin with Sender do begin Data := GetNodeData(Node); Data.Caption := Format(DisplayName, [GetNodeLevel(Node), Node.Index]); end; end; |
Für das OnLoadNode-Ereigniss
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31:
| procedure TForm1.VirtualStringTree1LoadNode(Sender: TBaseVirtualTree; Node: PVirtualNode; Stream: TStream); var Data: PMyRec; Len: Integer; begin Data := Form1.VirtualStringTree1.GetNodeData(Node);
Stream.read(Len, SizeOf(Len)); SetLength(Data^.Caption, Len); Stream.read(PChar(Data^.Caption)^, Len*SizeOf(Char));
Stream.read(Len, SizeOf(Len)); SetLength(Data^.ServerAdress, Len); Stream.read(PChar(Data^.ServerAdress)^, Len*SizeOf(Char));
Stream.read(Len, SizeOf(Len)); Stream.read(Data.wallpaper, SizeOf(Data.wallpaper));
Stream.read(Len, SizeOf(Len)); Stream.read(Data.reconnection, SizeOf(Data.reconnection));
Stream.read(Len, SizeOf(Len)); Stream.read(Data.clipboard, SizeOf(Data.clipboard));
Stream.read(Len, SizeOf(Len)); Stream.read(Data.printers, SizeOf(Data.printers));
Stream.read(Len, SizeOf(Len)); Stream.Read(Data.PointerNodeData, SizeOf(Data.PointerNodeData)); end; |
Und zu guter Letzt das OnSaveNode-Ereigniss
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38:
| procedure TForm1.VirtualStringTree1SaveNode(Sender: TBaseVirtualTree; Node: PVirtualNode; Stream: TStream); var Data: PMyRec; Len: Integer; begin Data := Form1.VirtualStringTree1.GetNodeData(Node);
Len := Length(Data^.Caption); Stream.write(Len, SizeOf(Len)); Stream.write(PChar(Data^.Caption)^, Len*SizeOf(Char));
Len := Length(Data^.ServerAdress); Stream.write(Len, SizeOf(Len)); Stream.write(PChar(Data^.ServerAdress)^, Len*SizeOf(Char));
Len := Length(Data^.Username); Stream.write(Len, SizeOf(Len)); Stream.write(PChar(Data^.Username)^, Len*SizeOf(Char));
Len := Length(Data^.Domain); Stream.write(Len, SizeOf(Len)); Stream.write(PChar(Data^.Domain)^, Len*SizeOf(Char));
Len := Length(Data.ClearPW); Stream.write(Len, SizeOf(Len)); Stream.write(PChar(Data^.ClearPW)^, Len*SizeOf(Char));
Stream.write(Data^.wallpaper, SizeOf(Data^.wallpaper));
Stream.write(Data^.reconnection, SizeOf(Data^.reconnection));
Stream.write(Data^.clipboard, SizeOf(Data^.clipboard));
Stream.write(Data^.printers, SizeOf(Data^.printers));
Stream.Write(Data^.PointerNodeData, SizeOf(Data^.PointerNodeData)) end; |
Speicher-Button
Delphi-Quelltext
1: 2: 3: 4: 5: 6:
| procedure TForm1.Button4Click(Sender: TObject); var NodeSafe: TFileStream; begin Form1.VirtualStringTree1.SaveToFile(ExtractFilePath(ParamStr(0))+ 'Connections.at1'); end; |
Laden Knopf
Delphi-Quelltext
1: 2: 3: 4:
| procedure TForm1.Button5Click(Sender: TObject); begin Form1.VirtualStringTree1.LoadFromFile(ExtractFilePath(ParamStr(0))+ 'Connections.at1'); end; |
Ich habe sicherlich nur eine Kleinigkeit übersehen oder alles komplett falsch gemacht.
Bitte schaut euch das einmal an. Vielleicht kann mir jemand sagen wo der Fehler liegt.
Ich danke für eure Zeit,
teamrocket0