Создание обучающей системы автоматизированного проектирования маломощных электромеханических следящих систем, страница 65

  Table1.Active:=false;

  Application.MessageBox('Не могу подключить базу с вариантами начальных данных.','Ошибка базы данных.',MB_OK or MB_ICONERROR);

  exit;

  end;

 end;

 //Выравниваем ширину столбцов в таблице

for i:=1 to fmVar.DBGrid1.Columns.Count - 1 do

  fmVar.DBGrid1.Columns[i].Width:=45;

 // Показываем форму

 fmVar.ShowModal;

end;

end.

Б.3 Содержание файла Unit2.pas

unit Unit2;

interface

uses

  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,

  Dialogs, StdCtrls, ExtCtrls;

{Описываем новый тип for вопроса теста}

type

 TQuestion = record

   Question : string;

   Variants : array [1..4] of string; {4 варианта ответа - строки}

   Answer   : integer;                {правильный вариант ответа - целое}

   Asked    : bool;                   {флаг, проверяющий, задавался ли вопрос}

end;

type

 TResult = record

  right : integer;

  wrong : integer;

end;

type

  TForm2 = class(TForm)

    Timer1: TTimer;

    Memo1: TMemo;

    Button1: TButton;

    Questions: TRadioGroup;

    Label1: TLabel;

    Label2: TLabel;

    lbAnswer: TLabel;

    leTrue: TLabeledEdit;

    leFalse: TLabeledEdit;

    Label3: TLabel;

    procedure Button1Click(Sender: TObject);

    procedure Timer1Timer(Sender: TObject);

    procedure FormCreate(Sender: TObject);

    procedure FormShow(Sender: TObject);

    //устанавливает номер теста и подготавливает вопросы и результаты.

procedure SetTest(idx: integer);

    //Отображает вопрос теста в окне.

    procedure ShowQuestion();

    procedure FormClose(Sender: TObject; var Action: TCloseAction);

    //function GetRight(test_num : integer) : integer ;

    //function GetWrong(test_num : integer) : integer;

  private

    { Private declarations }

  public

    { Public declarations }

  end;

var

  Form2: TForm2;

  vremya: integer; //Переменная для времени теста.

var test_res: array [1..5] of TResult; //Массив результатов тестов.

  var tests: array [1..5] of array [1..8] of TQuestion; //Массив из 5-ти тестов по 8 вопросов.

  var test_num, question_count, question_num : integer; //Текущий номер теста, количество показанных вопросов.

implementation

uses Unit1;

{$R *.dfm}

procedure TForm2.ShowQuestion();

var

  a : set of byte;

  mas : array [1..4] of byte;

  i,k : Byte;

begin

  Randomize;

  question_num:=0;

  while true do

  begin

    question_num:=random(8)+1;

    if not tests[test_num][question_num].Asked then break; // Если вопрос не показан

  end;

  tests[test_num][question_num].Asked:=true; // Запись о том, что вопроc показан

  label1.Caption:='Вопрос №'+IntToStr(question_count)+' из 5:';

  Memo1.Text:=tests[test_num][question_num].Question;

  // Формируем случайный массив для задания вопросов

a := [1..4];

  for k := 1 to 4 do

  begin

    repeat

      i := Random(4) + 1;

    until (i in a)=true;

    Exclude(a,i);

    mas[k] := i;

  end;

  Questions.Items[0] := tests[test_num][question_num].Variants[mas[1]];

  Questions.Items[1] := tests[test_num][question_num].Variants[mas[2]];

  Questions.Items[2] := tests[test_num][question_num].Variants[mas[3]];

  Questions.Items[3] := tests[test_num][question_num].Variants[mas[4]];

end;

procedure TForm2.SetTest(idx: integer);

var i:integer;

begin

 //Задаёт номер теста.

 test_num:=idx;

 leTrue.Text := '0';

 leFalse.Text := '0';

 //Сбрасываем флаги для вопросов.

for i:=1 to 7 do

  tests[test_num][i].Asked:=false;

 test_res[test_num].right:=0;

 test_res[test_num].wrong:=0;

end;

procedure TForm2.Button1Click(Sender: TObject);

begin

  if Button1.Caption = 'Ответить' then

  begin

    //Проверяем правильнось ответа и заполняем статистику.

if Questions.Items[Questions.ItemIndex] = tests[test_num][question_num].Variants[tests[test_num][question_num].Answer] then

    begin

      test_res[test_num].right:=test_res[test_num].right+1;