Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Verschieden Datentypen in Stream speichern/laden (https://www.delphipraxis.net/48394-verschieden-datentypen-stream-speichern-laden.html)

dahead 24. Jun 2005 14:44


Verschieden Datentypen in Stream speichern/laden
 
Hallo,

ich habe gerade folgendes Problem: ich möchte verschieden Werte aus u. g. Record in einen Stream speichern und dann wieder daraus laden.

Code:
type
  TALNode = record
   ID: Integer;
   Active: Boolean;
   AlarmName: String;
   ImageIndex: Integer;
   AlarmDate,
   AlarmTime: TDateTime;
  end;
Das speichern der Integer, Boolean und String Werte ist kein Problem. Die TDateTime Werte hab ich beim speichern probehalber in Strings umgewandelt (DateToStr, TimeToStr). Ist meiner Meinung nach leider nicht sehr elegant.

Das eigentliche Problem taucht nun beim Laden des Streams auf. Wie rück-konvertiere ich die TDateTime Werte?

Gespeichert wird so:

Code:
Len := Length(DateToStr(NodeArray[I].AlarmDate));
Stream.Write(Len, SizeOf(Len));
Stream.Write(PChar(DateToStr(NodeArray[I].AlarmDate))^, Len);
Geladen so (geht natürlich nicht):

Code:
Stream.Read(Len, SizeOf(Len));
SetLength(NodeArray[I].AlarmDate, Len);
Stream.Read(PChar(DateToStr(NodeArray[I].AlarmDate))^, Len);
Gibt es da eine bessere Möglichkeit? (Achja, ich möchte keine dpCollection usw. verwenden sondern Streams.)

Vielen Dank im Voraus!

Flocke 24. Jun 2005 14:50

Re: Verschieden Datentypen in Stream speichern/laden
 
Also DateToStr ist nicht zu empfehlen, da es das im System eingestellte kurze Datumsformat benutzt und somit von Rechner zu Rechner verschieden sein kann.

Möglichkeit 1: TDateTime is einfach ein double, speichere es binär (8 Byte).

Möglichkeit 2: Speichere (Jahr, Monat, Tag) (ggf. Stunde, Minute, Sekunde) so wie du die Integer-Felder abspeicherst.

[Nachtrag]

Die separaten Felder AlarmDate und AlarmTime kannst du dir aber wohl sparen, ein TDateTime kann gleichzeitig Uhrzeit UND Datum beinhalten.

dahead 24. Jun 2005 15:01

Re: Verschieden Datentypen in Stream speichern/laden
 
Erstmal vielen Dank für die schnelle Antwort Flocke!

Zu deiner ersten Möglichkeit: Ich hab gesehen, dass TDateTime ein Double ist, weiß aber nicht wie ich es binär speichern kann. könntest du mir da eventuell auf dir sprünge helfen (u. a. deshalb da ich das datum und die zeit nicht aufsplitten möchte, sprich die zweite möglichkeit leider entfällt (voerst zumindest)).

Bezüglich deines nachtrags: ja, das weiß ich. da ich allerdings zwei TDateTimePicker Controls (eines vom Typ Date, eines vom Typ Time) habe, speichere ich datum und zeit lieber separat (das Control kann zwar beide werte intern speichern, zeigt aber entweder datum oder halt uhrzeit an. bin da allerdings noch am optimieren).

franktron 24. Jun 2005 15:01

Re: Verschieden Datentypen in Stream speichern/laden
 
Muss das nicht so lauten

Delphi-Quellcode:
Stream.Write(NodeArray[I].AlarmDate, SizeOf(TDateTime));
Also so geht das bei mir

dahead 24. Jun 2005 15:06

Re: Verschieden Datentypen in Stream speichern/laden
 
@franktron:

ich habe das gerade mal ausprobiert, und es funktioniert.
wunderbar: einfach und logisch. denke somit ist das problem beseitigt.

vielen dank franktron und flocke!


Alle Zeitangaben in WEZ +1. Es ist jetzt 00:13 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