delphi 当它应该返回默认值时,ReadString没有返回默认值......?

nue99wik  于 2022-11-23  发布在  其他
关注(0)|答案(2)|浏览(232)

我是不是只见树木不见森林?
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.
osh3o9ms

osh3o9ms1#

TIniFile.ReadString()的文档(以及TMemIniFile.ReadString()的文档)具有误导性。具体而言,以下子句:
Default是在以下情况下返回的字符串值:

  • ...
    *未分配键的数据值。

是错误的,必须移除。只有在找不到指定的SectionKey时,才会传回Default值。Keyvalue 对是否传回Default没有任何影响。
我现在已经向Embarcadero提交了一个错误报告:
RSP-39946: Docs for TIniFile.ReadString() and TMemIniFile.ReadString() are wrong.

wixjitnu

wixjitnu2#

您的INI文件如下所示:

[USB_Drives]
DriveLetter =

显然,有一个名为DriveLetter的键,其值为空字符串。
如果文件被

[USB_Drives]
DriverFrogness =

你确实会收到你的Missing_Value,因为没有DriveLetter密钥。
显然,您会认为空字符串是一个缺少的值,但是,根据the documentation for the GetPrivateProfileString function,RTL的TIniFile.ReadString()是一个简单的 Package 器:
[in] lpDefault
预设字串。如果在初始化档案中找不到 lpKeyName 机码,GetPrivateProfileString会将预设字串复制到 lpReturnedString 缓冲区。

相关问题