我目前正在尝试创建一个“配置文件管理器”,使用TIniFile来存储数据,并在表单上的不同组件(编辑框等)中显示数据。
在表单上,我有一个组合框。这用作显示用户设置的“配置文件名称”的一种方式。
数据以每个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“的人来说,它的特点类似于我试图用它的”服务器和用户管理器“实现的功能。它的最小布局非常相似,我能找到的唯一区别是它有一个"USER_COUNT“值,引用了添加了多少用户。每个用户都有分配给他们的服务器,而不是每个用户都可以访问服务器。
我有可能做到这一点吗?
发布于 2012-01-01 07:04:07
您必须使用TIniFile.ReadSections来获取所有部分名称的列表,然后可以遍历它们并从每个部分读取单独的PROFILE_NAME。(我更喜欢TMemIniFile,因为TIniFile直接基于WinAPI函数,在尝试使用新值更新时,有时会在网络驱动器上出现问题。当您使用XE2时,TMemIniFile也可以跨平台工作。)
我正在创建TMemIniFile和TStringList并释放它们,但是如果您重复使用它们,您可能希望在表单的OnCreate中创建它们,并在FormClose中释放它们;这样,当您想要访问OnClick事件中的其余项以填充表单的其余部分时,您将有一个区段名称列表,以便与ComboBox中的项相匹配。
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;https://stackoverflow.com/questions/8690948
复制相似问题