unit Main;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, ComCtrls, Grids, DBGrids, DB, ADODB, StdCtrls, ExtCtrls, Buttons,
  DBCtrls, ImgList, XPMan, DBTables, OleCtnrs, AxCtrls, jpeg, ActiveX;

type
  TfmMain = class(TForm)
    pgc1: TPageControl;
    TabSheet1: TTabSheet;
    TabSheet2: TTabSheet;
    pgc2: TPageControl;
    TabSheet3: TTabSheet;
    TabSheet4: TTabSheet;
    Panel1: TPanel;
    spl1: TSplitter;
    Panel2: TPanel;
    Panel3: TPanel;
    GroupBox1: TGroupBox;
    GroupBox2: TGroupBox;
    dbgrd2: TDBGrid;
    GroupBox3: TGroupBox;
    dbgrd3: TDBGrid;
    Panel4: TPanel;
    Btn3: TButton;
    lbl1: TLabel;
    lbl2: TLabel;
    GroupBox4: TGroupBox;
    Panel5: TPanel;
    Memo1: TMemo;
    Btn1: TButton;
    edt1: TEdit;
    tmr1: TTimer;
    lbl3: TLabel;
    lbl4: TLabel;
    dbgrd1: TDBGrid;
    BitBtn2: TBitBtn;
    BitBtn3: TBitBtn;
    BitBtn4: TBitBtn;
    BitBtn5: TBitBtn;
    BitBtn6: TBitBtn;
    BitBtn7: TBitBtn;
    BitBtn8: TBitBtn;
    BitBtn10: TBitBtn;
    xpmnfst1: TXPManifest;
    ScrollBox1: TScrollBox;
    Image1: TImage;
    procedure FormClose(Sender: TObject; var Action: TCloseAction);
    procedure tmr1Timer(Sender: TObject);
    procedure Btn3Click(Sender: TObject);
    procedure Btn1Click(Sender: TObject);
    procedure BitBtn6Click(Sender: TObject);
    procedure BitBtn4Click(Sender: TObject);
    procedure BitBtn8Click(Sender: TObject);
    procedure BitBtn2Click(Sender: TObject);
    procedure BitBtn3Click(Sender: TObject);
    procedure BitBtn10Click(Sender: TObject);
    procedure BitBtn7Click(Sender: TObject);
    procedure BitBtn5Click(Sender: TObject);
    procedure edt1Change(Sender: TObject);

  private
    { Private declarations }
  public
    { Public declarations }
  end;
  TMyThread = class(TThread) // Описываем класс нашего нового потока
    private
      { Private declarations }
      procedure set_questions;
      procedure out_info;
    protected
      procedure Execute; override; // В методе Execute будет находиться непосредственно тело самого потока -
      // код, который будет в нем обрабатываться.
  end;

var
  fmMain: TfmMain;
  arr_questions, arr_questions_old:array of Word;
  r,
  kol,
  next_questions,
  true_answer,
  false_answer:Integer;
  MyThread: TMyThread;
  timeOut,
  false_answer_str:String;
  min, sec:integer;
implementation

uses
   dmu, authorization,  addEditTest, EditAddResult, Form, EditAddQuestions;

{$R *.dfm}

procedure TfmMain.FormClose(Sender: TObject; var Action: TCloseAction);
begin
fmAuthorization.Close;
end;

procedure TfmMain.tmr1Timer(Sender: TObject);
var s,m,h,os:integer;
r:string;
begin
os:=strtoint(lbl3.caption);
dec(os);
lbl3.caption:=inttostr(os);
h:=os div 3600;
os:=os-h*3600;
m:=os div 60;
s:=os mod 60;
r:='[ ';
if h<10 then r:=r+'0'+inttostr(h)
else r:=r+inttostr(h);
r:=r+' : ';
if m<10 then r:=r+'0'+inttostr(m)
else r:=r+inttostr(m);
r:=r+' : ';
if s<10 then r:=r+'0'+inttostr(s)
else r:=r+inttostr(s);
r:=r+' ]';
lbl2.caption:=r;
if os=1 then begin
tmr1.enabled:=false;
//

