Delphi 配置文件管理器,带有组合框和文件
我目前正在尝试创建一个“概要文件管理器”,使用一个文件来存储数据,并在表单(EditBox等)的各个组件中显示数据 在表格上,我有一个组合框。这是显示用户设置的“配置文件名称”的一种方式 数据以每个文件节1个配置文件的格式存储。每个部分包含1个配置文件的配置数据,包括配置文件名称。配置文件名称键在每个部分中都是相同的。这是我目前在INI文件中得到的布局(作为示例) 我想做的是将一个包含所有值的列表加载到一个组合框中,不管它们位于哪个部分。节名称本身是添加数据时对组合框中itemindex的引用 从那里,我可以处理将其他数据加载到相关字段中的问题,但是我在弄清楚如何将“PROFILE\u NAME”值加载到组合框中时遇到了问题。有什么想法吗 对于那些熟悉语音通信程序“Ventrilo”的人来说,它的特点与我试图用它的“服务器和用户管理器”实现的功能类似。它的文件布局非常相似,我能找到的唯一区别是它有一个“USER\u COUNT”值,表示添加了多少用户。每个用户都有分配给他们的服务器,而不是每个用户都可以访问的服务器Delphi 配置文件管理器,带有组合框和文件,delphi,delphi-2010,Delphi,Delphi 2010,我目前正在尝试创建一个“概要文件管理器”,使用一个文件来存储数据,并在表单(EditBox等)的各个组件中显示数据 在表格上,我有一个组合框。这是显示用户设置的“配置文件名称”的一种方式 数据以每个文件节1个配置文件的格式存储。每个部分包含1个配置文件的配置数据,包括配置文件名称。配置文件名称键在每个部分中都是相同的。这是我目前在INI文件中得到的布局(作为示例) 我想做的是将一个包含所有值的列表加载到一个组合框中,不管它们位于哪个部分。节名称本身是添加数据时对组合框中itemindex的引用
我能做到这一点吗?您必须使用
TIniFile.ReadSections
来获取所有节名的列表,然后您可以循环浏览它们,并从每个节中读取个人的配置文件名称。(我更喜欢TMemIniFile
,因为tinibile
直接基于WinAPI函数,在尝试使用新值更新时,网络驱动器有时会出现问题。TMemIniFile
在到达XE2
时也可以跨平台工作)
我正在创建TMemIniFile
和TStringList
并释放它们,但是如果您重复使用它们,您可能希望在表单的OnCreate
中创建它们,并在FormClose
中释放它们;这样,当您想要访问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;
为了更容易地绑定到组合框中的项目,请声明一个新的整数变量(i
,在下面的代码片段中),并将for
循环更改为该循环(确保不对节进行排序-组合框处理排序!):
要在用户单击组合框项目时再次获取节名,请执行以下操作:
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;
谢谢你,肯!这段代码几乎可以完美地工作,并且可以完美地加载细节!这仅仅取决于我更改了我的其他代码的一小部分,因此它使用PROFILE\u NAME
作为节名。但是,对于将来偶然发现这一点的其他人来说,它是否可能在组合框中显示PROFILE\u NAME
作为项目名称(使用使用整数的替换循环)?我仍然对此表示接受,因为代码本身没有问题,而且解释非常好!哎呀!我的错误。修正了代码来做这件事(这是我第一次打算做的)。
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;