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