添加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;
我想将 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;