IPB
ЛогинПароль:

> ВНИМАНИЕ!

Прежде чем задать вопрос, смотрите FAQ.
Рекомендуем загрузить DRKB.

Наладить общение поможет, если вы подпишитесь по почте на новые темы в этом форуме.

 
 Ответить  Открыть новую тему 
> Delphi 7 программа тестирования, Помогите разобраться.
сообщение
Сообщение #1





Группа: Пользователи
Сообщений: 1
Пол: Мужской

Репутация: -  0  +


Всем привет. Помогите плиз новечку. В программе листинг которой приведен ниже, нужно подправить код, чтобы программа брала имя файла теста при выборе самого файла теста, т.е. его имени. Нужно чтобы при запуске программы создавалась форма, затем из меню ОТКРЫТЬ можно было задать имя файла теста. Файл теста существует на диске. Сам тест- файл *.*TXT



Код
{
   Программа берет имя файла теста из командной строки.
   Если программа запускается из Delphi,
   то имя файла теста надо ввести в
   поле Parameters диалогового окна
   Run Parameters, которое становится
   доступным в результате выбора в меню
   Run команды Parameters.
}
unit test01;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, ActnList, StdActns, XPStyleActnCtrls, ActnMan,
  ToolWin, ActnCtrls, ActnMenus;
type
  TForm1 = class(TForm)
    Label1: TLabel;
    RadioButton1: TRadioButton;
    RadioButton2: TRadioButton;
    RadioButton3: TRadioButton;
    Label2: TLabel;
    Label3: TLabel;
    Label4: TLabel;
    Button1: TButton;
    ActionMainMenuBar1: TActionMainMenuBar;
    ActionManager1: TActionManager;
    FileOpen1: TFileOpen;
    FileExit1: TFileExit;
    HelpTopicSearch1: THelpTopicSearch;
    Label5: TLabel;
    procedure FormCreate(Sender: TObject);
    procedure Button1Click(Sender: TObject);
    procedure RadioButton1Click(Sender: TObject);
    procedure RadioButton2Click(Sender: TObject);
    procedure RadioButton3Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;


implementation

{$R *.dfm}

var
  f: TextFile;      // файл теста (вопросы и варианты ответов)
  nq: integer;      // количество вопросов в тесте
  right: integer;   // количество правильных ответов
  level: array[1..4] of integer;      // критерии оценок
  mes: array[1..4] of string;    // комментарии
  buf: string;

// читает вопрос из файла и выводит его
// на в поля формы
function NextQw : boolean;
begin
  if not EOF(f) then
  begin
    // прочитать и вывести вопрос
    Readln(f,buf);
    Form1.Label1.Caption := buf;

    // прочитать и вывести варианты ответов
    // 1-й вариант
    Readln(f,buf);  // прочитать 1-й вариант ответа
    Form1.Label2.Caption := buf;
    Readln(f,buf);  // оценка за выбор этого ответа (1 - правильно, 0 - нет)
    Form1.RadioButton1.Tag := StrToInt(buf);

    // 2-й вариант
    Readln(f,buf);
    Form1.Label3.Caption := buf;
    Readln(f,buf);
    Form1.RadioButton2.Tag := StrToInt(buf);

    // 3-й вариант
    Readln(f,buf);
    Form1.Label4.Caption := buf;
    Readln(f,buf);
    Form1.RadioButton3.Tag := StrToInt(buf);

    // счетчик общего количества вопросов
    nq:= nq + 1;

    // кнопка "Дальше" не доступна,
    // пока не выбран один из вариантов ответа
    Form1.Button1.Enabled := False;

    // ни одна из радиокнопок не выбрана
    Form1.RadioButton1.Checked := False;
    Form1.RadioButton2.Checked := False;
    Form1.RadioButton3.Checked := False;
    NextQw := TRUE;
  end
  else NextQw := FALSE;
end;

// событие FormCreate возникает в момент
// создания формы
procedure TForm1.FormCreate(Sender: TObject);


var
  i: integer;
  fname : string;
begin
  { Если программа запускается из Delphi,
    то имя файла теста надо ввести в
    поле Parameters диалогового окна
    Run Parameters, которое становится
    доступным в результате выбора в меню
    Run команды Parameters.}
  fname := ParamStr(1); // взять имя файла теста
                        // из командной строки
  if fname = '' then
  begin
    ShowMessage('В командной строке запуска программы' +#13+
                'надо указать имя файла теста.');
    Application.Terminate; // завершить программу
  end;
  AssignFile(f,fname);

  // в процессе открытия файла возможны
  // ошибки, поэтому ...
  try
    Reset(f); // эта инструкция может вызвать ошибку
  except
    on EInOutError do
        begin
            ShowMessage('Ошибка обращения к файлу теста: ' + fname);
            Application.Terminate; // завершить программу
        end;
  end;

  // здесь файл теста успешно открыт
  // прочитать название теста - первая строка файла
  Readln(f,buf);
  Form1.Caption := buf;

  // прочитать оценки и комментарии
  for i:=1 to 4 do
    begin
      Readln(f,buf);
      mes[i] := buf;
      Readln(f,buf);
      level[i] := StrToInt(buf);
    end;

   right := 0; // правильных ответов
   nq := 0;    // всего вопросов
   NextQW;     // прочитать и вывести первый вопрос
