我想将一个ini文件作为资源文件添加到我的delphi项目中。
我知道你要把文件添加为资源文件:
项目>资源和图像>添加
但是一旦那样做了我需要做的其他事情才能从文件中读取?我之前没有使用过资源文件。
该流程是否有任何文档?
谢谢,
答案 0 :(得分:4)
RTL中的内置INI文件类,在 System.IniFiles
单元中提供,要求INI文件为磁盘文件。因此,您可以将资源提取到磁盘并从那里读取。
如果您不喜欢这个想法,那么您可以编写自己的INI文件解析器,该解析器在流而不是文件上运行。您可以使用TMemIniFile
的代码来指导您。复制该代码并将LoadValues
替换为代码以从流而不是文件中读取。或者,如果你看起来足够努力,那么你很可能会找到一个在流上运行的第三方INI解析器。
如果您准备考虑其他格式,那么您可以使用JSON而不是INI。内置的JSON解析器不需要输入数据驻留在磁盘上。它们可以对内存中的字符串进行操作,这听起来更方便。
以上文字实际上是无稽之谈。感谢雷米指出这一点。您可以使用TMemIniFile
及其SetStrings
方法来解析不驻留在磁盘上的INI内容。它是这样的:
TStringList
,并将字符串变量分配给字符串列表的Text
属性。TMemIniFile
。SetStrings
上通过字符串列表调用TMemIniFile
。或者:
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)
要完成此操作,您的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信息......如上所述,如果你把它作为资源添加,你也可以对它进行硬编码。资源应主要用于二进制数据(图像,音频文件,视频等)。