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

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

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

Восстановить пароль

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

Ответ
 
Опции темы Поиск в этой теме
Старый 22.04.2011, 15:49   #1
Frustrator
Пользователь
 
Регистрация: 12.04.2011
Сообщений: 11
По умолчанию ini - мозгоубивание

Вот зачем я связался с ini-файлами????
Второй день не могу управиться с задачей чистки секций.

К примеру имею такой ини:


[Name]
Short=Социалка
long=Опрос о социальном положении семей
[Options]
Вопросов=5
[Вопрос 1]
Type=0
Question=Вас устраивает ваше семейное благосостояние?
1-=да
2-=нет
[Вопрос 2]
Type=1
Question=Как бы Вы оценили уровень материального положения Вашей семьи
1-=живем вполне обеспеченно
2-=достаток выше среднего
3-=средняя обеспеченность
[Вопрос 3]
Type=5
Question=Укажите примерный размер денежного дохода, пришедшийся на одного члена Вашей семьи в прошлом месяце (в рублях)
[Вопрос 4]
Type=0
Question=Ваш пол
1-=м
2-=ж
[Вопрос 5]
Type=5
Question=Ваш возраст (укажите число полных лет)



Ини создаю в своей оболочке, и в процессе создания опроса может возникнуть потребность удалить вопрос.
Соответственно нужно почистить ини.
Стереть вопрос под номером Н, и сдвинуть все остальные.
КАК????
Frustrator вне форума Ответить с цитированием
Старый 22.04.2011, 15:56   #2
mss
Заблокирован
 
Регистрация: 27.05.2010
Сообщений: 1,099
По умолчанию

Прочитай секцию в стринглист, удали нужную строку и запиши стринглист на место
mss вне форума Ответить с цитированием
Старый 22.04.2011, 16:24   #3
Frustrator
Пользователь
 
Регистрация: 12.04.2011
Сообщений: 11
По умолчанию

Забыл дописать в чем основная проблема:
Удалить секцию не сложно - команда EraseSection.
Задача - как восстановить порядок вопросов, не забывая, что секции разного формата в зависимости от type?

Чувствую задача нереальная
Frustrator вне форума Ответить с цитированием
Старый 22.04.2011, 16:48   #4
FaTaL
Участник клуба
 
Аватар для FaTaL
 
Регистрация: 09.11.2007
Сообщений: 1,762
По умолчанию

Можно узнать, зачем восстанавливать порядок вопросов?
FaTaL вне форума Ответить с цитированием
Старый 22.04.2011, 17:01   #5
Frustrator
Пользователь
 
Регистрация: 12.04.2011
Сообщений: 11
По умолчанию

Чтобы вызывать их поочередно:
redaktor.Edit4.Text:=AppIni.ReadStr ing('Вопрос '+ inttostr(Q),'1-', redaktor.Edit4.Text);

Если будет отсутствовать секция, то начнутьсь проблемы с переходами м/у вопросами.

Может подскажите другой удобный инструмент для работы с данными?
(я с делфи 3й день общаюсь)
Frustrator вне форума Ответить с цитированием
Старый 22.04.2011, 17:06   #6
Frustrator
Пользователь
 
Регистрация: 12.04.2011
Сообщений: 11
По умолчанию

Вот, что у меня получается.

Вот чувствую, что с ини я не туда полез...
Вложения
Тип файла: rar arj.rar (279.4 Кб, 6 просмотров)
Frustrator вне форума Ответить с цитированием
Старый 22.04.2011, 17:17   #7
Smitt&Wesson
Старожил
 
Аватар для Smitt&Wesson
 
Регистрация: 31.05.2010
Сообщений: 13,543
По умолчанию

Цитата:
Сообщение от Frustrator Посмотреть сообщение
Вот, что у меня получается.

Вот чувствую, что с ини я не туда полез...
Совершенно верно. Ini файлы не предназначены для таких задач.
Такие задачи решаються при помощи XML-документов.
Этот формат специально предназначен для записи документов разной размерности, формата и вложенности в одном файле.
Вот пример вашего файла в XML.
Код:
<Name Short="Социалка" long="Опрос о социальном положении семей">
	<Options Вопросов="5">
		<Вопрос Type="0" Question="Вас устраивает ваше семейное благосостояние?">
			<Ответ 1="Да" 2="Нет"/>
		</Вопрос>
		<Вопрос Type="1" Question="Как бы Вы оценили уровень материального положения Вашей семьи"/>
			<Ответ 1="живем вполне обеспеченно" 2="достаток выше среднего" 3="средняя обеспеченность"/>
		</Вопрос>
		<Вопрос Type="5" Question="Укажите примерный размер денежного дохода, пришедшийся на одного члена Вашей семьи в прошлом месяце (в рублях)"/>
			<Ответ 1="Доход - "/>
		</Вопрос>
		<Вопрос Type="0" Question="Ваш пол">
			<Ответ 1="м" 2="ж"/>
		</Вопрос>
		<Вопрос Type="5" Question="Ваш возраст (укажите число полных лет)"
			<Ответ 1="Число лет - "/>
                </Вопрос>
	</Options>
