2016-06-08 95 views
3

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

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

项目>资源和图像>添加

但一旦多数民众赞成在做什么呢,我需要做的是能够读取文件?我以前没有使用资源文件。

是否有关于该过程的任何文档?

感谢,

+0

为什么?如果你将配置添加到exe,无论如何你不能硬编码它? –

+2

以下是从资源文件中获取文本信息的方法:[如何将TXT文件资源添加到我的EXE文件?](http://stackoverflow.com/a/8943364/576719)。使用流将其加载到'TMemIniFile'中。 –

回答

2

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

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

如果你存储在一个(相对)目录下的.ini文件,一定要反斜线,因为这在C-语法一倍。 (这里的100是资源类型,没有专门分配给ini文件的编号,所以我们将使用未分配的编号。最好的下一个是23,它被分配给RT_HTML,见下文)

如果你是不使用组(仅使用[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; 
+1

恕我直言,而不是'指针'['MAKEINTRESOURCE'](https://msdn.microsoft.com/de-de/library/windows/desktop/ms648029(v = vs.85).aspx)应该使用。 –

+0

是的,但在Delphi中,我注意到声明在几个单元之间在连续版本之间传播,所以我恢复了一个指针以便在大多数情况下工作(达到相同的基本效果) –

+0

您可以将此答案进一步通过将TStringList加载到TMemIniFile中。 –

4

内置在RTL INI文件类,在 System.IniFiles单位提供,需要INI文件是一个磁盘文件。所以你可以将资源提取到磁盘并从那里读取。

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

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

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

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

或者:

  • 把你的INI内容到一个资源为字符串。
  • 创建一个TResourceStream对象来读取该资源。
  • 创建一个TStringList对象。
  • 在通过资源流的字符串列表上调用LoadFromStream
  • 创建一个TMemIniFile
  • 拨打在TMemIniFile上传递字符串列表。

说完所有这一切后,看起来很奇怪你会选择这样做。将一个单元中的配置信息硬编码为一系列常量不是简单吗?

+2

“* RTL中的内置INI文件类,在System.IniFiles单元中提供,要求INI文件为磁盘文件*” - TMemIniFile可以从TStrings(TMemIniFile.SetStrings())加载INI, TStringList可以从TStream(TStrings.LoadFromStream())加载,并且TResourceStream可以用于读取资源。 –

+0

@RemyLebeau谢谢 –

1

恕我直言,ini文件只是一个文本文件与应用程序分发所以你可以在一个特定的环境控制应用程序的行为。例如,您可以在“language.ini”中存储一种语言,从源代码中读取它并根据该语言呈现GUI。

要做到这一点,你的ini文件中包含:

[general] 
language=Russian 

然后从德尔福阅读:

... 
    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(); 

所以基本上包含文本信息...就像上面说,如果添加它作为一种资源,你可能会硬编码它。资源应主要用于二进制数据(图像,音频文件,视频等)。

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;