配置文件管理器与Combobox和TIniFile

时间:2011-12-31 22:47:29

标签: delphi delphi-2010

我目前正在尝试创建一个" 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"值引用已添加的用户数。每个用户都分配了服务器,而不是每个用户都可以访问的服务器。

我有可能实现这个目标吗?

1 个答案:

答案 0 :(得分:2)

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

我正在创建TMemIniFileTStringList并释放它们,但如果您反复使用它们,您可能希望在表单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;