![]() |
Speichern eigener klasse
Moinsen zusammen,
ist es möglich eine selbstgeschriebene Klasse, welche Arrays beinhaltet verschlüsselt abzuspeichern? Ich hatte mich schon versucht mit dem Verrsuch aus einem anderen Forum
Delphi-Quellcode:
jedoch hat dies leider nicht bei einer Klasse funktioniert, welche Arrays von Unterklassen, sowie Bilder...
Var Datei: File of Integer;
Wert: Integer; {speichern} AssignFile(Datei, 'Datei.Name'); Rewrite(Datei); Write(Datei, Wert); CloseFile(Datei); {lesen} AssignFile(Datei, 'Datei.Name'); Reset(Datei); Read(Datei, Wert); CloseFile(Datei); |
AW: Speichern eigener klasse
Warum sollte man das verschlüsselte Speichern einer Datei nicht in eine Klasse packen können? Wie sieht denn dein nicht funktionierender Versuch aus und was funktioniert nicht (Fehlermeldung)?
|
AW: Speichern eigener klasse
Abspeichern klappt aber sobald ich die Datei öffne meldet sich die Fehlermeldung:
Zugriffsverletzung bei Adresse.... Gibt es den alternative Wege? |
AW: Speichern eigener klasse
Wie wäre es, wenn du uns mal deine Code zeigst? So können wir nur munter rumraten.
|
AW: Speichern eigener klasse
Hier mal ein Ansatz:
Step 1: Klasse von TPersistent ableiten um das Streaming-System zu nutzen ![]() Step 2: TStreamklasse nutzen, die die Daten verschlüsselt speichert (einfach mal hier im Forum suchen, gibt einige Threads dazu :) ) Hoffe mal das bringt dich einen Schritt weiter. :) |
AW: Speichern eigener klasse
Na gut hier der Quellcode
Meine Klasse ist wie folgt aufgebaut. Gilt für ein Programm für Veranstaltungen. "Karte" ist eine Image...
Delphi-Quellcode:
Vorher wurde eine Klasse schon erstellt...
type
Tort=class bezeichnung:String; ortX:integer; ortY:integer; end; TVeranstaltung=class public name:String; karte:String; art:String; station:array of Tort; end;
Delphi-Quellcode:
markt:=TVeranstaltung.Create;
Delphi-Quellcode:
procedure TForm1.Button2Click(Sender: TObject);
var Datei:File of TVeranstaltung; begin if SaveDialog1.Execute then begin AssignFile(Datei, SaveDialog1.FileName+'.dat'); Rewrite(Datei); Write(Datei,Markt); CloseFile(Datei); end; end; Und der Versuch zu laden:
Delphi-Quellcode:
procedure Form1.Button1Click(Sender: TObject);
var Datei: File of TVeranstaltung; temp:TVeranstaltung; begin if OpenDialog1.Execute then begin temp:=TVeranstaltung.Create; AssignFile(Datei,OpenDialog1.FileName); Reset(Datei); Read(Datei, temp; end; |
AW: Speichern eigener klasse
Überleg mal, was du da versuchst. Du versuchst die Datei in ein Objekt zu laden. Das kann ja irgendwie nicht gehen.
|
AW: Speichern eigener klasse
Die individuellen Eigenschaftswerte Deiner Objekte liegen irgendwo im Speicher. Es gibt also keinen zusammenhängenden Speicherblock pro Objekt.
Du musst Deine Objekte daher "serialisieren". MyObject.SaveTo(File) bzw. "deserialisieren" MyObject.LoadFrom(File), wobei in beiden Methoden erst der Name, dann die Karte usw. gespeichert bzw. geladen wird. Für die genaue Umsetzung kann man verschiedene Wege gehen. Die wichtigste Überlegung für eine Grundrichtung ist, ob man alle Daten in Textform (lesbar) oder ob man sie binär (evtl. verschlüsselt) speichern will. |
AW: Speichern eigener klasse
Die wichtigste Überlegung mMn wäre, ob man das Schreiben/Lesen (z.B. mit deinen archaischen Write/Read-Methoden) aller Felder selbst von Hand übernimmt, oder einen Automatismus nimmt. Delphi hat bspw. einen fertigen Automatismus für das Umwandeln deiner Klasse TVeranstaltung (inklusive enthaltene Orte) ins Textformat (JSON).
Damit ginge dann bspw. so etwas:
Delphi-Quellcode:
Memo1 als beispielhaften Ersatz für in Dateien schreiben, veranstaltung2 wird neu erstellt aus dem Memo-Inhalt.
uses Rest.Json;
procedure TForm10.FormCreate(Sender: TObject); var ort: TOrt; veranstaltung: TVeranstaltung; veranstaltung2: TVeranstaltung; begin ort := TOrt.Create(); ort.bezeichnung := 'Mein Ort'; ort.ortX := 42; ort.ortY := -99; veranstaltung := TVeranstaltung.Create(); veranstaltung.name := 'Veranstaltungs-Name'; veranstaltung.karte := 'Karte. Ja.'; veranstaltung.art := 'Obszön'; veranstaltung.station := [ort]; Memo1.Text := TJson.ObjectToJsonString(veranstaltung); veranstaltung2 := TJson.JsonToObject<TVeranstaltung>(Memo1.Text); end; |
AW: Speichern eigener klasse
Zitat:
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 21:45 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz