Delphi 如何在INI文件中分隔各个部分?

Delphi 如何在INI文件中分隔各个部分?,delphi,ini,Delphi,Ini,保存到INI文件时,尤其是定义了多个节时,数据将一起保存,节之间没有任何行 出于外部编辑目的,可以方便地使用换行符分隔每个部分,以便于查看和编辑INI文件 例如: 标准Ini [GENERAL] value1=0 value2=somestring [ADVANCED] type=1 autosave=0 [OTHER] showatstartup=1 Ini带有分隔线 [GENERAL] value1=0 value2=somestring [ADVANCED] type=1 autosa

保存到INI文件时,尤其是定义了多个节时,数据将一起保存,节之间没有任何行

出于外部编辑目的,可以方便地使用换行符分隔每个部分,以便于查看和编辑INI文件

例如:

标准Ini

[GENERAL]
value1=0
value2=somestring
[ADVANCED]
type=1
autosave=0
[OTHER]
showatstartup=1
Ini带有分隔线

[GENERAL]
value1=0
value2=somestring

[ADVANCED]
type=1
autosave=0

[OTHER]
showatstartup=1

如何做到这一点?

加载文件并在每个节名前插入空行。这里有一个函数:

procedure InsertSectionLineBreaks(const IniFile: TFileName);
var
  f: TStrings;
  i: Integer;
begin
  f := TStringList.Create;
  try
    f.LoadFromFile(IniFile);
    for i := Pred(f.Count) downto 1 do
      if (f[i] <> '') and (f[i][1] = '[') then
        f.Insert(i, '');
    f.SaveToFile(IniFile);
  finally
    f.Free;
  end;
end;
procedure InsertSectionLineBreaks(const-IniFile:TFileName);
变量
f:t管柱;
i:整数;
开始
f:=TStringList.Create;
尝试
f、 LoadFromFile(IniFile);
对于i:=Pred(f.Count)减至1 do
如果(f[i]''和(f[i][1]='['),那么
f、 插入(i);
f、 保存文件(IniFile);
最后
f、 免费的;
结束;
结束;

请注意,如果节名称之前已经有一个空行,则此代码将添加另一个。假设不需要在文件的第一节上方添加空行,则循环将降为1而不是零。

手动添加行确实是一个可行的解决方案。另一个选项是在heri中创建自己的自定义类从文件中删除并更改行为,以在节标题之前包含额外的换行符



更新:如果要使用此方法,请使用TCustomIniFile作为基类,而不是TIniFile。

最简单的方法是使用而不是TIniFile打开.ini文件。其工作方式相同,但在保存(UpdateFile)时,会自动在节之间添加空格。

为什么不使用简单的回车符:Add(#13#10);

它不仅可以为您提供空间,而且与依赖私有配置文件API的版本相比,它更加健壮!而且它还可以从文件中删除所有以“;”(以前是标准)开头的注释,这是我切换到“/”的原因评论。@Andreas OT:在这种情况下,我实际上讨厌
pred
。与
Count-1
相比,我看不出它有什么优点@David:我没有说我喜欢它。但是因为我以前没有见过它以这种方式使用,所以我有点兴奋。但是,当使用动态数组时,我确实写
high(arr)
,而不是
length(arr)-1
。但这是另一回事,我相信你对此没有异议。@Andreas AFAIK,在现代Delphi上,
high(array)
将被内联,并将生成与动态数组的
length(array)-1
相同的代码。对于
常量数组
作为参数,
high(array)
是首选,因为
high(array)
是存储在堆栈上的值。@David
Count-1
pred(Count)
将生成完全相同的asm代码。@A.Bouchez我的首选是关于人类读者,而不是编译器发出的代码。@Bork,我已经在Delphi 2007中查看了不起作用的代码。所做的只是调用DLL。除非您想完全重写代码,否则此处无需更改:-(@Johan:Use
TMemIniFile
代替。这很容易调整。@用户文件不依赖内核,它是用户空间代码。@Craig和@Johan-Delphi文档说,如果你想创建自定义类,你应该从TCustomIniFile继承。我会查看该文档。你考虑过为了可读性而使用XML吗?@Mike:XML应该比INI可读性更好?你不是认真的吧!@Mike:我允许用户编辑INI文件,因为创建GUI来更改设置并不划算。但是我不相信那些用户手工编辑XML文件。在许多国家,期望人们阅读XML文件被认为是违反基本人权的行为。@dummzeuch:对于非常长的ini文件,绝对是认真的。对于短的文件不是,但我从请求中收集到,我们在这里讨论的是长文件。