Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Для новичков > Работа с ini-файлами. Количество секций


Автор: PsiMagistr 26.12.2010, 10:15
Ребята, проблема такая:

Есть некоторый список. В список должны прогружаться названия секций из ини файла, но не всех подряд секций, а только тех, чей определенный ключ (поле) удовлетворяет некоторому значению.

Как можно это грамотно осуществить?

Если узнать количество всех секций, можно попробовать цикл замутить, например, и там проверять... Но функцию, возвращающую кол. секций я не нашел...

Всех сердечно благодарю за помощь.




Автор: ~FoX~ 26.12.2010, 11:03
ReadSections ?

Автор: PsiMagistr 26.12.2010, 11:17
~FoX~, Благодарю сердечно, ReadSections неоднократно пользовался, но он вроде читает все поля.

Конечно, можно прочесть все. потом сделать выборку, сравнительным путем. Но хотелось бы как-то поизящнее....

Или это единственный путь?

Автор: ~FoX~ 26.12.2010, 11:55
Цитата(PsiMagistr @  26.12.2010,  12:17 Найти цитируемый пост)
но он вроде читает все поля.

Помещает в StringList названия всех секций...Априори, нельзя получить выборку по условию не проверив все данные. Не попадающие под условие/я секции удаляешь из листа и в конечном итоге получишь нужную выборку...
Куда уж изящнее то?  smile 

Автор: PsiMagistr 26.12.2010, 12:04
Спасибо большое. Ну что ж так и будем действовать.

Автор: PsiMagistr 26.12.2010, 17:36
Пришлось воспользоваться вложенным циклом. Довольно неизящное решение...

Код


procedure LoadToList(Filename:string; L:TListBox);
 var
 F:TiniFile; //Переменая для работы с инифайлом
 i:Integer; i2:integer;//Переменные циклов

 begin

 F:= Tinifile.Create(Filename);//Создаем фапйловый объект.
 F.ReadSections(L.Items);//Читаем туда все секции в выходной список (расположен на форме).


 for i:=  0 to L.Count -1 do//Открываем внешний  цикл
 begin//


 for i2 := 0 to L.Count -1 do//Открываем внутренний цикл

 begin//
 Monst.Location:= F.ReadInteger(L.Items.Strings[i2],'Локация',100);// Читаем в опознавательную переменную
 if Monst.Location <> Pers.Location then//Если она не удовлетворяет условию

 begin//
L.Items.Delete(i2);//Удаляем элемент
break;//Прерываем внутренний цикл
 end;//
  end;//
 end;//

 F.Free;//Освобождаем файловый объект
 end;//



Минусы очевидны - вложенные циклы.


Пробовал писать в один цикл, но поскольку удаляются элементы возникает смещение...

Автор: Dom 26.12.2010, 18:27
Подозреваю, что тут поможет вариант обхода списка с конца, и будет только один цикл
Код

for i :=  L.Count - 1 downto 0 do
begin
...
end;

Автор: PsiMagistr 26.12.2010, 18:57
Dom, Ай да хитрец! С конца надо точно.

Спасибо!

Все еще не оставляю надежды написать игрушку.)))

Как только сделаю, попробую прислать на вингард опытный образец.

Автор: ~FoX~ 26.12.2010, 20:08
Цитата(PsiMagistr @  26.12.2010,  19:57 Найти цитируемый пост)
Все еще не оставляю надежды написать игрушку.)))

Эгм....игрушку? А чего ты в инях хранишь? 

Автор: Akella 26.12.2010, 21:29
ini это ж долго.... тогда уж реестр или СУБД

Автор: AntonN 26.12.2010, 21:51
Я храню в ини формат карты, все доступно для редактирования в обычном блокноте. 10 секций общих параметров (до 10-15 ключей в каждой) и в зависимости от карты от 20 до двух сотен секций с полудесятком параметров. TMemIniFile и никаких напрягов.

Автор: PsiMagistr 27.12.2010, 09:44
Ребята, боюсь это игра еще далеко  не того профиля, чтобы использовать СУБД или тем более Реджестри.

Сейчас дам ссылочку на исходник (хотел сюда, но он велик).

Само собой еще почти ничего не работает.

Имейте ввиду у меня Дельфи Хе.

6 метров веса исходники и скомпилированный проект.

http://ifolder.ru/21037793



Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)