AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Tutorials Delphi Strings lesen und speichern (via Stream und Co.)
Tutorial durchsuchen
Ansicht
Themen-Optionen

Strings lesen und speichern (via Stream und Co.)

Ein Tutorial von himitsu · begonnen am 18. Jun 2009
Antwort Antwort
Benutzerbild von himitsu
himitsu
Registriert seit: 11. Okt 2003
Um mal auf die Kompatibilität mit neueren/zuküftigen Delphi-Versionen auf Unicodebasis einzugehen
und um da Fehler schon jetzt auszuschließen ...

Man bedenke, daß ein String dort als WideString/UnicodeString definiert ist,

wärend in einem älterem "Ansi"-Delphi der String als AnsiString definiert wurde.
(und in Delphi 1 wohl als ShortString )


Im Grunde ist es sowieso bei jeder langlebigen externen Speicherung und bei der Datenübertragung besser, wenn man schon wärend der Definition seiner Daten, sich da direkt auf die fundamentalen Typen beschränkt, welche sie nie ändern werden.

> String, Char, Integer und Cardinal fallen da schonmal weg,
da diese an die jeweils unterstützt Plattform angepasst werden.




Wie es bisher wohl Viele machen:
Hier kann/wird es irgendwann mal Probleme geben, wenn man es in einer anderen Delphi-Version kompilieren will!
Delphi-Quellcode:
Var S: String;

// speichern
SizeInByte := Length(S);
Stream.WriteBuffer(S[1], SizeInByte);

// lesen
SetLength(S, SizeInByte);
Stream.WriteBuffer(S[1], SizeInByte);




Als AnsiString:
- dieses arbeitet in allen Delphiversionen gleich
- aber es bietet keine UnicodeUnterstützung in neueren Delphi
- dafür sind die gespeicherten Daten auch zwischen den verschiedenen Delphiversionen kompatibel
> hier wurde praktisch nur der String-Typ festgelegt und alles Andere bleibt gleich
Delphi-Quellcode:
Var S: AnsiString;

// Speichern
SizeInByte := Length(S);
if SizeInByte > 0 then Stream.WriteBuffer(S[1], SizeInByte);

// Lesen
SetLength(S, SizeInByte);
if SizeInByte > 0 then Stream.WriteBuffer(S[1], SizeInByte);
Als WideString/UnicodeString:
- dieses arbeitet in allen Delphiversionen gleich
- aber es bietet die Ansi-Unterstützung nur indirekt
- dafür sind die gespeicherten Daten ebenfalls zwischen den verschiedenen Delphiversionen kompatibel
Delphi-Quellcode:
Var S: WideString; // oder UnicodeString

// Speichern
SizeInByte := Length(S) * 2;
if SizeInByte > 0 then Stream.WriteBuffer(S[1], SizeInByte);

// Lesen
SetLength(S, SizeInByte div 2);
if SizeInByte > 0 then Stream.WriteBuffer(S[1], SizeInByte);

// sichereres Lesen, falls SizeInByte nicht immer ein vielfaches von 2 ist
SetLength(S, (SizeInByte + 1) div 2);
if SizeInByte > 0 then begin
  S[Length(S)] := #0; // damit im Notfall das letzte Zeichen nicht teilweise undefiniert ist
  Stream.WriteBuffer(S[1], SizeInByte);
end;
Weiterhin als String:
- dieses arbeitet einigen Delphiversionen unterschiedlich, da sich ja String-Typ unterscheidet
- es unterstützt immer den Standardtypen in der jeweiligen Delphi-Version
- die gespeicherten Daten nur in Delphiversionen kompatibel, welche den selben Standard-String-Typen besitzen
- dieses würde sogar Unicode4 unterstützen, wenn es denn mal von Delphi verwendet würde, was wohl bald mal der Fall sein könnte
Delphi-Quellcode:
Var S: String;

// Speichern
SizeInByte := Length(S) * SizeOf(Char);
if SizeInByte > 0 then Stream.WriteBuffer(S[1], SizeInByte);

// Lesen
SetLength(S, (SizeInByte + 1) div SizeOf(Char));
if SizeInByte > 0 then Stream.WriteBuffer(S[1], SizeInByte);

// sichereres Lesen, falls SizeInByte nicht immer ein vielfaches von SizeOf(Char) ist
SetLength(S, (SizeInByte + SizeOf(Char) - 1) div SizeOf(Char);
if SizeInByte > 0 then begin
  S[Length(S)] := #0; // damit im Notfall das letzte Zeichen nicht teilweise undefiniert ist
  Stream.WriteBuffer(S[1], SizeInByte);
end;


Ansonsten verhält es sich bei allen anderen Block-Leseverfahren genauso, außer daß dort einfach nur andere Schreib-/Lesebefehle verwendet werden.
Neuste Erkenntnis:
Seit Pos einen dritten Parameter hat,
wird PoSex im Delphi viel seltener praktiziert.
 
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 16:54 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz