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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 10.04.2011, 22:35   #1
misher
Участник клуба
 
Аватар для misher
 
Регистрация: 26.05.2010
Сообщений: 1,648
Вопрос Загрузка теста

Как вывести в тестер любой тест?
Вот
Код:
const
TestName='Test'; // имя теста
При выводу я использую переменную
Код:
i:integer;
и так загружаю тест
Код:
while FileExists(ExtractFilePath(application.ExeName)+TestName+inttostr(i)+'.txt') do
Например у меня много Test1.txt, Text2.txt и т.д. Они все показываются в TStringList, но вопросы загружаются только с теста под каким числом указана переменная i. Например, если у i:=0, то какой бы тест я не загружал, все равно вопросы пойдут с Test0.txt, как это обойти?
This world will never be What I expected (c)
misher вне форума Ответить с цитированием
Старый 10.04.2011, 22:42   #2
grom333
Форумчанин
 
Аватар для grom333
 
Регистрация: 21.10.2008
Сообщений: 337
По умолчанию

не легче в БД сделать7, вопроса я не понял, если i:=0, то что будет?
Лучше быть последним из львов, чем первым среди шакалов.
Мой чат
community on struggle with zoomics
grom333 вне форума Ответить с цитированием
Старый 10.04.2011, 22:44   #3
misher
Участник клуба
 
Аватар для misher
 
Регистрация: 26.05.2010
Сообщений: 1,648
По умолчанию

Цитата:
не легче в БД сделать?
я с БД не работал, а времени нет разобраться. Нужно сделать этот вариант...
This world will never be What I expected (c)
misher вне форума Ответить с цитированием
Старый 10.04.2011, 22:49   #4
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

Если я правильно понял, то:
Если имена тестов упорядочены в StringList, начинаются с Test0, Test1 и т.д.,
не имеют дырок, то в качестве значения i можно использовать индекс текущей строки. В противном случае можно воспользоваться свойством Objects для запоминания индекса. И while FileExists зачем? Вроде как и if FileExists достаточно
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 10.04.2011, 22:58   #5
misher
Участник клуба
 
Аватар для misher
 
Регистрация: 26.05.2010
Сообщений: 1,648
По умолчанию

Цитата:
В противном случае можно воспользоваться свойством Objects для запоминания индекса.
Это как делается?
This world will never be What I expected (c)
misher вне форума Ответить с цитированием
Старый 10.04.2011, 23:06   #6
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

Код:
Добавить строку:
  xList.AddObject('Test1.txt',TObject(1));
изменить значение:
  xList.Objects[k]:=TObject(1);
прочитать:
i:=Integer(xList.Objects[1]);
Насколько помню TObject(-1) нельзя

upd

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

Последний раз редактировалось Аватар; 10.04.2011 в 23:16.
Аватар вне форума Ответить с цитированием
Старый 10.04.2011, 23:17   #7
misher
Участник клуба
 
Аватар для misher
 
Регистрация: 26.05.2010
Сообщений: 1,648
По умолчанию

Аватар, не подойдет. Тестов как минимум 20, вот целый
Код:
unit Unit8;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, ExtCtrls, jpeg, sComboBoxes, sComboBox, sLabel,
  sGroupBox;

type
  TForm8 = class(TForm)
    AnswerGroup: TRadioGroup;
    Button1: TButton;
    Button2: TButton;
    sComboBox1: TsComboBox;
    sGroupBox1: TsGroupBox;
    sLabel1: TsLabel;
    procedure FormCreate(Sender: TObject);
    procedure LoadTest(Index: integer);
    procedure LoadQuestion(Index: integer);
    procedure Button1Click(Sender: TObject);
    procedure sComboBox1CloseUp(Sender: TObject);
    procedure Button2Click(Sender: TObject);
    procedure CloseUp(Sender: TObject);
    
private
    { Private declarations }
  public
    { Public declarations }
  end;

const
  TestName='Test'; // имя файла теста
  max=1000; // максимальное количесво вопросов
var
  Form8: TForm8;
  QuestionText: array [0..max] of string; // текст вопроса
  AnswerQuestion: array [0..max] of byte; // правильный вариант ответа
  QuestionText1: array [0..max] of string;// первый вопрос
  QuestionText2: array [0..max] of string;// второй вопрос
  QuestionText3: array [0..max] of string;// третий вопрос
  Ball: integer=0;                        // оценка
  now: integer=0;                         // текущий вопрос
implementation

{$R *.dfm}

procedure TForm8.Button1Click(Sender: TObject);
begin
  if AnswerQuestion[now]=AnswerGroup.ItemIndex+1 then  // сравниваем значение ответа и выбранного значения
  inc(ball);
  AnswerGroup.ItemIndex:=-1;  // убираем выдаление с группы ответов
  inc(now);                   // увеличиваем вопрос на 1+
  LoadQuestion(now);          // загружаем его
end;

procedure TForm8.FormCreate(Sender: TObject);
var
  s: Tstrings;
  i: integer;
begin
  i:=0;
  while FileExists(ExtractFilePath(application.ExeName)+TestName+inttostr(i)+'.txt') do
  // проверяем файлы тестов
  begin
  application.ProcessMessages;  // что б не тормозило
  s:=tstringlist.Create;        // создаем переменную
  s.LoadFromFile(ExtractFilePath(application.ExeName)+TestName+inttostr(i)+'.txt'); // загружаем файл
    if s.Text<>'' then  // если не пуст то
     sComboBox1.Items.Add(s.Strings[0]); // добавляем в группу тестов название теста
  s.Free;  // уничтожаем переменную
  inc(i);  // увеличиваем счетчик
  end;
end;

procedure TForm8.LoadTest(Index: integer);   // загружаем выбранный тест
var
  s: Tstrings;
  j, h: Integer;
begin
  h:=0;
  s:=tstringlist.Create;  // создаем переменную
 s.LoadFromFile(ExtractFilePath(application.ExeName)+TestName+inttostr(h)+'.txt');
    if s.Text<>'' then  // если не пустая то
    begin
    form8.Caption:=s.Strings[0]; // название теста
      for j := 1 to s.Count - 1 do // начинаем присваивать значения
      begin
        if s.Strings[j]='__________' then  // это разделитель который мы ищем
        begin
        QuestionText[h]:=s.Strings[j+1]; // текст вопроса
        QuestionText1[h]:=s.Strings[j+2];// текст первого вариант ответа
        QuestionText2[h]:=s.Strings[j+3];// текст второго варианта ответа
        QuestionText3[h]:=s.Strings[j+4];// текст третьего варианта ответа
        AnswerQuestion[h]:=strtoint(s.Strings[j+5]); // номер ответа
        inc(h); // увеличиваем счетчик для того что бы записывать в новый элемент массива
        end;
      end;
    end;
  s.Free; // уничтожаем переменную
  LoadQuestion(now);// загружаем вопрос здесь он всегда = 0
end;

procedure TForm8. sComboBox1CloseUp(Sender: TObject);
begin
  // при выборе теста обнуляем все значения
  ball:=0;
  now:=0;
  button1.Enabled:=true;
  LoadTest(sComboBox1.ItemIndex);// загружаем выбранный тест
end;

procedure TForm8.LoadQuestion(Index: integer);
begin
  if QuestionText[Index]<>'' then// если выбранный вопрос существует то грузим его
  begin
  AnswerGroup.Items.Clear;// очищаем поле ответов
  sLabel1.Caption:=QuestionText[Index];// задаем запрос
  AnswerGroup.Items.Add(QuestionText1[index]);// добавляем ответы
  AnswerGroup.Items.Add(QuestionText2[index]);
  AnswerGroup.Items.Add(QuestionText3[index]);
  end
  else // иначе сообщаем что тест завершен
  begin
  showmessage('Тест завершен'+#13+'Правильных ответов: '+inttostr(ball)); // сообщение что типа тест окончен и выдаем количесво правильных ответов
  button1.Enabled:=false; // делаем неактивной кнопку
  end;
end;

procedure TForm8.Button2Click(Sender: TObject);
begin
close;
end;
procedure TForm8.CloseUp(Sender: TObject);
begin
  // при выборе теста обнуляем все значения
  ball:=0;
  now:=0;
  button1.Enabled:=true;
  LoadTest(sComboBox1.ItemIndex);// загружаем выбранный тест
end;
end.
Может как переделать возможно?
This world will never be What I expected (c)
misher вне форума Ответить с цитированием
Старый 10.04.2011, 23:27   #8
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

На первый взгляд
Код:
procedure TForm8.LoadTest(Index: integer);   // загружаем выбранный тест
var
  s: Tstrings;
  j, h: Integer;
begin
  h:=0;
  s:=tstringlist.Create;  // создаем переменную
 s.LoadFromFile(ExtractFilePath(application.ExeName)+TestName+inttostr(h)+'.txt'); - ???
наверно
 s.LoadFromFile(ExtractFilePath(application.ExeName)+TestName+inttostr(Index)+'.txt');
Изначально вопрос был конечно поставлен супер
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию

Последний раз редактировалось Аватар; 10.04.2011 в 23:34.
Аватар вне форума Ответить с цитированием
Старый 10.04.2011, 23:37   #9
misher
Участник клуба
 
Аватар для misher
 
Регистрация: 26.05.2010
Сообщений: 1,648
По умолчанию

Если я заменю значение h, то ничего произойдет, а вот если i, то тест меняется...
This world will never be What I expected (c)
misher вне форума Ответить с цитированием
Старый 10.04.2011, 23:52   #10
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

Код:
procedure TForm8.Button1Click(Sender: TObject);
begin
  if AnswerQuestion[now]=AnswerGroup.ItemIndex+1 then  // сравниваем значение ответа и выбранного значения
  inc(ball);
  AnswerGroup.ItemIndex:=-1;  // убираем выдаление с группы ответов
  inc(now);                   // увеличиваем вопрос на 1+
  LoadQuestion(now);          // загружаем его
end;

procedure TForm8.FormCreate(Sender: TObject);
var
  s: Tstrings;
  i: integer;
begin
  i:=0;
  while FileExists(ExtractFilePath(application.ExeName)+TestName+inttostr(i)+'.txt') do
  // проверяем файлы тестов
  begin
  application.ProcessMessages;  // что б не тормозило
  s:=tstringlist.Create;        // создаем переменную
  s.LoadFromFile(ExtractFilePath(application.ExeName)+TestName+inttostr(i)+'.txt'); // загружаем файл
    if s.Text<>'' then  // если не пуст то
     sComboBox1.Items.AddObject(s.Strings[0],TObject(i)); // добавляем в группу тестов название теста
  s.Free;  // уничтожаем переменную
  inc(i);  // увеличиваем счетчик
  end;
end;

procedure TForm8.LoadTest(Index: integer);   // загружаем выбранный тест
var
  s: Tstrings;
  j, h: Integer;
begin
  h:=0;
  s:=tstringlist.Create;  // создаем переменную
 s.LoadFromFile(ExtractFilePath(application.ExeName)+TestName+inttostr(Index)+'.txt');
    if s.Text<>'' then  // если не пустая то
    begin
    form8.Caption:=s.Strings[0]; // название теста
      for j := 1 to s.Count - 1 do // начинаем присваивать значения
      begin
        if s.Strings[j]='__________' then  // это разделитель который мы ищем
        begin
        QuestionText[h]:=s.Strings[j+1]; // текст вопроса
        QuestionText1[h]:=s.Strings[j+2];// текст первого вариант ответа
        QuestionText2[h]:=s.Strings[j+3];// текст второго варианта ответа
        QuestionText3[h]:=s.Strings[j+4];// текст третьего варианта ответа
        AnswerQuestion[h]:=strtoint(s.Strings[j+5]); // номер ответа
        inc(h); // увеличиваем счетчик для того что бы записывать в новый элемент массива
        end;
      end;
    end;
  s.Free; // уничтожаем переменную
  LoadQuestion(now);// загружаем вопрос здесь он всегда = 0
end;

procedure TForm8. sComboBox1CloseUp(Sender: TObject);
begin
  // при выборе теста обнуляем все значения
  ball:=0;
  now:=0;
  button1.Enabled:=true;
  LoadTest(sComboBox1.ItemIndex);// загружаем выбранный тест
end;

procedure TForm8.LoadQuestion(Index: integer);
begin
  if QuestionText[Index]<>'' then// если выбранный вопрос существует то грузим его
  begin
  AnswerGroup.Items.Clear;// очищаем поле ответов
  sLabel1.Caption:=QuestionText[Index];// задаем запрос
  AnswerGroup.Items.Add(QuestionText1[index]);// добавляем ответы
  AnswerGroup.Items.Add(QuestionText2[index]);
  AnswerGroup.Items.Add(QuestionText3[index]);
  end
  else // иначе сообщаем что тест завершен
  begin
  showmessage('Тест завершен'+#13+'Правильных ответов: '+inttostr(ball)); // сообщение что типа тест окончен и выдаем количесво правильных ответов
  button1.Enabled:=false; // делаем неактивной кнопку
  end;
end;

procedure TForm8.Button2Click(Sender: TObject);
begin
close;
end;
procedure TForm8.CloseUp(Sender: TObject);
begin
  // при выборе теста обнуляем все значения
  ball:=0;
  now:=0;
  button1.Enabled:=true;
  LoadTest(Integer(sComboBox1.Items.Objects[sComboBox1.ItemIndex]));// загружаем выбранный тест
end;
end.
Это так, навскидку, без отладки, мог нахимичить

UPD

Если не получится и D7 и не слабо весь проект с тестами бросить сюда, бросай, с утра в отладке посмотрю, спать хочется
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию

Последний раз редактировалось Аватар; 11.04.2011 в 00:07.
Аватар вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Создание теста Nikkolay Помощь студентам 10 27.11.2011 14:11
Результат теста IQ Fog Свободное общение 40 02.02.2011 20:57
загрузка теста через memo. Drakulov Помощь студентам 8 07.03.2010 20:23
Создание теста VeraN Помощь студентам 0 23.11.2009 18:03