Диспетчер профилей с помощью Combobox и TIniFile - PullRequest
1 голос
/ 01 января 2012

В настоящее время я пытаюсь создать «Диспетчер профилей», используя TIniFile для хранения данных и отображения данных в различных компонентах формы (поля ввода и т. Д.).

В форме у меня есть Combobox. Это служит способом отображения «имени профиля», установленного пользователем.

Данные хранятся в формате 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 Ответ

2 голосов
/ 01 января 2012

Вы должны использовать TIniFile.ReadSections, чтобы получить список всех названий разделов, а затем вы можете просмотреть их и прочитать отдельные PROFILE_NAME из каждого из этих разделов.(Я предпочитаю TMemIniFile, так как TIniFile основан на функциях WinAPI напрямую и иногда имеет проблемы с сетевыми дисками при попытке обновления с новыми значениями. TMemIniFile также работает кроссплатформенно, когда вы получаете XE2.)

Я создаю TMemIniFile и TStringList и освобождаю их, но если вы используете их несколько раз, вы, вероятно, захотите создать их в 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;
...