Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Вопрос по TIniFile 
:(
    Опции темы
Noman
Дата 25.3.2008, 09:23 (ссылка)   | (голосов:2) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 70
Регистрация: 21.4.2007
Где: /mnt/Nowhere

Репутация: нет
Всего: нет



Коллеги, вновь обращаюсь к вам за помощью.
Для начала опишу ситуацию:
Есть приложение для своеобразной генерации теста, которое имеет 2 TMemo, TEdit и TListBox.
Данные из них заносятся в файл через TIniFile.
При этом одна TMemo - поле для ввода вопроса, другая для ввода ответов построчно, и TListBox для выбора верного ответа. После генерируется файл вида:
Код

[Qestion]
1q=текст вопроса
[Choice]
1a=вариант ответа
1b=вариант ответа
1c=вариант ответа
1d=вариант ответа
[Answer]
1=c

Вопросов может быть много, соответственно цифры в файле будут меняться и файл будет иметь вид:
Код

[Qestion]
1q=текст первого вопроса
2q=текст второго вопроса
3q=текст третьего вопроса
...
[Choice]
1a=вариант первого ответа
1b=вариант первого ответа
1c=вариант первого ответа
1d=вариант первого ответа
2a=вариант второго ответа
2b=вариант второго ответа
2c=вариант второго ответа
2d=вариант второго ответа
3a=вариант третьего ответа
3b=вариант третьего ответа
3c=вариант третьего ответа
3d=вариант третьего ответа
...
[Answer]
1=с ответ на первый вопрос
2=a ответ на второй вопрос
3=d ответ на третий вопрос
...

Так вот моя проблема в том, что если вдруг придется удалить один из вопросов, их порядковые номера нарушатся. Поэтоу я пытаюсь найти путь их автоматической перегенерации при добавлении\удалении одного из вопросов. Пока безуспешно.
Буду благодарен за любые наводящие ответы.
PM MAIL WWW ICQ   Вверх
Lazin
Дата 25.3.2008, 09:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3820
Регистрация: 11.12.2006
Где: paranoid oil empi re

Репутация: 18
Всего: 154



А зачем их каждый раз генерировать, главное чтобы номер вопроса соответствовал номеру ответа, а номера, которые видит пользователь можно уже и генерировать.
Главное, что-бы номера вопросов возрастали.
PM MAIL Skype GTalk   Вверх
korian
Дата 25.3.2008, 09:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 651
Регистрация: 8.3.2008
Где: Украина, Харьков

Репутация: 3
Всего: 17



Код

[main]
nextId=10

[Question1]
question=текст первого вопроса
answer1=вариант первого ответа
answer2=вариант второго ответа
answer=1 //правильный ответ

[Question2]
question=текст первого вопроса
answer1=вариант первого ответа
answer2=вариант второго ответа
answer=1 //правильный ответ

....

при добавлении нового вопроса:
название секции = Question<[main]:[nextId]>
[main]:[nextId] = [main]:[nextId] + 1

при удалении вопроса, удаляем всю секцию [Question<номер вопроса>]

при выводе вопросов:
выводим все существующе [Question<n>], где n=[1, [main]:[nextId])

перегенерация (хотя смысла в ней большого нету):
загружаем все вопросы, очищаем файл и сохраняем вопросы с новыми номерами.


Это сообщение отредактировал(а) korian - 25.3.2008, 09:54
PM   Вверх
UniBomb
Дата 25.3.2008, 09:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок
***
Награды: 1



Профиль
Группа: Завсегдатай
Сообщений: 1754
Регистрация: 24.10.2006
Где: Санкт-Петербург

Репутация: 3
Всего: 97



Я бы сделал это такого вида:

Цитата

[main]
qq=количество вопросов
m5=количество правильных ответов на оценку пять
/*ещё какая-нибудь информация*/


[Qestion1]
q=текст вопроса
qq=количество ответов
a1=вариант ответа
a2=вариант ответа
a3=вариант ответа
a4=вариант ответа
aa=номер првильного ответа

[Qestion2]
q=текст вопроса
qq=количество ответов
a1=вариант ответа
a2=вариант ответа
a3=вариант ответа
a4=вариант ответа
aa=номер првильного ответа

...

[Qestion89]
q=текст вопроса
qq=количество ответов
a1=вариант ответа
a2=вариант ответа
a3=вариант ответа
a4=вариант ответа
aa=номер првильного ответа



Тогда для удаления вопроса можно будет удалить удалив целую секцию и декрементировать значение qq. Плюс от этого - количество вопросов и вариантов ответов на каждый вопрос может быть абсолютно любым без потери читабельности))

