AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Algorithmen, Datenstrukturen und Klassendesign Delphi Unicode String in FileStream speichern/auslesen
Thema durchsuchen
Ansicht
Themen-Optionen

Unicode String in FileStream speichern/auslesen

Ein Thema von hansklok · begonnen am 12. Feb 2011 · letzter Beitrag vom 29. Feb 2012
 
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, 15: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 15:41 Uhr)
  Mit Zitat antworten Zitat
 


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 02:43 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