delphi – 读取Inifile到Stringlist问题空间的问题
我使用inifile存储值,我用它来替换文件中的其他值,例如A,BA = B,但是如果我在值B之前有一个空格,那么当读取EG A = B时仍然读取在’B’而不是’B’,有没有人知道如何解决这个问题,我使用的是Delphi 7,所以我不能使用StrictDelimiter选项.
procedure ReadIntoVList(const aSection:string;AValueList:TValueListEditor); var IniFile:TIniFile; SL: TStringList; i: Integer; begin SL := TStringList.Create; IniFile := TIniFile.Create(ChangeFileExt(Application.Exename,'.ini')); try IniFile.ReadSectionValues(ASection,SL); AvalueList.Strings.AddStrings(SL); finally StampIniFile.Free; SL.Free; end; end; 谢谢 科林 解决方法
TIniFile.ReadSectionValues最终使用Windows API函数GetPrivateProfileString从ini文件中读取键值. GetPrivateProfileString将删除任何前导和尾随空格以及字符串周围的任何引号.
这意味着该行 [key = value1 value2 value3] 将返回与该行相同的值 [key = value1 value2 value3] (添加方括号以显示额外的空格). 为了保留任何前导和尾随空格,在将字符串写回ini时,必须将字符串用单引号或双引号括起来. 由于GetPrivateProfileString删除任何周围的引号(单引号或双引号),因此在从ini文件中读取值时不需要删除它们. 要添加引号,您不应该使用函数AnsiQuotedStr函数,如Francois所提到的(编辑,除非您特别注意选择一个非常不可能在字符串中的引号char). AnsiQuotedStr将添加周围的双引号,但它也会使字符串中已有的双引号加倍.虽然当您随后使用AnsiDequoteStr时这是期望的行为,但是当您使用TIniFile读取值时,GetPrivateProfileString将删除周围的quoatation标记,但它不会对嵌入的标记进行去加倍. 因此,如果您要使用TIniFile从文件读取值并希望保留前导和尾随空格,则必须自己添加周围的引号并确保任何嵌入的引号不会加倍(或者您必须用TIniFile读取它们后自己去掉它们. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |