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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 14.11.2010, 13:45   #1
sergio11
Пользователь
 
Аватар для sergio11
 
Регистрация: 18.02.2010
Сообщений: 96
Восклицание Экзаменатор

Проблема в том, что если встречается 5 вариантов ответа, то выдаёт ошибку. При 4 и менее работает нормально. Может кто поможет. Заранее спасибо.
Код:
unit ExamMainForn;

interface

uses
  SysUtils, WinTypes, WinProcs, Messages, Classes, Graphics, Controls,
  Forms, Dialogs, StdCtrls, ExtCtrls,

  jpeg; // обеспечивает обображение jpg-иллюстраций

type
  TForm1 = class(TForm)


    Label1: TLabel;
    Label2: TLabel;
    Label3: TLabel;
    Label4: TLabel;
    Label5: TLabel;
    Label6: TLabel;
    Label7: TLabel;

    RadioButton1: TRadioButton;
    RadioButton2: TRadioButton;
    RadioButton3: TRadioButton;
    RadioButton4: TRadioButton;
    RadioButton5: TRadioButton;
    RadioButton6: TRadioButton;

    Image1: TImage;
    Button1: TButton;
    Panel1: TPanel;
    


    procedure FormActivate(Sender: TObject);
    procedure Button1Click(Sender: TObject);
    procedure RadioButtonClick(Sender: TObject);

  private
    // Эти объявления вставлены сюда вручную
    procedure Info;
    function VoprosToScr: boolean;
    procedure ShowPicture; // выводит иллюстрацию
    procedure ResetForm;   // "очистка" формы перед выводом очередного вопроса
    procedure Itog;        // результат тестирования
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation
{$R *.DFM}

var
  f:TextFile;
  fn:string;

  level:array[1..4] of integer; // сумма, соответствующая уровню
  mes:array[1..4] of string;    // сообщение, соответствующее уровню

  vopr: record
    text: string;  // вопрос
    src: string;   // иллюстрация
    otv: array[1..5] of string; // варианты ответа
    notv: integer;  // количество вариантов ответа
    right: integer; // номер правильного ответа
  end;

  cv: integer = 0; // номер вопроса
  otv : integer;   // номер выбранного ответа
  sum: integer;

// информации о тесте
procedure Tform1.Info;
var
   s: string;
begin
   readln(f,s);
   Form1.Caption := s;
   readln(f,s);
   Label6.caption:=s;
end;

// прочитать из файла информацию об оценках
Procedure GetLevel;
var
   i:integer;
begin
     for i:=1 to 4 do
     begin
         readln(f,level[i]); // оценка
         readln(f,mes[i]);  // сообщение

     end;
end;

// отображение иллюстрации
Procedure TForm1.ShowPicture;
var
  w,h: integer; // максимально возможные размеры картинки
begin
  // вычислить допустимые размеры картинки
  w:=ClientWidth-10;
  h:=ClientHeight
         - Panel1.Height -10
         - Label6.Top
         - Label6.Height - 10;

  // вопросы
  if Label1.Caption <> ''
     then h:=h-Label1.Height-10;
  if Label2.Caption <> ''
     then h:=h-Label2.Height-10;
  if Label3.Caption <> ''
     then h:=h-Label3.Height-10;
  if Label4.Caption <> ''
     then h:=h-Label4.Height-10;
  if Label5.Caption <> ''
     then h:=h-Label5.Height-10;

  // если размер картинки меньше w на h,
  // то она не масштабируется
  Image1.Top:=Form1.Label7.Top+Label7.Height+10;
  if Image1.Picture.Height > h
        then Image1.Height:=h
        else Image1.Height:= Image1.Picture.Height;
  if Image1.Picture.Width > w
        then Image1.Width:=w
        else Image1.Width:=Image1.Picture.Width;

  Image1.Visible := True;
end;

// вывести вопрос

Последний раз редактировалось sergio11; 14.11.2010 в 13:49.
sergio11 вне форума Ответить с цитированием
Старый 14.11.2010, 13:46   #2
sergio11
Пользователь
 
Аватар для sergio11
 
Регистрация: 18.02.2010
Сообщений: 96
По умолчанию

Код:
function TForm1.VoprosToScr: boolean;
  var
   i: integer;
   p: integer;
  begin

     if EOF(f) then
     begin
       // достигнут конец файла
       VoprosToScr := False;
       exit;
     end;

     readln(f, vopr.text); // прочитать вопрос

     if  vopr.text = '*' then
     begin
       // признак конца теста
       VoprosToScr := False;
       exit;
     end;


     cv := cv + 1;
     caption:='Вопрос ' + IntToStr(cv);
     Label6.caption:= vopr.text;  // вывести вопрос

     // прочитать информацию об ответе:
     // количество ввариантов, номер правильного ответа и призак наличия
     // иллюстрации
     readln(f,vopr.notv,vopr.right, p); // p -  признак иллюстрации

     if p <> 0 then // есть иллюстрация
     begin
        readln(f,vopr.src);  // имя файла иллюстрации
        Image1.Tag:=1;
          try
            { Иллюстрацию прочитаем, но выведем только после
              того, как прочитаем альтернативные ответы
              и определим максимально возможный размер
              области формы, который можно использовать
              для ее вывода.
            }
            Image1.Picture.LoadFromFile(vopr.src);
            except
              on E:EFOpenError do
                 Image1.Tag:=0;
          end

     end
     else Image1.Tag := 0; // нет иллюстрации

     // читаем варианты ответа
     for i:= 1 to vopr.notv do
        readln(f,vopr.otv[i]);

     for i:= 1 to vopr.notv do
        case i of
            1: Label1.caption:= vopr.otv[i];
            2: Label2.caption:= vopr.otv[i];
            3: Label3.caption:= vopr.otv[i];
            4: Label4.caption:= vopr.otv[i];
            5: Label5.caption:= vopr.otv[i];
        end;

     // здесь прочитана иллюстрация и альтернативные ответы

     // текст вопроса уже выведен
     if Image1.Tag =1  // есть иллюстрация к вопросу
        then ShowPicture;

     // вывод альтернативных ответов
     if Label1.Caption <> ''
     then begin
        if Image1.Tag =1
            then Label1.top:=Image1.Top+Image1.Height+10
            else Label1.top:=Label6.Top+Label6.Height+10;
        RadioButton1.top:=Label1.top;
        Label1.visible:=TRUE;
        RadioButton1.Visible:=TRUE;
     end;

     if Label2.Caption <> ''
     then begin
        Label2.top:=Label1.top+ Label1.height+5;
        RadioButton2.top:=Label2.top;
        Label2.visible:=TRUE;
        RadioButton2.Visible:=TRUE;
     end;

     if Label3.Caption <> ''
     then begin
        Label3.top:=Label2.top+ Label2.height+5;
        RadioButton3.top:=Label3.top;
        Label3.visible:=TRUE;
        RadioButton3.Visible:=TRUE;
     end;

     if Label4.Caption <> ''
     then begin
        Label4.top:=Label3.top+ Label3.height+5;
        RadioButton4.top:=Label4.top;
        Label4.visible:=TRUE;
        RadioButton4.Visible:=TRUE;
     end;
     if Label5.Caption <> ''
     then begin
        Label5.top:=Label4.top+ Label4.height+5;
        RadioButton5.top:=Label5.top;
        Label5.visible:=TRUE;
        RadioButton5.Visible:=TRUE;
     end;

     Label7.Caption := '';
     VoprosToScr := True;
  end;
Procedure TForm1.ResetForm;
  begin
     // сделать невидимыми все метки и радиокнопки
     Label1.Visible:=FALSE;
     Label1.caption:='';
     Label1.width:=ClientWidth-Label1.left-5;
     RadioButton1.Visible:=FALSE;

     Label2.Visible:=FALSE;
     Label2.caption:='';
     Label2.width:=ClientWidth-Label2.left-5;
     RadioButton2.Visible:=FALSE;

     Label3.Visible:=FALSE;
     Label3.caption:='';
     Label3.width:=ClientWidth-Label3.left-5;
     RadioButton3.Visible:=FALSE;

     Label4.Visible:=FALSE;
     Label4.caption:='';
     Label4.width:=ClientWidth-Label4.left-5;
     RadioButton4.Visible:=FALSE;

     Label5.Visible:=FALSE;
     Label5.caption:='';
     Label5.width:=ClientWidth-Label5.left-5;
     RadioButton5.Visible:=FALSE;

     Label6.width:=ClientWidth-Label6.left-5;

     Image1.Visible:=FALSE;

