Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Закрытая тема
Ваша тема закрыта, почему это могло произойти? Возможно,
Нет наработок или кода, если нужно готовое решение - создайте тему в разделе Фриланс и оплатите работу.
Название темы включает слова - "Помогите", "Нужна помощь", "Срочно", "Пожалуйста".
Название темы слишком короткое или не отражает сути вашего вопроса.
Тема исчерпала себя, помните, один вопрос - одна тема
Прочитайте правила и заново правильно создайте тему.
 
Опции темы Поиск в этой теме
Старый 02.01.2016, 14:58   #1
Shouldercannon
Участник клуба Подтвердите свой е-майл
 
Аватар для Shouldercannon
 
Регистрация: 26.01.2008
Сообщений: 1,897
Вопрос Получить все значения из секций INI-файла

Доброго времени суток!
Есть INI-файл:
Код HTML:
[MenuItem1]
MenuItemCaption=System
SubMenuItemCaption1=Reg
SubMenuItemCaption2=Policies
[MenuItem2]
MenuItemCaption=Debug
SubMenuItemCaption1=Ping
SubMenuItemCaption2=Cmd
Пытаюсь считать всё содержимое в ListBox
Код:
var
  SL: TStringList;
  INIFile: TINIFile;
  I: Integer;
begin
  SL := TStringList.Create;
  INIFile := TINIFile.Create(ExtractFilePath(Application.ExeName) + ExtensionsFile);
  INIFile.ReadSections(SL);

  for I := 0 to SL.Count - 1 do
  begin
    INIFile.ReadSectionValues(SL.Strings[I], ListBox1.Items);
  end;

  FreeAndNil(SL);
  FreeAndNil(INIFile);
end;
На выходе получаю значения только последней секции.
Код:
MenuItemCaption=Debug
SubMenuItemCaption1=Ping
SubMenuItemCaption2=Cmd
Shouldercannon вне форума
Старый 02.01.2016, 15:02   #2
come-on
Участник клуба
 
Регистрация: 21.10.2015
Сообщений: 1,361
По умолчанию

А вы чего ждали, чуда?
про то что чуда не будет написано в описании метода ReadSectionValues
come-on вне форума
Старый 02.01.2016, 16:14   #3
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
Пытаюсь считать всё содержимое в ListBox
Все содержимое наверное лучше через StringList читать.
I'm learning to live...
Stilet вне форума
Старый 02.01.2016, 18:54   #4
Vapaamies
Ваш К. О.
Участник клуба
 
Аватар для Vapaamies
 
Регистрация: 26.12.2012
Сообщений: 1,777
По умолчанию

Пытаемся вытащить тему на конструктив...

Цитата:
Сообщение от Shouldercannon Посмотреть сообщение
На выходе получаю значения только последней секции.
ReadSectionValues очищает переданный ей StringList перед заполнением. Если нужны значения нескольких секций, читать их в цикле в отдельный StringList, а потом добавлять через ListBox.Items.AddStrings.

А вообще-то да, можно было подумать и о такой простой вещи догадаться самостоятельно.
Vapaamies вне форума
Старый 03.01.2016, 03:42   #5
min@y™
Цифровой кот
Старожил
 
Аватар для min@y™
 
Регистрация: 29.08.2014
Сообщений: 7,629
По умолчанию

Цитата:
А вообще-то да, можно было подумать и о такой простой вещи догадаться самостоятельно.
А если залезть в IniFiles.pas, то и догадываться не придётся.
Код:
procedure TIniFile.ReadSectionValues(const Section: string; Strings: TStrings);
var
  KeyList: TStringList;
  I: Integer;
begin
  KeyList := TStringList.Create;
  try
    ReadSection(Section, KeyList);
    Strings.BeginUpdate;
    try
      Strings.Clear; // <-------------------------------- just look that
      for I := 0 to KeyList.Count - 1 do
        Strings.Add(KeyList[I] + '=' + ReadString(Section, KeyList[I], ''))
    finally
      Strings.EndUpdate;
    end;
  finally
    KeyList.Free;
  end;
end;
Если подобную задачу поставили перед таким извращенцем-перфекционистом, как я, то он бы написал потомка с методами, типа:
Код:
procedure TMyIniFileEx.ReadAllSectionValues(Strings: TStrings);
procedure TMyIniFileEx.ReadWildCardSectionValues(const SectWildCard: string; Strings: TStrings);
// + ещё 3-5-10 всяких ненужных вещей :)
Расскажу я вам, дружочки, как выращивать грибочки: нужно в поле утром рано сдвинуть два куска урана...
min@y™ вне форума
Старый 03.01.2016, 19:34   #6
kropotkina-alice
Форумчанин
 