Добавлено через 45 секунд
блин, korian успел раньше))
PM MAIL ICQ Skype   Вверх
korian
Дата 25.3.2008, 10:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 651
Регистрация: 8.3.2008
Где: Украина, Харьков

Репутация: 3
Всего: 17



Цитата(UniBomb @  25.3.2008,  08:55 Найти цитируемый пост)
декрементировать значение qq

это можно добавить, правда только тогда, когда номер удаляемого вопроса равен ([main]:[nextId] - 1) (является последним)

Это сообщение отредактировал(а) korian - 25.3.2008, 10:02
PM   Вверх
UniBomb
Дата 25.3.2008, 10:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок
***
Награды: 1



Профиль
Группа: Завсегдатай
Сообщений: 1754
Регистрация: 24.10.2006
Где: Санкт-Петербург

Репутация: 3
Всего: 97



я не совсем так хотел выразится.

[questionN]:[qq] - это количесвтво вопросов на данный ответ. Значение отражает реальное количетво вопросов. Если это значение равно скажем трём, то и кличество ответов три. Если ноль - то и ответов нет и можно говорить об ошибке составления файла. Точно также и с [main]:[qq]
PM MAIL ICQ Skype   Вверх
Noman
Дата 27.3.2008, 15:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 70
Регистрация: 21.4.2007
Где: /mnt/Nowhere

Репутация: нет
Всего: нет



Спасибо за ответы.
В продолжение темы, никак не удается получить данные по выбору секций и подсекций:
То есть, имеется TListBox в количестве 2-х штук, TMemo и TComboBox.
Сам код собственно такой (я знаю, что он не верный, но мне никак не удается найти нужное решение):
Код

//---------------------------------------------------------------------------

#include <vcl.h>
#include <IniFiles.hpp>
#pragma hdrstop

#include "Main.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma link "CSPIN"
#pragma resource "*.dfm"
TForm1 *Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
        : TForm(Owner)
{
}
//---------------------------------------------------------------------------


void __fastcall TForm1::FormCreate(TObject *Sender)
{
ComboBox1->Items = FileListBox1->Items;
}
//---------------------------------------------------------------------------


void __fastcall TForm1::ComboBox1Change(TObject *Sender)
{
TIniFile *read = new TIniFile( ExtractFilePath( Application->ExeName ) + ComboBox1->Items->Strings[ComboBox1->ItemIndex] );
read->ReadSections(ListBox1->Items);
delete read;        
}
//---------------------------------------------------------------------------

void __fastcall TForm1::ListBox1Click(TObject *Sender)
{

for (int i=0; i < ListBox1->Items->Count; i++)
{
TIniFile *read = new TIniFile( ExtractFilePath( Application->ExeName ) + ComboBox1->Items->Strings[ComboBox1->ItemIndex] );
read->ReadSection(ListBox1->Items->Strings[i], ListBox2->Items);
delete read;
}

}


То есть при запуске программы в TComboBox выбирается, какой именно нужен файл, после его выбора все его секции отображаются в TListBox1. Проблема в том, что я не могу найти решения, для того чтобы при выборе секции в TListBox1, в TListBox2 отображались ее подсекции, и соответственно при выборе подсекции, значение выводилось в TMemo.
Мне кажется, что делать надо все-таки через цикл, но мой вариант просто моментально пробегает все варианты, и останавливается на последнем.

Добавлено через 4 минуты и 19 секунд
То есть основной вопрос заключается в том, как узнать, какая секция выделена в данный момент.
PM MAIL WWW ICQ   Вверх
Noman
Дата 27.3.2008, 16:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 70
Регистрация: 21.4.2007
Где: /mnt/Nowhere

Репутация: нет
Всего: нет



Вроде вышел из положения:

Код

void __fastcall TForm1::ListBox1Click(TObject *Sender)
{

for (int i = ListBox1->Items->Count-1; i >= 0 ; i--)
{

if (ListBox1->Selected[i])
{
TIniFile *read = new TIniFile( ExtractFilePath( Application->ExeName ) + ComboBox1->Items->Strings[ComboBox1->ItemIndex] );
read->ReadSection(ListBox1->Items->Strings[i], ListBox2->Items);
delete read;
}
}
}


Это сообщение отредактировал(а) Noman - 27.3.2008, 16:21
PM MAIL WWW ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++ Builder"
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по С++ Builder обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Настоятельно рекомендуем заглянуть в DRKB (Delphi Russian Knowledge Base) - крупнейший в рунете сборник материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Rrader.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C++ Builder | Следующая тема »


 




[ Время генерации скрипта: 0.0489 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.