end;

// определение достигнутого уровня
procedure TForm1.Itog;
  var
   i:integer;
   buf:string;
  begin
   buf:='';
   buf:='Результаты тестирования'+ #13
		+'Всего вопросов: '+ IntToStr(cv) + #13 +
    'Правильных ответов: ' + IntToStr(sum);
   i:=1;
   while (sum < level[i]) and (i<4) do
         i:=i+1;
   buf:=buf+ #13+ mes[i];
   Label6.Top:= 20;
   Label6.caption:=buf;
  end;
sergio11 вне форума Ответить с цитированием
Старый 14.11.2010, 13:46   #3
sergio11
Пользователь
 
Аватар для sergio11
 
Регистрация: 18.02.2010
Сообщений: 96
По умолчанию

Код:
procedure TForm1.FormActivate(Sender: TObject);
  begin
     if ParamCount = 0
     then begin
             Label6.caption:= 'Не задан файл вопросов теста.';
             Button1.caption:='Ok';
             Button1.tag:=2;
             Button1.Enabled:=TRUE
          end
     else begin
          fn := ParamStr(1);
          assignfile(f,fn);
          try
            reset(f);
          except
            on EFOpenError do
               begin
                    ShowMessage('Файл теста '+fn+' не найден.');
                    Button1.caption:='Ok';
                    Button1.tag:=2;
                    Button1.Enabled:=TRUE;
                    exit;
               end;
          end;

          // ключ /t активизирует режим отладки/обучения
          if ParamStr(2) = '/t' then
              Label7.Visible := True;

          ResetForm;
          Info;       // прочитать и вывести информацию о тесте
          GetLevel;   // прочитать информацию об уровнях оценок
     end;
end;

// щелчок на кнопке Button1
procedure TForm1.Button1Click(Sender: TObject);
  begin
     case Button1.tag of
       0: begin
               Button1.caption:='Дальше';
               Button1.tag:=1;
               RadioButton6.Checked:=TRUE;
               // вывод первого вопроса
               Button1.Enabled:=False;
               ResetForm;
               VoprosToScr;
          end;
       1: begin // вывод остальных вопросов
               if otv = vopr.right then
                  sum := sum + 1;
               RadioButton6.Checked:=TRUE;
               Button1.Enabled:=False;
               ResetForm;
               if not VoprosToScr then
                     begin
                        closefile(f);
                        Button1.caption:='Ok';
                        Form1.caption:='Результат';
                        Button1.tag:=2;
                        Button1.Enabled:=TRUE;
                        Label7.Visible := False;
                        Itog; // вывести результат
                     end;
          end;
       2: begin // завершение работы
            Form1.Close;
          end;
     end;
end;

// Процедура обработки события OnClick
// для компонентов RadioButton1-RadioButton4
procedure TForm1.RadioButtonClick(Sender: TObject);
begin
  if sender = RadioButton1
    then otv:=1
          else  if sender = RadioButton2
               then otv:=2
               else   if sender = RadioButton3
                            then otv:=3
                            else  if sender = RadioButton4
                            then otv:=4
                            else otv:=5;
  Button1.enabled:=TRUE;
  Label7.Caption := 'Выбран ответ: ' + IntToStr(otv) +
           ' Правильный ответ: ' + IntToStr(vopr.right);
end;

end.
sergio11 вне форума Ответить с цитированием
Старый 14.11.2010, 14:18   #4
mihali4
*
Старожил
 
Регистрация: 22.11.2006
Сообщений: 9,201
По умолчанию

Ну и в каком месте ошибка-то ?
Или нам самим ее вылавливать ?
mihali4 вне форума Ответить с цитированием
Старый 14.11.2010, 16:29   #5
sergio11
Пользователь
 
Аватар для sergio11
 
Регистрация: 18.02.2010
Сообщений: 96
По умолчанию

так я ж сказал, что сам не знаю. но при этом тесте он не работает.