end;


// щелчок на кнопке "Дальше"
procedure TForm1.Button1Click(Sender: TObject);
var
    buf: string;
    i: integer;
begin
    if Button1.Caption = 'Завершить' then Close;

    // добавим оценку за выбранный вариант ответа
    // оценка находится в свойстве Button.Tag
    // Button.Tag = 1 - ответ правильный, 0 - нет

    if RadioButton1.Checked  then
        right := right + RadioButton1.Tag;
    if RadioButton2.Checked  then
       right := right + RadioButton2.Tag;
    if RadioButton3.Checked  then
       right := right + RadioButton3.Tag;

  // вывести следующий вопрос
  // NextQW читает и выводит вопрос
  // NextQw = FALSE если в файле теста
  // вопросов больше нет
  if not NextQW then
  begin
      // здесь значение NextQw = FALSE
      Button1.Caption := 'Завершить';

      // скрыть переключатели и поля меток
      RadioButton1.Visible := False;
      RadioButton2.Visible := False;
      RadioButton3.Visible := False;
      Label2.Visible := False;
      Label3.Visible := False;
      Label4.Visible := False;

      buf := 'Тестирование завершено.' + #13 +
             'Правильных ответов: ' + IntToStr(right) +
             ' из ' + IntToStr(nq) + '.' + #13;

      // выставить оценку
      // right - кол-во правильных ответов
      i:=1; // номер уровня
      while (right < level[i]) and (i < 4) do
            inc(i);
      buf := buf + mes[i];

      Label1.AutoSize := TRUE;
      Label1.Caption := buf;

    end;
end;

// щелчок на переключателе выбора первого варианта ответа
procedure TForm1.RadioButton1Click(Sender: TObject);
begin
  Button1.Enabled := True; // кнопка Далее теперь доступна
end;

procedure TForm1.RadioButton2Click(Sender: TObject);
begin
  Button1.Enabled := True;
end;

procedure TForm1.RadioButton3Click(Sender: TObject);
begin
  Button1.Enabled := True;
end;

end.
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #2





Группа: Пользователи
Сообщений: 2
Пол: Мужской
Реальное имя: Дмитрий

Репутация: -  0  +


а не проще ли будет попрбовать использовать БД для реализации теста, связать таблицы в одной будут названия тестов, во второй названия вопросов(связана с 1-ой таблицей),а в третьей(связанной по ключу со второй таблицей) будут варианты ответов. Мне кажеться это проще, чем юзать текстовые файлы. У меня есть тестовая программа работающая. Но там только один тип вопросов-пометить галками правильные ответы и все. Как то делал курсач, там надо было использовать различные типы вопросов. Я тип вопроса ставил в базе вопросов, т.е. вопрос и смотрел тип потом выводил нужную панель (PageControl).
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #3


Новичок
*

Группа: Пользователи
Сообщений: 45
Пол: Мужской
Реальное имя: Алексей

Репутация: -  0  +


это лучше делать через типизированные файлы...
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #4


Новичок
*

Группа: Пользователи
Сообщений: 48
Пол: Мужской
Реальное имя: Fang

Репутация: -  2  +


Цитата
это лучше делать через типизированные файлы...

А чем лучше?
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #5


Автооответчик
*****

Группа: Пользователи
Сообщений: 1 188
Пол: Мужской
Реальное имя: Александр

Репутация: -  16  +


Gothic_Snake ну так сделай wink.gif


--------------------
Неадекватная чушь может быть адекватным ответом на неадекватный вопрос. Понятно или разжевать?
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #6


Новичок
*

Группа: Пользователи
Сообщений: 45
Пол: Мужской
Реальное имя: Алексей

Репутация: -  0  +


Цитата(Fang @ 23.12.2005 21:46) *

А чем лучше?

Можно сразу проверить количество записей (количество вопросов)
Быстрый переход от одного вопроса к другому (назад, вперед)
Да и просто удобно... Не требуется следить за правильностью расположения строк в файле
(1-вопрос, 2-5 варианты ответов, 6- правильный...)
А что если нада будет текст с разбиением строки сделать? вот здесь то и застрянешь...
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #7


Новичок
*

Группа: Пользователи
Сообщений: 45
Пол: Мужской
Реальное имя: Алексей

Репутация: -  0  +


Цитата(GoodWind @ 23.12.2005 21:47) *

Gothic_Snake ну так сделай wink.gif

Уже давно сделал. Одну на паскале, другую-на дельфях. Дельфовская до сих пор у нас в колледже используется...
http://gdsn.hut1.ru/download.php?program=test
здесь выложена дельфовская версия. Построена на типизированных файлах..
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 

 Ответить  Открыть новую тему 
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 





- Текстовая версия 20.04.2024 19:19
500Gb HDD, 6Gb RAM, 2 Cores, 7 EUR в месяц — такие хостинги правда бывают
Связь с администрацией: bu_gen в домене octagram.name