Btn3.Enabled:=False;
fmForm.Close;
ShowMessage('Ваш результат: '+dm.tbl3.FieldByName('Результат').AsString+'правильных ответов');
end;
end;

procedure TMyThread.set_questions;
begin
 fmMain.Memo1.Clear;
 if dm.tbl2.fieldByName('Изображение').AsString='' then fmMain.Image1.Picture.LoadFromFile('DB\img\noPicture.jpg')
 else fmMain.Image1.Picture.LoadFromFile(dm.tbl2.fieldByName('Изображение').AsString);
 fmMain.Memo1.Lines.Append(dm.tbl2.fieldByName('Вопрос').AsString);
 fmMain.Image1.Refresh;
end;

procedure TMyThread.out_info;
begin
ShowMessage('Время прохождения теста: '+timeOut+'. '+ #13+'Правильных ответов: '+IntToStr(true_answer)+'. '+ #13+'Неправильных ответов: '+IntToStr(false_answer)+'. '+#13+false_answer_str);
end;

procedure TMyThread.Execute;
var
  i:integer;
begin
  Randomize();
CoInitialize(nil);
dm.tbl1.First;//переходим на первую запись таблицы тесты
  While not dm.tbl1.Eof do   //Перебираем все записи из таблицы тесты
  begin
  sleep(50);
  dm.tbl2.First; //переходим на первую запись таблицы вопросы
  i:=1;//обнуляем счетчики
  SetLength(arr_questions, 0);//очищаем массив
  SetLength(arr_questions_old, 0);//очищаем массив
  While not dm.tbl2.Eof do  //Перебираем все записи из таблицы вопросы
    begin
    //отбираем все вопросы по выбранному тесту
    if dm.tbl2.FieldByName('КодТест').AsInteger = dm.tbl1.FieldByName('Код').AsInteger then
      begin
      SetLength(arr_questions, i);//увеличиваем размер массива
      arr_questions[i-1]:=dm.tbl2.FieldByName('Код').AsInteger;
      Inc(i);
      dm.tbl2.Next; //переходим к следующей записи таблицы тесты
      end;
    end;

    r:=Random(length(arr_questions));
    dm.tbl2.First;
    While not dm.tbl2.Eof do
      begin
      if dm.tbl2.FieldByName('Код').AsInteger=arr_questions[r]
      then
        begin
        Synchronize(set_questions);
        break;
        end;
      dm.tbl2.Next;
      end;

    myThread.Suspend;//приостановать поток

  dm.tbl1.Next; //переходим к следующей записи таблицы тесты
  end;
//действия по окончанию тестирования
fmMain.tmr1.enabled:=false;
fmMain.lbl2.Caption:='[00:00:00]';
min:= (10800-StrToInt(fmMain.lbl3.Caption)) div 60;
sec:= (10800-StrToInt(fmMain.lbl3.Caption)) mod 60;
timeOut:=IntToStr(min)+' мин '+IntToStr(sec)+' сек';
Synchronize(out_info);
dm.tbl3.Last;
dm.tbl3.edit;
dm.tbl3.FieldByName('Результат').AsInteger:=true_answer;
dm.tbl3.FieldByName('Время').AsInteger:=min;
dm.tbl3.fieldByName('Неправильные ответы').AsString:=false_answer_str;
dm.tbl3.Post;
fmMain.btn1.enabled:=False;
fmMain.edt1.Enabled:=False;
fmMain.Image1.Picture:=nil;
fmMain.Memo1.Clear;
//
CoUninitialize;
myThread.Terminate;
end;

procedure TfmMain.Btn3Click(Sender: TObject);
begin
fmForm.Show;
myThread := TMyThread.Create(True);
myThread.Priority := tpLower;
true_answer:=0;
end;

procedure TfmMain.Btn1Click(Sender: TObject);
begin
if dm.tbl2.fieldByName('Ответ').AsString = edt1.Text
then Inc(true_answer)
else
  begin
  Inc(false_answer);
  false_answer_str:=false_answer_str+'Б'+IntToStr(dm.tbl2.fieldByName('КодТест').AsInteger)+'В'+IntToStr(r+1)+'  ';
  end;

myThread.Resume;

    Edt1.Clear;
    Edt1.SetFocus;
end;

procedure TfmMain.BitBtn6Click(Sender: TObject);
begin
 if MessageBox(Handle,'Вы действительно хотите удалить запись?', 'Внимание!', mb_YesNo) = mrYes then
  if dm.tbl2.RecordCount<>0 then
  dm.tbl2.Delete
 else ShowMessage('Таблица пуста!                           ')
end;

procedure TfmMain.BitBtn4Click(Sender: TObject);
begin
 if MessageBox(Handle,'Вы действительно хотите удалить запись?', 'Внимание!', mb_YesNo) = mrYes then
  if dm.tbl1.RecordCount<>0 then
  begin
  dm.tbl2.first;
  While not dm.tbl2.Eof do
  begin
    if dm.tbl2.FieldByName('КодТест').AsInteger=dm.tbl1.FieldByName('Код').AsInteger
    then dm.tbl2.Delete;
    dm.tbl2.Next;
  end;
  dm.tbl1.Delete;
  end
 else ShowMessage('Таблица пуста!                           ')
end;

procedure TfmMain.BitBtn8Click(Sender: TObject);
begin
 if MessageBox(Handle,'Вы действительно хотите удалить запись?', 'Внимание!', mb_YesNo) = mrYes then
  if dm.tbl3.RecordCount<>0 then
  dm.tbl3.Delete
 else ShowMessage('Таблица пуста!                           ')
end;

procedure TfmMain.BitBtn2Click(Sender: TObject);
begin
fmEditAddTest.Show;
fmEditAddTest.Caption:='Добавление';
fmEditAddTest.BitBtn1.Visible:=True;
fmEditAddTest.BitBtn2.Visible:=False;
end;

procedure TfmMain.BitBtn3Click(Sender: TObject);
begin
fmEditAddTest.Show;
fmEditAddTest.Caption:='Редактирование';
fmEditAddTest.BitBtn1.Visible:=False;
fmEditAddTest.BitBtn2.Visible:=True;
fmEditAddTest.edt1.Text:=dm.tbl1.FieldByName('Название теста').AsString;
end;

procedure TfmMain.BitBtn10Click(Sender: TObject);
begin
fmEditAddResult.Show;

fmEditAddResult.edt1.Text:=dm.tbl3.FieldByName('Фамилия').AsString;
fmEditAddResult.edt2.Text:=dm.tbl3.FieldByName('Имя').AsString;
fmEditAddResult.edt3.Text:=dm.tbl3.FieldByName('Отчество').AsString;

fmEditAddResult.chk1.Checked:=dm.tbl3.FieldByName('Доступ').AsBoolean;
end;

procedure TfmMain.BitBtn7Click(Sender: TObject);
begin
fmEditAddQuestions.Show;
fmEditAddQuestions.Caption:='Добавление';
fmEditAddQuestions.BitBtn1.Visible:=True;
fmEditAddQuestions.BitBtn2.Visible:=False;
end;

procedure TfmMain.BitBtn5Click(Sender: TObject);
begin
fmEditAddQuestions.Show;
fmEditAddQuestions.Caption:='Редактирование';
fmEditAddQuestions.BitBtn1.Visible:=False;
fmEditAddQuestions.BitBtn2.Visible:=True;

Memo1.Lines.Text:=dm.tbl2.FieldByName('Вопрос').AsString;
fmEditAddQuestions.edt1.Text:=dm.tbl2.FieldByName('Изображение').AsString;
fmEditAddQuestions.edt2.Text:=IntToStr(dm.tbl2.FieldByName('Ответ').AsInteger);
end;





procedure TfmMain.edt1Change(Sender: TObject);
begin
if edt1.Text = '' then btn1.Enabled:=false
else btn1.Enabled:=true;

end;

end.