Цитата:
Билет №5
Вы должны из предложенных нескольких вариантов ответа выбрать правильный.
13
пять.
11
четыре.
10
три.
9
два.
Какой необходим объем контроля ультразвуковой дефектоскопией или радиографическим методом стыковых, угловых,тавровых и других сварных соединений для сосудов 3-й группы:
5 1 0
Не менее 50 %.
10%.
35 %.
От 10 % до 30 %.
не менее 25%.
В каких случаях запрещается наполнять газом баллоны:
5 4 0
После проверки пористой массы прошло 18 месяцев.
При избыточном давлении в баллоне, равном 0,05МПа (0,5 кгс/см2).
Когда срок назначенного освидетельствования баллона истекает через месяц.
При неисправных вентилях.
При температуре окружающего воздуха выше +30°С.
На каких сосудах не допускается установка рычажно-грузовых предохранительных клапанов:
5 3 0
Стационарных.
Низкого давления.
Передвижных.
Высокого давления.
Большого объема.
Где должны устанавливаться сосуды, работающие под давлением:
4 4 0
В отдельно стоящих зданиях или на открытых площадках.
В производственных цехах.
В местах, не ближе 50 м от жилых зданий.
На открытых площадках в местах, исключающих скопление людей, или в отдельно стоящих зданиях.
Какие производственные объекты относятся к категории "опасных":
3 3 0
На которых применяются дурно пахнущие вещества, ж/д цистерны; используются автокраны.
Применяются газообразные вещества, используется оборудование, работающее под давлением до 0,07 МПа или при температуре воды до 115°С; используются автокраны, автовышки, железные дороги.
Имеет место использование опасных веществ, используется оборудование с давлением более 0,07 МПа или с температурой воды более 115°С, стационарно установленные краны, канатные дороги.
Для чего предназначены цистерны и бочки?
3 1 0
Для транспортировки и хранения продукта.
Для транспортировки и срабатывания продукта.
Для транспортировки, хранения и срабатывания продукта.
С какой целью проводятся наружный и внутренний осмотры и гидроиспытания сосудов:
3 3 0
Установить исправность, возможность дальнейшей работы, проверить прочность элементов.
Установить исправность, возможность дальнейшей работы, проверить плотность элементов.
Установить исправность, возможность дальнейшей работы, проверить прочность и плотность элементов.
Порядок обучения, аттестации и допуска к самостоятельной работе персонала, обслуживающего сосуды, работающие под давлением:
3 2 0
1)Бригадное обучение, сдача экзаменов комиссии предприятия с участием инспектора, стажировка на рабочем месте; сдача экзаменов по рабочему месту; распоряжение по цеху о допуске к самостоятельной работе.
-2)Курсовое обучение; остальное также, как в пункте 1.
-3)Индивидуальное обучение; остальное также, как в пункте 1.
Какие вентсистемы в случае пожара в помещениях любой категории должны быть обязательно отключены:
5 5 0
sergio11 вне форума Ответить с цитированием
Старый 14.11.2010, 17:35   #6
mihali4
*
Старожил
 
Регистрация: 22.11.2006
Сообщений: 9,201
По умолчанию

Мы тоже не знаем.
Вы про режим отладки слыхали ?
А про пошаговый режим ?
Рекомендую разобраться с азами работы в среде Дельфи.
А когда найдете место, где возникает ошибка, мы вам поможем от нее избавиться...
mihali4 вне форума Ответить с цитированием
Старый 03.06.2013, 09:47   #7
acihiro
 
Регистрация: 03.06.2013
Сообщений: 8
По умолчанию

Подскажите, почему когда запускается тест пишет "Не задан файл вопросов теста"?
acihiro вне форума Ответить с цитированием
Старый 03.06.2013, 13:52   #8
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,429
По умолчанию

acihiro, потому что не задан
Вы должны запускать программу с параметром, который представляет собой путь до файла вопросов.
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )
BDA вне форума Ответить с цитированием
Старый 03.06.2013, 20:22   #9
acihiro
 
Регистрация: 03.06.2013
Сообщений: 8
По умолчанию

почему выводит один вопрос а для второго не горит кнопка?
acihiro вне форума Ответить с цитированием
Старый 03.06.2013, 20:44   #10
acihiro
 
Регистрация: 03.06.2013
Сообщений: 8
По умолчанию

и как здесь создавалась процедура RadioButtonClick?
acihiro вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Электронный экзаменатор Hakman Помощь студентам 3 27.12.2008 20:22