Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi String(unicode) in einen Stream speichern/Laden (https://www.delphipraxis.net/145622-string-unicode-einen-stream-speichern-laden.html)

DataCool 5. Jan 2010 11:03


String(unicode) in einen Stream speichern/Laden
 
Hi Leute,

ich möchte ein paar Propertys einer Klasse in einen Stream schreiben,
diesen verschicken(das ist nicht das Problem) und wieder einlesen.
Unter den Propertys befinden sich logischerweise auch ein paar Strings,
für diese Strings sollten alle Zeichensätze unterstüzt werden.

Worauf muss ich jetzt beim Schreiben/Laden des Streams achten, damit folgende Vorraussetzungen erfüllt sind :

- Lauffähig unter Delphi2007 und Delphi2010
- Unterstüzung aller Zeichensätze

Welche Stringtypen müssen jetzt verwendet werden ?
String, Pchar, PAnsiChar, pWideChar, ... ?

Für ein paar kurze Anregungen/Erklärungen wäre ich dankbar,

Greetz Data

himitsu 5. Jan 2010 11:52

Re: String(unicode) in einen Stream speichern/Laden
 
Delphi-Quellcode:
für diese Strings sollten alle Zeichensätze unterstüzt werden.
Also Unicode

> bis D2007 : WideString, WideChar-Array und PWideChar
> ab D2009 : zusätzlich noch UnicodeString

Abgesehn von einem statischen Array besteht alles aus einem Pointer und du mußt die Text-Daten selber in den Stream übertragen.

Dazu gibt es noch TStringStream, welcher aber vor D2009 nur ANSI kann.

DataCool 5. Jan 2010 12:10

Re: String(unicode) in einen Stream speichern/Laden
 
@himitsu:

Es war mir schon klar das ich den String selber in den Stream schreiben muss.
Nur welche Stringtypen verwende ich das es unter den oben genannten Delphi-Version einwandfrei funktioniert und dabei Unicode unterstüzt ?

Hier ein wenig Code-Bsp.:
Delphi-Quellcode:
{ TDummyTest }


procedure TDummyTest.SaveToStream(AStream: TStream);
Var iLen : SmallInt;
begin
  AStream.Position := 0;
  AStream.Size := 0;
  AStream.Write(FIdent,SizeOf(Integer));
  AStream.Write(FKind,SizeOf(Integer));
  iLen := Length(FStr1);
  AStream.Write(iLen,SizeOf(iLen));
  AStream.Write(PChar(FStr1)^,iLen); // Hier PChar oder doch PWideChar ?
  AStream.Write(FRes,SizeOf(SmallInt));
end;

procedure TDummyTest.LoadFromStream(AStream: TStream);

    procedure ReadStr(Var sTarget : String);
    Var iLen : SmallInt;
        pch : PChar; // oder PWideChar ?
        buffer : array[0..4096] of char; // Alternativ
    begin
      AStream.Read(iLen,SizeOf(SmallInt));
      GetMem(pch,iLen);
      try
      //AStream.Read(pCh^,iLen);
     
      // alternativ
      AStream.Read(buffer[0],iLen);
      sTarget := copy(buffer,1,4);
      finally
        FreeMem(pCh,iLen);
      end;
    end;

begin
  AStream.Read(FIdent,SizeOf(Integer));
  AStream.Read(FKind,SizeOf(Integer));

  ReadStr(FStr1);

  AStream.Read(FRes,SizeOf(SmallInt));
end;
Wie bekomm ich diesen Code, funktionsfähig für alle Zeichensätze und unter D2007 + D2010 lauffähig ?

Danke,

Greetz Data

himitsu 5. Jan 2010 13:21

Re: String(unicode) in einen Stream speichern/Laden
 
Zitat:

Zitat von DataCool
Hier PChar oder doch PWideChar ?

http://www.delphipraxis.net/internal...115844#1115844

DataCool 5. Jan 2010 13:34

Re: String(unicode) in einen Stream speichern/Laden
 
Hi Himitsu,

den Thread hatte ich sogar schon gelesen bin mir bei der Bedeutung aber noch nicht 100% sicher,
ist es also richtig das ich für meinem Fall mit PAnsiChar arbeiten soll
und zum Speichern der Länge Länge * SizeOf(PAnsiChar) verwenden, richtig ?

Danke

Data

jbg 5. Jan 2010 13:40

Re: String(unicode) in einen Stream speichern/Laden
 
[quote="DataCool"]SizeOf(PAnsiChar)/quote]
Du meinst wohl SizeOf(AnsiChar) ohne das P, sonst wären das ein paar Byte zu viel pro Zeichen.

himitsu 5. Jan 2010 13:45

Re: String(unicode) in einen Stream speichern/Laden
 
Wenn du nur ANSI haben willst, dann ist AnsiString, PAnsiChar und SizeOf(AnsiChar) OK,
ansonsten eben WideString, PWideChar und SizeOf(WideChar).


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