我是不是只见树木不见森林?
Delphi 在inifile.ReadString()
上返回''
,而不是提供的默认参数。根据帮助,当节、键或值丢失时,它应该返回默认值。
我很肯定我以前用过很多次,没有任何问题。
unit Unit1;
interface
uses
Classes, System.SysUtils, Inifiles, Dialogs;
implementation
const
DRIVE_SECTION = 'USB_Drives';
DRIVE_LETTER = 'DriveLetter';
INI_NAME = 'c:\temp\test.ini';
//--------------------------------------------------------
procedure CreateDefaultInifile(const IniName: TFileName);
var
slist: TStringList;
begin
slist := TStringList.Create;
try
slist.Add('[' + DRIVE_SECTION + ']');
slist.Add(DRIVE_LETTER + ' = ');
//
slist.SaveToFile(IniName);
finally
slist.Free;
end;
end;
begin
if not FileExists(INI_NAME) then
CreateDefaultInifile(INI_NAME);
// now we have an inifile with a key that has no value
var ini := TIniFile.Create(INI_NAME);
Showmessage(ini.ReadString(DRIVE_SECTION, DRIVE_LETTER, 'Missing_Value'));
// according to Delphi's help, the default ('Missing_Value' in this case) should be returned if no value is assigned!
ini.Free;
end.
end.
2条答案
按热度按时间osh3o9ms1#
TIniFile.ReadString()
的文档(以及TMemIniFile.ReadString()
的文档)具有误导性。具体而言,以下子句:Default
是在以下情况下返回的字符串值:*未分配键的数据值。
是错误的,必须移除。只有在找不到指定的
Section
或Key
时,才会传回Default
值。Key
的 value 对是否传回Default
没有任何影响。我现在已经向Embarcadero提交了一个错误报告:
RSP-39946: Docs for TIniFile.ReadString() and TMemIniFile.ReadString() are wrong.
wixjitnu2#
您的INI文件如下所示:
显然,有一个名为
DriveLetter
的键,其值为空字符串。如果文件被
你确实会收到你的
Missing_Value
,因为没有DriveLetter
密钥。显然,您会认为空字符串是一个缺少的值,但是,根据the documentation for the
GetPrivateProfileString
function,RTL的TIniFile.ReadString()
是一个简单的 Package 器:[in] lpDefault
预设字串。如果在初始化档案中找不到 lpKeyName 机码,GetPrivateProfileString会将预设字串复制到 lpReturnedString 缓冲区。