| Autor |
Beitrag |
freak4fun
      
Beiträge: 604
Erhaltene Danke: 4
Win 7 Pro
VS 2013 Express, Delphi, C#, PHP, Java
|
Verfasst: Mo 02.04.07 08:27
Hallo,
ich habe eine Klasse, die ein Objekt vom Typ TObjectList hat. In dieser Liste werden Objekte einer Klasse gehalten. Wie speicher und lade ich diese Liste am besten? Ich hab vorher noch nie mit der TObjectList gearbeitet, deshalb bin ich für jeden Tip dankbar.
MfG
freak Moderiert von Gausi: Topic aus Delphi Language (Object-Pascal) / CLX verschoben am Mo 02.04.2007 um 09:49
_________________ "Ich werde auf GAR KEINEN Fall…!" - "Keks?" - "Okay, ich tu's."
i++; // zaehler i um 1 erhoehen
|
|
Gausi
      
Beiträge: 8554
Erhaltene Danke: 481
Windows 7, Windows 10
D7 PE, Delphi XE3 Prof, Delphi 10.3 CE
|
Verfasst: Mo 02.04.07 08:49
afaik bleibt dir da nur übrig, dir ein geeignetes Dateiformat zu überlegen, und die einzelnen Informationen deiner Objekte so zu speichern, dass man sie auch wieder lesen kann. Dazu am besten TFileStream verwenden. In der Datei könnte es dann so aussehen
Quelltext 1: 2: 3: 4: 5: 6: 7:
| 4Bytes: Anzahl der Objekte // für jedes Objekt dann 4Bytes: Integer-Eigenschaft_1 1Byte : Boolean-Wert_1 4Bytes: Länge von String_1 xBytes: String_1 ... |
_________________ We are, we were and will not be.
|
|
freak4fun 
      
Beiträge: 604
Erhaltene Danke: 4
Win 7 Pro
VS 2013 Express, Delphi, C#, PHP, Java
|
Verfasst: Mo 02.04.07 08:59
Hm... auf die Streams bin ich auch gestoßen. Das heißt ich kann nicht die ganze Klasse in den Stream packen, sondern muss die einzelnen Variablen in den Stream schreiben?!  Kann man nicht die Klasse iergendwie übergeben?
MfG
freak
_________________ "Ich werde auf GAR KEINEN Fall…!" - "Keks?" - "Okay, ich tu's."
i++; // zaehler i um 1 erhoehen
|
|
Gausi
      
Beiträge: 8554
Erhaltene Danke: 481
Windows 7, Windows 10
D7 PE, Delphi XE3 Prof, Delphi 10.3 CE
|
Verfasst: Mo 02.04.07 09:21
Am geschicktesten dürfte sein, wenn du für die Klasse Methoden wie LoadFromStream und SaveToStream schreibst. D.h. die Klasse kümmert sich selbst um ihre Speicherung 
_________________ We are, we were and will not be.
|
|
Luckie
Ehemaliges Mitglied
Erhaltene Danke: 1
|
Verfasst: Mo 02.04.07 09:21
Was passiert, wenn man die Objekte in der Liste von TPersistent ableitet?
| Zitat: | TPersistent kapselt das fundamentale Verhalten, das allen Objekten gemeinsam ist, die anderen Objekten zugewiesen werden können und die Eigenschaftswerte in einen Stream schreiben bzw. daraus lesen können. Hierzu führt die Klasse TPersisent Methoden ein, die für folgende Zwecke überschrieben werden können:
- Die Prozedur definieren, mit der nicht als published deklarierte Daten in einen Stream geschrieben bzw. daraus gelesen werden können.
- Verfahren bereitstellen, mit denen Eigenschaftswerte gesetzt werden können.
- Verfahren bereitstellen, mit denen der Inhalt eines Objekts einem anderen zugewiesen werden kann.
Erzeugen Sie keine neuen Instanzen von TPersistent. Die Klasse TPersistent dient als Basisklasse für die Deklaration von Objekten, die keine Komponenten sind, aber trotzdem in einen Stream gespeichert oder ihre Eigenschaften anderen Objekten zuweisen müssen. |
|
|
freak4fun 
      
