我目前正在尝试创建一个" Profile Manager"使用TIniFile存储数据,并在表单(编辑框等)上的各种组件中显示数据。
在表格上,我有一个Combobox。这可以作为一种显示" Profile Name"由用户设定。
数据以每个inifile部分1个配置文件的格式存储。每个部分包含1个配置文件的配置数据,包括配置文件名称。每个部分的配置文件名称键相同。这是我目前在inifile中所获得的那种布局(例如);
[0]
PROFILE_NAME=Profile 1A
PROFILE_DATA=Profile Data 1A
PROFILE_PASS=Profile Password 1
PROFILE_USER=Profile Username 1
[1]
PROFILE_NAME=Profile 1B
PROFILE_DATA=Profile Data 1B
PROFILE_PASS=Profile Password 1B
PROFILE_USER=Profile Username 1B
我想要做的是使用键" PROFILE_NAME"加载所有值的列表。无论它们位于哪个部分,都可以放入组合框中。当添加数据时,部分名称本身就是对组合框中的itemindex的引用。
从那里,我可以处理将其他数据加载到其相关字段中,但我在查明如何加载" PROFILE_NAME"时遇到问题。组合框中的值。有什么想法吗?
对于那些熟悉语音通信程序" Ventrilo"的人来说,它的功能类似于我试图通过它实现的服务器和用户管理器"服务器和用户管理器" ;。它的inifile布局非常相似,我能找到的唯一区别是它有一个" USER_COUNT"值引用已添加的用户数。每个用户都分配了服务器,而不是每个用户都可以访问的服务器。
我有可能实现这个目标吗?
答案 0 :(得分:2)
您必须使用TIniFile.ReadSections
获取所有部分名称的列表,然后您可以遍历它们并从每个部分中读取单个PROFILE_NAME
。 (我更喜欢TMemIniFile
,因为TIniFile
直接基于WinAPI函数,并且在尝试使用新值进行更新时有时会在网络驱动器上出现问题。TMemIniFile
在您获得时也可以跨平台工作到XE2
。)
我正在创建TMemIniFile
和TStringList
并释放它们,但如果您反复使用它们,您可能希望在表单OnCreate
中创建它们并释放它们而是FormClose
;这样,当您要访问ComboBox
事件中的其余项目以填充表单的其余部分时,您将有一个部分名称列表以匹配OnClick
中的项目
var
Sections: TStringList;
Ini: TMemIniFile;
s: string;
begin
Sections := TStringList.Create;
try
Ini := TMemIniFile.Create('YourIniFile.ini');
try
Ini.ReadSections(Sections);
for s in Sections do
ComboBox1.Items.Add(Ini.ReadString(s, `PROFILE_NAME`, `Empty`);
finally
Ini.Free;
end;
finally
Sections.Free;
end;
end;
为了更容易绑定到ComboBox
中的项目,请在下面的我的代码段中声明一个新的整数变量(i
),并将for
循环更改为此(确保你没有对Sections
进行排序 - 让ComboBox
处理排序!):
for i := 0 to Sections.Count - 1 do
begin
s := Ini.ReadString(Sections[i], 'PROFILE_NAME', 'Empty');
ComboBox1.Items.AddObject(s, TObject(i));
end;
当用户单击组合框项目时再次获取部分名称:
procedure TForm1.ComboBox1Click(Sender: TObject);
var
i: Integer;
SectionName: string;
begin
// Get the Sections item index we stored above
i := Integer(ComboBox1.Items.Objects[ComboBox1.ItemIndex]));
// Get the associated Sections section name
SectionName := Sections[i];
// Use the retrieved section name to get the rest of the values
ProfileNameEdit.Text := Ini.ReadString(SectionName, 'PROFILE_NAME', '');
ProfileDataEdit.Text := Ini.ReadString(SectionName, 'PROFILE_DATA', ''); // etc
end;