Аватар для kropotkina-alice
 
Регистрация: 27.10.2014
Сообщений: 594
По умолчанию

Цитата:
Сообщение от Shouldercannon Посмотреть сообщение
Доброго времени суток!
Есть INI-файл.
Пытаюсь считать всё содержимое в ListBox
На выходе получаю значения только последней секции.
Цитата:
Сообщение от Vapaamies Посмотреть сообщение
ReadSectionValues очищает переданный ей StringList перед заполнением. Если нужны значения нескольких секций, читать их в цикле в отдельный StringList, а потом добавлять через ListBox.Items.AddStrings.
Откуда такая склонность к извращениям?
Я бы сделала так:
Код:
procedure TForm1.Button1Click(Sender: TObject);
begin
ListBox1.Items.LoadFromFile('my_ini_file.ini');
end;

Последний раз редактировалось kropotkina-alice; 03.01.2016 в 19:38.
kropotkina-alice вне форума
Старый 03.01.2016, 23:45   #7
min@y™
Цифровой кот
Старожил
 
Аватар для min@y™
 
Регистрация: 29.08.2014
Сообщений: 7,629
По умолчанию

Так, Алисе больше не наливать!
Расскажу я вам, дружочки, как выращивать грибочки: нужно в поле утром рано сдвинуть два куска урана...
min@y™ вне форума
Старый 04.01.2016, 02:23   #8
Vapaamies
Ваш К. О.
Участник клуба
 
Аватар для Vapaamies
 
Регистрация: 26.12.2012
Сообщений: 1,777
По умолчанию

Цитата:
Сообщение от kropotkina-alice Посмотреть сообщение
Откуда такая склонность к извращениям?
Я бы сделала так:
Код:
procedure TForm1.Button1Click(Sender: TObject);
begin
ListBox1.Items.LoadFromFile('my_ini_file.ini');
end;
И это будет неправильно. Склеенные в один список значения нескольких секций не есть содержимое ini-файла. Различие, как минимум, в строчках с именами секций.
Vapaamies вне форума
Старый 04.01.2016, 02:37   #9
kropotkina-alice
Форумчанин
 
Аватар для kropotkina-alice
 
Регистрация: 27.10.2014
Сообщений: 594
По умолчанию

Цитата:
Сообщение от Vapaamies Посмотреть сообщение
Склеенные в один список значения нескольких секций не есть содержимое ini-файла. Различие, как минимум, в строчках с именами секций.
Я на зрение не жалуюсь и видимо поэтому прекрасно вижу названия всех трех секций (это копия содержимого листбокса):
Цитата:
[Init]
LastNode=613
Sound=0
Multi=0
NotShow=0
BaseName=База вопросов и ответов по Delphi
TrayName=База данных
[Init1]
LastNode=613
Sound=0
Multi=0
NotShow=0
BaseName=База вопросов и ответов по Delphi
TrayName=База данных
[Init2]
LastNode=613
Sound=0
Multi=0
NotShow=0
BaseName=База вопросов и ответов по Delphi
TrayName=База данных
А у вас, судя по всему, проблемы со зрением?
Так я их специально для вас выделила.
Теперь видны?

Последний раз редактировалось kropotkina-alice; 04.01.2016 в 02:44.
kropotkina-alice вне форума
Старый 05.01.2016, 20:26   #10
FaTaL
Участник клуба
 
Аватар для FaTaL
 
Регистрация: 09.11.2007
Сообщений: 1,761
По умолчанию

Алиса, перечитайте ещё раз, что хочет ТС.
FaTaL вне форума
Закрытая тема


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Выведение всех имен секций INI файла в Listbox - Delphi chiko666111 Общие вопросы Delphi 1 02.08.2015 09:38
ini файлы.узнать количество секций. Vervolf Общие вопросы Delphi 7 22.01.2011 18:15
Имена всех секций всех ini-файлов (DELPHI) Dj_SheLL Помощь студентам 7 10.10.2010 17:44
Чтение данных из секций ini выборочно из ListBox Человек_Борща Общие вопросы Delphi 2 09.04.2010 16:19
Как можно извлечь все имена разделов Ini файла в юникоде? SkAndrew Общие вопросы Delphi 5 11.06.2009 09:03