Beiträge: 604
Erhaltene Danke: 4
Win 7 Pro
VS 2013 Express, Delphi, C#, PHP, Java
|
Verfasst: Mo 02.04.07 10:27
Mit TPersitant komme ich nicht klar. Da passiert nichts, wenn ich meine Klasse von der ableite.
Hab jetzt Streams. Integer kann ich laden und speichern, aber wie mache ich das mit Strings? Speichern soll ja über:
Delphi-Quelltext 1:
| lStream.Write(PChar(MyClass[i].Value_1)^, Length(MyClass[i].Value_1)); |
gehen, aber Wie soll ich den laden?
Delphi-Quelltext 1:
| lStream.Read(PChar(MyClass[i].Value_1)^, Length(MyClass[i].Value_1)); |
Das funktioniert nicht. Da bleibt der Wert leer.
Worin liegt der Vorteil zu Ini-Dateien?!
MfG
freak
_________________ "Ich werde auf GAR KEINEN Fall…!" - "Keks?" - "Okay, ich tu's."
i++; // zaehler i um 1 erhoehen
|
|
Luckie
Ehemaliges Mitglied
Erhaltene Danke: 1
|
Verfasst: Mo 02.04.07 10:40
AnsiStrings sind nur Zeiger auf einen Speicherbereich. Wie man AnsiStrings mit einem Stream speichert wurde aber schon oft genug im Forum geklärt.
Bzw. eben mal schnell getippt:
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: 39: 40: 41:
| procedure WriteStrToStream(Stream: TStream; S: String); var len: Integer; begin len := length(S); Stream.WriteBuffer(len, sizeof(Integer)); Stream.WriteBuffer(Pointer(S)^, len); end;
function ReadStrFromStream(Stream: TStream): String; var len: Integer; begin Stream.ReadBuffer(len, sizeof(Integer)); SetLength(Result, len); Stream.ReadBuffer(Pointer(Result)^, len); end;
procedure TForm1.Button1Click(Sender: TObject); var fs: TFileStream; begin fs := TFileStream.Create(ChangeFileExt(ParamStr(0), '.txt'), fmCreate); try WriteStrToStream(fs, 'Hello, world'); finally fs.Free; end; end;
procedure TForm1.Button2Click(Sender: TObject); var fs: TFileStream; begin fs := TFileStream.Create(ChangeFileExt(ParamStr(0), '.txt'), fmOpenRead); try ShowMessage(ReadStrFromStream(fs)); finally fs.Free; end; end; |
|
|
freak4fun 
      
Beiträge: 604
Erhaltene Danke: 4
Win 7 Pro
VS 2013 Express, Delphi, C#, PHP, Java
|
Verfasst: Mo 02.04.07 11:01
Jetzt hab ichs verstanden! Hatte die Längenangabe immer überlesen, bzw. stumpf ignoriert.  Danke, Luckie!
Aber warum macht man denn sowas? Ich mein wo liegt der Vorteil gegenüber Ini-Dateien?
MfG
freak
_________________ "Ich werde auf GAR KEINEN Fall…!" - "Keks?" - "Okay, ich tu's."
i++; // zaehler i um 1 erhoehen
|
|
Gausi
      
Beiträge: 8554
Erhaltene Danke: 481
Windows 7, Windows 10
D7 PE, Delphi XE3 Prof, Delphi 10.3 CE
|
Verfasst: Mo 02.04.07 16:29
Ini-Dateien werden bei steigender Datenmenge schnell langsam. Außerdem benötigen sie mehr Platz. Um in einer Ini einen Integer-Wert zu speichern braucht man sowas:
meinInt=1234453 - das sind 15 Bytes. In einer "Binär-Datei" braucht man dafür nur 4 Bytes. Außerdem ist man flexibler - z.B. Strings mit Zeilenumbrüchen sind in Inis nicht ohne weiteres möglich. Oder Integer-Arrays, die man in einer Ini einzeln Wert für Wert speichern müsste. In anderen Formaten schreibt man einfach für jeden Wert die vier Bytes hintereinander, am Anfang noch ne Längenangabe, und gut is  .
_________________ We are, we were and will not be.
|
|
|