Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/delphi/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Delphi 配置文件管理器,带有组合框和文件_Delphi_Delphi 2010 - Fatal编程技术网

Delphi 配置文件管理器,带有组合框和文件

Delphi 配置文件管理器,带有组合框和文件,delphi,delphi-2010,Delphi,Delphi 2010,我目前正在尝试创建一个“概要文件管理器”,使用一个文件来存储数据,并在表单(EditBox等)的各个组件中显示数据 在表格上,我有一个组合框。这是显示用户设置的“配置文件名称”的一种方式 数据以每个文件节1个配置文件的格式存储。每个部分包含1个配置文件的配置数据,包括配置文件名称。配置文件名称键在每个部分中都是相同的。这是我目前在INI文件中得到的布局(作为示例) 我想做的是将一个包含所有值的列表加载到一个组合框中,不管它们位于哪个部分。节名称本身是添加数据时对组合框中itemindex的引用

我目前正在尝试创建一个“概要文件管理器”,使用一个文件来存储数据,并在表单(EditBox等)的各个组件中显示数据

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

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

我想做的是将一个包含所有值的列表加载到一个组合框中,不管它们位于哪个部分。节名称本身是添加数据时对组合框中itemindex的引用

从那里,我可以处理将其他数据加载到相关字段中的问题,但是我在弄清楚如何将“PROFILE\u NAME”值加载到组合框中时遇到了问题。有什么想法吗

对于那些熟悉语音通信程序“Ventrilo”的人来说,它的特点与我试图用它的“服务器和用户管理器”实现的功能类似。它的文件布局非常相似,我能找到的唯一区别是它有一个“USER\u COUNT”值,表示添加了多少用户。每个用户都有分配给他们的服务器,而不是每个用户都可以访问的服务器


我能做到这一点吗?

您必须使用
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;