首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用组合框和TIniFile的配置文件管理器

使用组合框和TIniFile的配置文件管理器
EN

Stack Overflow用户
提问于 2012-01-01 06:47:29
回答 1查看 878关注 0票数 1

我目前正在尝试创建一个“配置文件管理器”,使用TIniFile来存储数据,并在表单上的不同组件(编辑框等)中显示数据。

在表单上,我有一个组合框。这用作显示用户设置的“配置文件名称”的一种方式。

数据以每个inifile区段1个配置文件的格式存储。每个部分包含1个配置文件的配置数据,包括配置文件名称。配置文件名称键在每个部分中都是相同的。这是我目前在inifile中得到的布局类型(作为示例);

代码语言:javascript
复制
[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“值,引用了添加了多少用户。每个用户都有分配给他们的服务器,而不是每个用户都可以访问服务器。

我有可能做到这一点吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-01-01 07:04:07

您必须使用TIniFile.ReadSections来获取所有部分名称的列表,然后可以遍历它们并从每个部分读取单独的PROFILE_NAME。(我更喜欢TMemIniFile,因为TIniFile直接基于WinAPI函数,在尝试使用新值更新时,有时会在网络驱动器上出现问题。当您使用XE2时,TMemIniFile也可以跨平台工作。)

我正在创建TMemIniFileTStringList并释放它们,但是如果您重复使用它们,您可能希望在表单的OnCreate中创建它们,并在FormClose中释放它们;这样,当您想要访问OnClick事件中的其余项以填充表单的其余部分时,您将有一个区段名称列表,以便与ComboBox中的项相匹配。

代码语言:javascript
复制
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处理排序!):

代码语言:javascript
复制
for i := 0 to Sections.Count - 1 do
begin
  s := Ini.ReadString(Sections[i], 'PROFILE_NAME', 'Empty');
  ComboBox1.Items.AddObject(s, TObject(i));
end;

要在用户单击组合框项时再次获取节名,请执行以下操作:

代码语言:javascript
复制
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;
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8690948

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档