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

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

Вернуться   Форум программистов > Delphi программирование > БД в Delphi
Регистрация

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 27.05.2011, 20:15   #1
Trikster
Пользователь
 
Аватар для Trikster
 
Регистрация: 11.02.2011
Сообщений: 31
Вопрос Тест. Проблема с CheckListBox

БД в Access, связь с БД через ADO.
В БД хранятся вопросы к тесту и ответы на них. Существует три типа вопросов(1 правильный (RadioGroup), несколько правильных (CheckListBox), ответ -строка (Edit)). Ответы в БД типа string.
Подскажите как обработать случай когда несколько правильных ответов, т.е как проверить отмеченные в CheckListBox'е строчки с номерами правильных ответов.
ПРИМЕР: Правильный ответ: 1 3 4 (БД), значит в CheckListBox должны быть отмечены 0,2,3 строчки.
Как это сделать???

Моя функция проверки правильности ответа:
Код:
function true_answer(q_type:integer; q_answer:string):boolean;
var iIndex:Integer;
begin
with Main do
begin
Button3.Enabled:=true;
Case q_type of
    1: begin
         If RadioGroup1.ItemIndex=-1
          then ShowMessage('Вы не ответили на вопрос')
          else if RadioGroup1.ItemIndex=strtoint(q_answer)-1
            then true_answer:=true;
       end;
    2: begin
       if CheckListBox1.ItemIndex=-1
          then ShowMessage('Вы не ответили на вопрос')
          else if CheckListBox1.ItemIndex=strtoint(q_answer)-1
                then  true_answer:=true;
       end;
    3: begin
         if Edit1.Text =''
          then ShowMessage('Вы не ответили на вопрос')
          else if Edit1.Text=q_answer then true_answer:=true;
       end;
    end;
end;

end;
Trikster вне форума Ответить с цитированием
Старый 27.05.2011, 21:32   #2
Прик
Форумчанин
 
Регистрация: 08.09.2010
Сообщений: 880
По умолчанию

Без дополнительного параметра, через который передаются правильные ответы, скорее всего, не обойтись.
Код:
function true_answer(q_type:integer; q_answer:string; A: array of integer):boolean;
var I:Integer;
begin
with Main do
begin
Button3.Enabled:=true;
Case q_type of
  ...
    2: begin
         Result := True;
         for I := 0 to High(A) do
           if not CheckListBox1.Checked[A[I]-1] then begin
             Result := False;
             break;
           end;
         end;
  ...
end;
Прик вне форума Ответить с цитированием
Старый 27.05.2011, 21:39   #3
Trikster
Пользователь
 
Аватар для Trikster
 
Регистрация: 11.02.2011
Сообщений: 31
По умолчанию

А можете еще на словах описать?) я не уверен что до конца понял алгоритм(
Trikster вне форума Ответить с цитированием
Старый 27.05.2011, 21:55   #4
Прик
Форумчанин
 
Регистрация: 08.09.2010
Сообщений: 880
По умолчанию

"А" - параметр, динамический массив, в котором содержаться номера правильных ответов. К примеру, ([2, 4, 5]).
Не ясно в каком виде правильные ответы хранятся в БД, поэтому конкретно как массив "зарядить" пояснить не получится.
В цикле проверяется соответствие отмеченных элементов чеклистбокса значениям в массиве. Если хотя бы один из этих элементов не отмечен, то функция возвращает False.
Прик вне форума Ответить с цитированием
Старый 27.05.2011, 21:59   #5
Trikster
Пользователь
 
Аватар для Trikster
 
Регистрация: 11.02.2011
Сообщений: 31
По умолчанию

Не отмечен хотя бы один элемент индекс которого равен (значению в массиве-1), верно? а строка в бд так и хранится: 1 2 или 2 3 4 ну и т.п. или вы имели ввиду неупорядоченное хранение типа 2 1 4 или 3 2 4 к примеру?
Trikster вне форума Ответить с цитированием
Старый 27.05.2011, 22:06   #6
Прик
Форумчанин
 
Регистрация: 08.09.2010
Сообщений: 880
По умолчанию

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

Если бы ответы хранились в БД в виде: "1,3", т.е. номера через запятую, то было бы проще соорудить массив.
Прик вне форума Ответить с цитированием
Старый 27.05.2011, 22:08   #7
Trikster
Пользователь
 
Аватар для Trikster
 
Регистрация: 11.02.2011
Сообщений: 31
По умолчанию

Т.е через функции работы со строками типа pos()? тогда не вижу разницы проверять на пробел или на запятую.
Trikster вне форума Ответить с цитированием
Старый 27.05.2011, 22:15   #8
Прик
Форумчанин
 
Регистрация: 08.09.2010
Сообщений: 880
По умолчанию

Ну, здесь вам и карты в руки. Какие средства, такие и возможности.

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

Понятно, что без цикла ни в случае с Pos, ни в случае TStringList не обойтись.
В общем то, здесь все равно как.
Прик вне форума Ответить с цитированием
Старый 27.05.2011, 22:16   #9
Trikster
Пользователь
 
Аватар для Trikster
 
Регистрация: 11.02.2011
Сообщений: 31
По умолчанию

ясно, спасибо большое) буду пробовать
Trikster вне форума Ответить с цитированием
Старый 28.05.2011, 12:27   #10
Trikster
Пользователь
 
Аватар для Trikster
 
Регистрация: 11.02.2011
Сообщений: 31
По умолчанию

Сделал пока так:
Код:
function true_answer(q_type:integer; q_answer:string):boolean;
var i:Integer;
    mas: array of integer;
....
2: begin
        for i:=0 to length(q_answer)-1 do
          begin setlength(mas,i+1);
             mas[i]:=strtoint(q_answer[i+1]);
          end;
        for i := 0 to High(mas) do
          if not CheckListBox1.Checked[mas[i]-1]
           then break
           else true_answer:=true;

  end;
....
в БД данные слитно, типа 234, чтоб не заморачиваться с разделительными знаками
Trikster вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
CheckListBox BALLIN Помощь студентам 4 14.04.2010 11:37
CheckListBox jahongir007 Общие вопросы Delphi 4 07.06.2009 12:10
Checklistbox RealSHELS Общие вопросы Delphi 3 30.07.2008 22:40
CheckListBox ivp88 Компоненты Delphi 4 12.05.2007 15:49