On 03.03.2013 13:49, Xiangrong Fang wrote:
Hi Sven,
{$mode objfpc}{$H+}
TConfiguration = packed record
DataFolder: string;
end;
does not work, but:
TConfiguration = packed record
DataFolder: array [0..MaxPathLen] of Char;
end;
worked. My save procedure is:
function SaveParams(var Buffer; Count: Integer; FileName: string): Boolean;
var
fs: TFileStream;
begin
Result := False;
if not ForceDirectories(ExtractFilePath(FileName)) then Exit;
try
fs := TFileStream.Create(FileName, fmCreate);
try
fs.Write(Buffer, Count);
Result := True;
finally
fs.Free;
end;
except
end;
end;
It is called on the finalization section of config.pas:
SaveParams(cfg, SizeOf(cfg), cfn);
//cfg is TConfgiruation, cfn is the filename.
The symptoms of error are:
1. The DataFolder value is not saved to configuration file, although
file saving seems succeeded.
2. There are weird access violations, e.g. on exiting or on occasions
that I try to manipulate the configuration at runtime (RunError(203) was
reported).
Anything that I did wrong? or, AnsiString is not supported this way anyway?
No, AnsiString is not supported in this way. As Jürgen wrote it's
basically a pointer to the string data and not a static array of the
string data. And the write and read procedures of TStream (but also the
file I/O) will write the record's memory as is and thus the value of the
pointer will be written in case of AnsiString.
Regards,
Sven
--
_______________________________________________
Lazarus mailing list
Lazarus@lists.lazarus.freepascal.org
http://lists.lazarus.freepascal.org/mailman/listinfo/lazarus