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 [email protected] http://lists.lazarus.freepascal.org/mailman/listinfo/lazarus
