unit MainUnit;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, ImgList, ComCtrls, ExtCtrls, ToolWin, StdCtrls, CheckLst;

type
  PQuestion=^TQuestion;
  TQuestion=record
   Name: String[255];
   ResultCount:Integer;
   ResiltText: array[0..10] of String[255];
   ResiltValue: array[0..10] of boolean;
  end;

  TTestForm = class(TForm)
    ToolBar1: TToolBar;
    OpenButton: TToolButton;
    RunButton: TToolButton;
    ImageList1: TImageList;
    ExitButton: TToolButton;
    ToolButton4: TToolButton;
    Panel1: TPanel;
    NextButton: TButton;
    QuestionCheckList: TCheckListBox;
    OpenDialog1: TOpenDialog;
    QuestionLabel: TStaticText;
    procedure OpenButtonClick(Sender: TObject);
    procedure ExitButtonClick(Sender: TObject);
    procedure FormShow(Sender: TObject);
    procedure FormDestroy(Sender: TObject);
    procedure RunButtonClick(Sender: TObject);
    procedure NextButtonClick(Sender: TObject);
  private
    { Private declarations }
    QuestionList:TList;
    Question, QuestionNumber, FalseNumber:Integer;
    FileName:String;
    procedure NextQuestion;
    procedure LoadFile;
  public
    { Public declarations }
  end;

var
  TestForm: TTestForm;

implementation

{$R *.dfm}

procedure TTestForm.ExitButtonClick(Sender: TObject);
begin
 Close;
end;

procedure TTestForm.OpenButtonClick(Sender: TObject);
begin
 //Показать окно открытия файла
 if not OpenDialog1.Execute then exit;
 FileName:=OpenDialog1.Filename;
 RunButton.Enabled:=true;
end;

procedure TTestForm.FormShow(Sender: TObject);
begin
 QuestionList:=TList.Create;
end;

procedure TTestForm.FormDestroy(Sender: TObject);
begin
 QuestionList.Free;
end;

procedure TTestForm.RunButtonClick(Sender: TObject);
begin
 LoadFile;
 QuestionNumber:=0;
 FalseNumber:=0;
 NextButton.Enabled:=true;
 NextQuestion;
end;

procedure TTestForm.NextQuestion;
var
 i:Integer;
begin
 Randomize;
 Question:=Random(QuestionList.Count-1);

 QuestionLabel.Caption:=PQuestion(QuestionList[Question]).Name;

 QuestionCheckList.Items.Clear;
 for i:=0 to PQuestion(QuestionList[Question]).ResultCount-1 do
  QuestionCheckList.Items.Add(PQuestion(QuestionList[Question]).ResiltText[i]);

 Inc(QuestionNumber);
end;

procedure TTestForm.NextButtonClick(Sender: TObject);
var
 OK:Boolean;
 i:Integer;
begin
 OK:=true;

 for i:=0 to PQuestion(QuestionList[Question]).ResultCount-1 do
  if PQuestion(QuestionList[Question]).ResiltValue[i]<>QuestionCheckList.Checked[i] then
   OK:=false;

 if OK=false then
  Inc(FalseNumber);

 QuestionList.Delete(Question);

 if QuestionNumber<5 then
  NextQuestion
 else
  begin
   Application.MessageBox(PChar('Вы закончили тест с количеством ошибок = '+IntToStr(FalseNumber)), 'Внимание!!!');
   NextButton.Enabled:=false;
  end;
end;

procedure TTestForm.LoadFile;
var
 fs:TFileStream;
 i, Count:Integer;
 Str:String[5];
 ProjectName:String[255];
 NewQuest:PQuestion;
begin
 QuestionList.Clear;
 //Открыть файл для чтения
 fs:=TFileStream.Create(FileName, fmOpenRead);

 //Перейти в начало файла и прочитать заголовок
 fs.Seek(0,soFromBeginning);
 fs.read(Str, SizeOf(Str));

 //Если заголовок равен тексу "Тест", значит это "вопрос-
 //варианты ответов".
 if Str='Тест' then
  begin
   //Прочитать имя проекта
   fs.Read(ProjectName, sizeof(ProjectName));
   Caption:=ProjectName;

   try
    //Прочитать количество вопросов
    fs.Read(Count, sizeof(Count));

    //Запустить цикл чтения вопросов
    for i:=0 to Count-1 do
     begin
      //Создаю новую структуру в памяти для вопроса
      NewQuest:=New(PQuestion);
      //Читаю структуру
      fs.Read(NewQuest^, sizeof(TQuestion));

      //Добавляю структуру в контейнер
      QuestionList.Add(NewQuest);
     end;
   finally
    //Закрываю файл
    fs.Free;
   end;
  end;
end;

end.