</Name>
Если Вы знаете структуру своего файла, вам даже парсер не нужен. Всё решается через TStringList.
Пиши пьяным, редактируй трезвым.
Справочник по алгоритмам С++ Builder

Последний раз редактировалось Smitt&Wesson; 22.04.2011 в 20:55.
Smitt&Wesson вне форума Ответить с цитированием
Старый 22.04.2011, 17:30   #8
Человек_Борща
Старожил
 
Аватар для Человек_Борща
 
Регистрация: 30.12.2009
Сообщений: 11,434
По умолчанию

хм, да ведь и с ini все mega-просто...

Все что надо это счётчик и бесконечный цикл.
смотри..
Код:
procedure Load;
var
  i: Integer;
begin
  ini := TIniFile.Create(GetDataDir + IniErr_Name);
  try
    i := 0;
    while True do
    begin
      if Ini.SectionExists('Вопрос №'+IntToStr(i)) then
      begin
         //Читаем секцию...
         Ini.ReadString('Вопрос №'+IntToStr(i),параметр,значение)
      end
      else
        Break;  //иначе пропуск интерации
      Inc(i);   //увеличение счётчика на 1
    end;
  finally
    ini.Free;
  end;
end;
Человек_Борща вне форума Ответить с цитированием
Старый 22.04.2011, 17:52   #9
phomm
personality
Старожил
 
Аватар для phomm
 
Регистрация: 28.04.2009
Сообщений: 2,899
По умолчанию

Вариант , предложенный Человеком_Борща имеет как преимущества, так и недостатки. плюс - закодил и забыл, минус - не так вписал номер вопроса ил захотел что-то помеять - огреб много гемороя с перенумеровкой остального.

Как делаю я - завожу в "глобальной" секции (которая точно наличествует, у тебя это ) такой список величин и секций:
Код:
количествовопросов=Н
вопрос1=нужное_нам_имя1
вопрос2=нужное_нам_имя2
...
вопросН=нужное_нам_имяН
...
[нужное_нам_имя1]
всё что хотим
...
[нужное_нам_имяН]
ещё всякая инфа
и оперируем не секциями ини файлов, а неким массивов/списком реальных "наименований" вопросов (те, которые нужное_нам_имя#) и не мучаемся, они, скорее всего внутри записи(record), в которых все остальные данные по вопросу есть. и для удаления нужного вопроса оперируем как обычно для массива/листа

А вот при записи в инишку узнаем реальное количество вопросов, и прописываем в "глобальную" секцию их "наименования" и в цикле для каждого такого вопроса создаем секцию.

Таким образом, имеем подобие древовидной структуры, когда имена секций прописываются в параметрах других секций, считываем имена и потом считываем из секций, названных этими именами

И совет - в любом случае, код работы с инишкой лучше отделать от кода работы с записями/классами вопроса, удаляете в одном месте(классе/массиве/листе) и потом дампите(в инишку), независимо от того было ли что-то удалено или нет. пишите независимый код

Последний раз редактировалось phomm; 22.04.2011 в 18:09.
phomm вне форума Ответить с цитированием
Старый 22.04.2011, 19:52   #10
Frustrator
Пользователь
 
Регистрация: 12.04.2011
Сообщений: 11
По умолчанию

Цитата:
Сообщение от Человек_Борща Посмотреть сообщение
хм, да ведь и с ini все mega-просто...

Все что надо это счётчик и бесконечный цикл.
смотри..
В общем победил я ini-шки, примерно по такому принципу, но конструкция более громоздкая(с учетом разных типов и размеров ответов)
Всем спасибо за помощь..
Frustrator вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Как пересмотреть все секции в INI.ini ? iskurt Помощь студентам 1 31.01.2010 07:48
INI Яр|/||< (^_^) Общие вопросы Delphi 2 13.10.2009 16:53
ini Файл Volkogriz Общие вопросы Delphi 1 12.11.2008 13:44
*.INI Mustang Общие вопросы Delphi 16 09.10.2007 02:33