添加ini文件作为资源文件并从中读取

Add ini file as resource file and read from it

我想将 ini 文件作为资源文件添加到我的 delphi 项目中。

我知道你去哪里添加一个文件作为资源文件:

项目 > 资源和图像 > 添加

但是一旦完成,我还需要做什么才能从文件中读取?我之前没用过资源文件。

这个过程有文档吗?

谢谢,

RTL中内置INI文件类,在System.IniFiles单元中提供,要求INI文件为磁盘文件。因此,您可以将资源提取到磁盘并从那里读取。

如果您不喜欢这个想法,那么您可以编写自己的 INI 文件解析器,该解析器对流而不是文件进行操作。您可以使用 TMemIniFile 的代码来指导您。复制该代码并将 LoadValues 替换为从流而不是文件中读取的代码。或者,如果您仔细寻找,那么您很可能会找到对流进行操作的第三方 INI 解析器。

如果您准备考虑其他格式,那么您可以使用 JSON 而不是 INI。内置的 JSON 解析器不需要将输入数据驻留在磁盘上。它们可以对内存中的字符串进行操作,这听起来更方便。

以上这段文字其实是胡说八道。感谢雷米指出这一点。您可以使用 TMemIniFile 及其 SetStrings 方法来解析不在磁盘上的 INI 内容。它是这样的:

  • 将您的 INI 内容作为字符串放入资源中。
  • 将该资源加载到字符串变量中。
  • 创建一个TStringList,并将字符串变量赋值给字符串列表的Text属性
  • 创建 TMemIniFile.
  • 在传递字符串列表的 TMemIniFile 上调用 SetStrings

或者:

  • 将您的 INI 内容作为字符串放入资源中。
  • 创建一个 TResourceStream 对象来读取该资源。
  • 创建一个 TStringList 对象。
  • 在传递资源流的字符串列表上调用LoadFromStream
  • 创建 TMemIniFile.
  • 在传递字符串列表的 TMemIniFile 上调用 SetStrings

说了这么多,你会选择这样做似乎很奇怪。将配置信息硬编码在一个单元中,作为一系列常量不是更简单吗?

要在可执行文件中添加文件,一定要添加一个.rc文件(不是直接添加.ini文件),例如inis.rc(所以在源文件dpr 你会得到 {$R 'inis.res' 'inis.rc'}) 并在这个文件中写下这样一个列表:

this 100 "this.ini"
that 100 "that.ini"

如果您已将 ini 文件存储在(相对)目录中,请务必将反斜杠加倍,因为这是 C 语法。 (这里的 100 是资源类型,没有专门分配给 ini 文件的编号,所以我们将使用未分配的编号。接下来最好的是分配给 RT_HTML 的 23,见下文)

如果您不使用组(和只有 [GroupName] 的行),我建议您使用普通的 TStringList 对象及其 Values 属性。要用数据加载它们,请使用如下内容:

var
  sl:TStringList;
  r:TResourceStream;
begin
  sl:=TStringList.Create;
  try
    r:=TResourceStream.Create(HInstance,'this',MAKEINTRESOURCE(100));
    try
      sl.LoadFromStream(r);
    finally
      r.Free;
    end;

    //sl.Values['Setting']

  finally
    sl.Free;
  end;
end;

恕我直言,ini 文件只是一个与应用程序一起分发的文本文件,因此您可以控制应用程序在特定环境中的行为。例如,您可以在 "language.ini" 中存储一种语言,从您的源代码中读取它,并显​​示基于该语言的 GUI。

为此,您的 ini 文件包含:

[general]
language=Russian

然后从 Delphi 阅读:

    ...
    uses Inifiles;
    ...
    var CurrentLanguage:string;
    ...    
    Ini := TIniFile.Create('C:\somedir\languages.ini');    
    CurrentLanguage := Ini.ReadString('General', 'language', 'English');//if key isn't found, language is English    
    Ini.free();

所以基本上它包含文本信息...如上所述,如果您将其添加为资源,您最好对其进行硬编码。资源应该主要用于二进制数据(图像、音频文件、视频等)。

使用 "Resources and Images" 对话框,将 .ini 文件作为 RCDATA 资源类型添加到项目中。然后,您可以像这样在运行时加载它:

uses
  ..., Classes, IniFiles;

var
  Ini: TMemIniFile;
  List: TStringList;
  Strm: TResourceStream;
begin
  Ini := TMemIniFile.Create;
  try
    List := TStringList.Create;
    try
      Strm := TResourceStream.Create(HInstance, 'ResourceIDHere', RT_RCDATA);
      try
        List.LoadFromStream(Strm);
      finally
        Strm.Free;
      end;
      Ini.SetStrings(List);
    finally
      List.Free;
    end;
    // use Ini as needed...
  finally
    Ini.Free;
  end;
end;