Einzelnen Beitrag anzeigen

hansklok

Registriert seit: 14. Apr 2004
Ort: Karlsruhe
318 Beiträge
 
Delphi 2010 Architect
 
#1

Unicode String in FileStream speichern/auslesen

  Alt 12. Feb 2011, 16:09
Hallo,

ich versuche grade (wahrscheinlich wie viele andere auch) mein altes Projekt dem neuen Delphi 2010/XE anzupassen.

Ich habe folgende Klassenstruktur:

Delphi-Quellcode:
  { Adressen }
  TAddress = class
  private
    fAddress, { Adresszeile 1 }
    fAddressLine1, { Adresszeile 2 }
    fAddressLine2, { Adresszeile 3 }
    fAddressLine3, { Adresszeile 4 }
    fCity, { Stadt }
    fState, { Staat }
    fPostalCode, { Postleitzahl }
    fCountry: Utf8String; { Land }
    fPhone: array[1..MaxPhoneNumbers] of Utf8String; { Telefonnummern }
    fFax: array[1..MaxFaxNumbers] of Utf8String; { Faxnummern }
    fEmail: array[1..MaxEmailAddresses] of Utf8String; { E-Mail Adressen }
    fWeb: array[1..MaxWebpages] of Utf8String; { Webseiten }

    procedure setPhone(Index: Integer; APhoneNumber: Utf8String);
    procedure setEmail(Index: Integer; AEmailAddress: Utf8String);
    procedure setFax(Index: Integer; AFaxNumber: Utf8String);
    procedure setWeb(Index: Integer; AWebpage: Utf8String);

    function getPhone(Index: Integer): Utf8String;
    function getEmail(Index: Integer): Utf8String;
    function getFax(Index: Integer): Utf8String;
    function getWeb(Index: Integer): Utf8String;
  public
    property ADDR: Utf8String read fAddress write fAddress;
    property ADR1: Utf8String read fAddressLine1 write fAddressLine1;
    property ADR2: Utf8String read fAddressLine2 write fAddressLine2;
    property ADR3: Utf8String read fAddressLine3 write fAddressLine3;
    property CITY: Utf8String read fCity write fCity;
    property STAE: Utf8String read fState write fState;
    property POST: Utf8String read fPostalCode write fPostalCode;
    property CTRY: Utf8String read fCountry write fCountry;
    property PHON[Index: Integer]: Utf8String read getPhone write setPhone;
    property EMAIL[Index: Integer]: Utf8String read getEmail write setEmail;
    property FAX[Index: Integer]: Utf8String read getFax write setFax;
    property WWW[Index: Integer]: Utf8String read getWeb write setWeb;

    procedure Save(s: TStream);
    procedure Load(s: TStream);

    function hasAddress: Boolean;
    function hasAddressLine1: Boolean;
    function hasAddressLine2: Boolean;
    function hasAddressLine3: Boolean;
    function hasCity: Boolean;
    function hasState: Boolean;
    function hasPostalCode: Boolean;
    function hasCountry: Boolean;
    function hasPhone(Index: Integer): Boolean;
    function hasFax(Index: Integer): Boolean;
    function hasEmail(Index: Integer): Boolean;
    function hasWeb(Index: Integer): Boolean;
  end;
Nun möchte ich eine Adresse in einer Datei mittels TFileStream speichern.

Um die UnicodeStrings zu speichern haben ich mir wie von Embacadero vorgeschlagen den folgenden Code verwendet:

Delphi-Quellcode:
var
  Size: Integer;

procedure StrToStream(AString: String; AStream: TStream);
begin
  { Richtig für Unicode-Daten }
  AStream.Write(Pointer(AString)^, Length(AString) * SizeOf(Char));
end;

procedure StrFromStream(var AString: String; AStream: TStream);
begin
  { Richtig für Unicode-String-Daten }
  AStream.Read(Size, SizeOf(Integer));
  SetLength(AString, Size);
  AStream.Read(Pointer(AString)^, Size * SizeOf(Char));
end;
Im Testprojekt sieht das ganze so aus:

Delphi-Quellcode:
procedure TForm1.FormCreate(Sender: TObject);
var
  fs: TFileStream;
  adr: TAddress;
begin
  if not FileExists('test.mcgen') then
    begin
      fs:= TFileStream.Create('test.mcgen', fmCreate);
      adr:= TAddress.Create;
      adr.ADDR:= 'Heidi Hase';
      adr.ADR1:= 'Talstraße xxx';
      adr.CITY:= 'Talbach';
      adr.POST:= '00000';
      adr.PHON[1]:= '00000 / 00 00000';
      adr.PHON[2]:= '00000 / 00 00000';
      adr.EMAIL[1]:= 'heidi@talbach.de';
      adr.Save(fs);
      fs.Free;
    end else
    begin
      fs:= TFileStream.Create('test.mcgen', fmOpenRead);
      adr:= TAddress.Create;
      adr.Load(fs);
      Memo1.Lines.Add(adr.ADDR);
      Memo1.Lines.Add(adr.ADR1);
      Memo1.Lines.Add(adr.CITY);
      Memo1.Lines.Add(adr.POST);
      Memo1.Lines.Add(adr.PHON[1]);
      Memo1.Lines.Add(adr.PHON[2]);
      Memo1.Lines.Add(adr.EMAIL[1]);
      Caption:= adr.EMAIL[1];
      fs.Free;
    end;
end;
In die Datei wird auch etwas geschrieben, aber sie lässt sich nicht auslesen bzw. nur fehlerhaft oder es erscheint eine Fehlermeldung "Out of memory".

Was hab ich falsch gemacht, ich verzweifel fast.

Danke und VG hansklok

Geändert von hansklok (12. Feb 2011 um 16:41 Uhr)
  Mit Zitat antworten Zitat