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

时间:2016-06-08 08:39:15

标签: delphi delphi-xe8

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

我知道你要把文件添加为资源文件:

项目>资源和图像>添加

但是一旦那样做了我需要做的其他事情才能从文件中读取?我之前没有使用过资源文件。

该流程是否有任何文档?

谢谢,

4 个答案:

答案 0 :(得分:4)

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

如果您不喜欢这个想法,那么您可以编写自己的INI文件解析器,该解析器在流而不是文件上运行。您可以使用TMemIniFile的代码来指导您。复制该代码并将LoadValues替换为代码以从流而不是文件中读取。或者,如果你看起来足够努力,那么你很可能会找到一个在流上运行的第三方INI解析器。

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

以上文字实际上是无稽之谈。感谢雷米指出这一点。您可以使用TMemIniFile及其SetStrings方法来解析不驻留在磁盘上的INI内容。它是这样的:

  • 将INI内容作为字符串放入资源中。
  • 将该资源加载到字符串变量中。
  • 创建TStringList,并将字符串变量分配给字符串列表的Text属性。
  • 创建TMemIniFile
  • SetStrings上通过字符串列表调用TMemIniFile

或者:

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

说完所有这些之后,你会选择这样做似乎很奇怪。仅仅将配置信息硬编码为一系列常量会不会更简单?

答案 1 :(得分:2)

要在可执行文件中添加文件,请务必添加.rc文件(而不是直接添加.ini文件),例如inis.rc(因此在源文件中{{1你将dpr)并在此文件中写入如下列表:

{$R 'inis.res' 'inis.rc'}

如果您已将ini文件存储在(相对)目录中,请确保在C语法中加倍反斜杠。 (this 100 "this.ini" that 100 "that.ini" 这里是资源类型,没有专门分配给ini文件的编号,所以我们将使用未分配的编号。最好的下一个是23,它被分配给RT_HTML,参见下文)

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

Values

答案 2 :(得分:2)

使用"资源和图像"对话框,将.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;

答案 3 :(得分:1)

imho,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();

所以基本上它包含TEXT信息......如上所述,如果你把它作为资源添加,你也可以对它进行硬编码。资源应主要用于二进制数据(图像,音频文件,视频等)。