Книга: Delphi. Учимся на примерах

Полный исходный код модуля

Полный исходный код модуля

Полный код модуля программы-теста представлен в листинге 13.1.

Листинг 13.1. Модуль программы-теста

unit Unit1;
interface
uses
 Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, ExtCtrls, StdCtrls, IniFiles, jpeg, Menus;
type TForm1 = class(TForm)
 Memo1: TMemo;
 RadioGroup1: TRadioGroup;
 p1: TPanel;
 p2: TPanel;
 p3: TPanel;
 p4: TPanel;
 p5: TPanel;
 an1: TRadioButton;
 an2: TRadioButton;
 an3: TRadioButton;
 an4: TRadioButton;
 Label1: TLabel;
 Label2: TLabel;
 MainMenu1: TMainMenu;
 N1: TMenuItem;
 N2: TMenuItem;
 N3: TMenuItem;
 N4: TMenuItem;
 Open1: TOpenDialog;
 procedure FormCreate(Sender: TObject);
 procedure p1Click(Sender: TObject);
 procedure p2Click(Sender: TObject);
 procedure p3Click(Sender: TObject);
 procedure p4Click(Sender: TObject);
 procedure p5Click(Sender: TObject);
 procedure Image1Click(Sender: TObject);
 procedure p1MouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
 procedure p1MouseUp(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
 procedure p2MouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
 procedure p2MouseUp(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
 procedure p3MouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
 procedure p3MouseUp(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
 procedure p4MouseUp(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
 procedure p4MouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
 procedure p5MouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
 procedure p5MouseUp(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
 procedure N1Click(Sender: TObject);
 procedure N2Click(Sender: TObject);
 procedure N4Click(Sender: TObject);
 procedure FormDestroy(Sender: TObject);
private
 { Private declarations }
 procedure start; //начало теста
 procedure question_select; //выбор вопроса
 procedure vars(var variant: integer); {сортировка и определение правильного варианта ответа}
 procedureverno(); {проверка: правильно ли ответил пользователь}
public
 { Public declarations }
end;
var
 Form1: TForm1;
 i, a, n, balls, vopr: integer; {различные счетчики и переменные для подсчета баллов}
 dir, dir2, ss, zz, yes: string; {путь к файлу с вопросами, к программе и расшифрованной базе}
 win: TIniFile; //переменная для работы с ini-файлами
 mass: array[1..100] of integer; {содержит номера уже заданных вопросы, чтобы они не повторялись}
 f1, f2: file of char; //переменные для работы с файлами
 сор: char; //для работы с каждым символом отдельно
implementation
{$R *.dfm}
procedure TForm1.vars(var variant: integer);
begin
 //вызываем процедуру выбора случайного вопроса question_select();
 case variant of
 1:
  begin
   Win:= TIniFile.Create(dir2); //открываем ini-файл
   //считываем вопрос
   Memo1.Text:= Win.ReadString('Q', IntToStr(a), Memo1.Text);
   //считываем правильный вариант ответа
   an1.Caption:= Win.ReadString('A', IntToStr(a), an1.Caption);
   //считываем три неверных варианта к данному вопросу
   an2.Caption:= Win.ReadString('W1', IntToStr(a), an2.Caption);
   an3.Caption:= Win.ReadString('W2', IntToStr(a), an3.Caption);
   an4.Caption:= Win.ReadString('W3', IntToStr(a), an4.Caption);
   Win.Free; //освобождаем ini-файл
   //помечаем первый вариант как правильный
   yes:= an1.Caption;
  end;
 2:
  begin
   Win:= TIniFile.Create(dir2);
   Memo1.Text:= Win.ReadString('Q', IntToStr(a), Memo1.Text);
   an2.Caption:= Win.Readstring('A', IntToStr(a), an2.Caption);
   an1.Caption:= Win.Readstring('W1', IntToStr(a), an1.Caption);
   an3.Caption:= Win.ReadString('W2', IntToStr(a), an3.Caption);
   an4.Caption:= Win.ReadString('W3', IntToStr(a), an4.Caption);
   Win.Free;
   yes: = an2.Caption;
  end;
 3:
  begin
   Win:= TIniFile.Create(dir2);
   Memo1.Text:= Win.ReadString('Q', IntToStr(a), Memo1.Text);
   an3.Caption:= Win.ReadString('A', IntToStr(a), an3.Caption);
   an2.Caption:= Win.ReadString('W1', IntToStr(a), an2.Caption);
   an1.Caption:= Win.ReadString('W2', IntToStr(a), an1.Caption);
   an4.Caption:= Win.ReadString('W3', IntToStr(a), an4.Caption);
   Win.Free;
   yes:= an3.Caption;
  end;
 4:
  begin
   Win:= TIniFile.Create(dir2);
   Memo1.Text:= Win.ReadString('Q', IntToStr(a), Memo1.Text);
   an4.Caption:= Win.ReadString('A', IntToStr(a), an4.Caption);
   an2.Caption:= Win.ReadString('Wl', IntToStr(a), an2.Caption);
   an3.Caption:= Win.ReadString('W2', IntToStr(a), an3.Caption);
   an1.Caption:= Win.ReadString('W3', IntToStr(a), an1.Caption);
   Win.Free;
   yes:= an4.Caption;
  end;
 end;
end;
procedure TForm1.start();
begin
 Randomize; //Включаем генератор случайных чисел
 for i:=1 to n do mass[i] := 0; //n – количеству вопросов
 {$I-} //отключаем контроль ошибок ввода/вывода.
 //делаем все элементы видимыми для пользователя
 Memo1.Visible:= True;
 RadioGroup1.Visible:= True;
 Label1.Visible:= True;
 an1.Visible:= True;
 an2.Visible:= True;
 an3.Visible:= True;
 an4.Visible:= True;
 p1.Visible:= True;
 p2.Visible:= False;
 p3.Visible:= False;
 p4.Visible:= False;
 p5.Visible:= False;
 balls:= 0;
 Label2.Visible:= False; //прячем результаты
 Label1.Caption:= 'Первый вопрос:';
 dir2:= 'C:base.bsd'; //путь к расшифрованной базе
 //копируем зашифрованную базу на диск С:
 CopyFile(PChar(ss), PChar(dir2), True);
 //связываем переменную f1 с зашифрованным ini-файлом
 AssignFile(f1, ss);
 //связываем переменную f2 с файлом C:base.bsd
 AssignFile(f2, dir2);
 Reset(f1); //открываем первый файл на чтение
 Rewrite(f2); //второй – на запись
 while not Eof(fl) do
 begin //пока не достигнут конец первого файла
  Read(f1, cop); //считываем один символ из файла
  сор:= Chr(Ord(cop) xor 101); //расшифровываем символ
  Write(f2, сор); //записываем расшифрованный символ в файл
 end;
 CloseFile(f1); //закрываем первый файл
 CloseFile(f2); //закрываем второй файл
 {$I+} //включаем контроль ошибок ввода/вывода
 Win:= TIniFile.Create(dir2); //работаем с ini-файлом
 //считываем количество вопросов в базе
 ss:= Win.ReadString('num', 'num', ss);
 //преобразовываем строку в число и записываем значение в n
 n:= StrToInt(ss);
 vopr:=Random(4) + 1;
//случайное число от 1 до 4
 vars(vopr); {передаем число процедуре vars, которая сортирует варианты ответов}
end;
procedure TForm1.question_seleсt();
label ran; //метка ran для быстрого перехода
begin
 Randomize;
ran:
 a:=Random(n); //выбираем случайный вопрос из базы
 //проверяем: не задавали ли мы этот вопрос ранее
 for i:=1 to n do
  if mass[i] = a then goto ran;
 for i:=1 to n do
  if mass[i] = 0 then begin
   mass[i]:= а; {записываем номер вопроса, чтобы не задавать его больше }
   Break;
  end;
 //сбрасываем флажки со всех вариантов ответов
 an1.Checked:= False;
 an2.Checked:= False;
 an3.Checked:= False;
 an4.Checked:= False;
end;
procedure TForm1.verno();
begin
 if an1.Checked then
  if yes = an1.Caption then balls:= balls + 1;
 if an2.Checked then
  if yes = an2.Caption then balls:= balls + 1;
 if an3.Checked then
  if yes = an3.Caption then balls:= balls + 1;
 if an4.Checked then
  if yes = an4.Caption then balls:= balls + 1;
end;
procedure TForm1.N2Click(Sender: TObject);
begin
 Randomize;
 //начинаем обзор с текущего каталога
 Open1.InitialDir:= GetCurrentDir;
 if not Open1.Execute then ShowMessage('Вы не выбрали файл!')
 else begin
  ss:= Open1.FileName; //открываем выбранный файл
  zz:= ss; //запоминаем путь к базе
  start(); //начинаем тест
 end;
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
 Randomize;
 //получаем каталог, в котором находится наша программа
 dir:= GetCurrentDir;
 ss:= dir + 'comp.ini'; //путь к базе вопросов
 zz:= ss;
 start(); //начинаем тест
end;
procedure TForm1.p1Click(Sender: TObject);
begin
 Label1.Caption:= 'Второй вопрос:';
 verno(); //принимаем вариант ответа
 p1.Visible:= False; //убираем первую панель
 р2.Visible:=True; //активизируем вторую панель
 vopr:= Random(4) +1; //выбираем случайный вариант ответа
 vars(vopr); //задаем вопрос
end;
procedure TForm1.p2Click(Sender: TObject);
begin
 Label1.Caption:= 'Третий вопрос:';
 verno();
 p2.Visible:= False;
 p3.Visible:= True;
 vopr:= Random(4) + 1;
 vars(vopr);
end;
procedure TForm1.p3Click(Sender: TObject);
begin
 Label1.Caption:= 'Четвертый вопрос:';
 verno();
 р3.Visible:= False;
 p4.Visible:= True;
 vopr:= Random(4) + 1;
 vars(vopr);
end;
procedure TForm1.p4Click(Sender: TObject);
begin
 Label1.Caption:= 'Пятый вопрос:';
 verno();
 p4.Visible:= False;
 p5.Visible:= True;
 vopr:= Random(4) + 1;
 vars(vopr);
end;
procedure TForm1.p5Click(Sender: TObject);
begin
 //проверяем правильность ответа на последний вопрос
 verno() ;
 //узнаем, сколько баллов набрал пользователь
 ss:= IntToStr(balls);
 //делаем почти все компоненты невидимыми
 Memo1.Visible:= False;
 р5.Visible:= False;
 RadioGroup1.Visible:= False;
 Label1.Visible:= False;
 an1.Visible:= False;
 an2.Visible:= False;
 an3.Visible:= False;
 an4.Visible:= False;
 Label2.Visible:=True;//показываем метку с результатом
 Label2.Align:= alClient;//растягиваем ее на всю форму
 //Отображаем процент правильных ответов
 Label2.Caption:= 'Правильных ответов' + IntToStr(balls*(100 div 5))+'%';
end;
procedure TForm1.N4Click(Sender: TObject);
begin
 Halt; //выход из программы
end;
procedure TForm1.p1MouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
begin
 p1.BevelInner:= bvLowered;
 p1.BevelOuter:= bvRaised;
end;
procedure TForm1.p1MouseUp(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
begin
 p1.BevelInner:=bvRaised;
 p1.BevelOuter:=bvLowered;
end;
procedure TForm1.p2MouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
begin
 p2.BevelInner:= bvLowered;
 p2.BevelOuter:= bvRaised;
end;
procedure TForm1.p2MouseUp(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
begin
 p2.BevelInner:=bvRaised;
 p2.BevelOuter:=bvLowered;
end;
procedure TForm1.p3MouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
begin
 p3.BevelInner:= bvLowered;
 p3.BevelOuter:= bvRaised;
end;
procedure TForm1.p3MouseUp(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
begin
 p3.BevelInner:=bvRaised;
 p3.BevelOuter:=bvLowered;
end;
procedure TForm1.p4MouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
begin
 p4.BevelInner:= bvLowered;
 p4.BevelOuter:= bvRaised;
end;
procedure TForm1.p4MouseUp(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
begin
 p4.BevelInner:=bvRaised;
 p4.BevelOuter:=bvLowered;
end;
procedure TForm1.p5MouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
begin
 p5.BevelInner:= bvLowered;
 p5.BevelOuter:= bvRaised;
end;
procedure TForm1.p5MouseUp(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
begin
 p5.BevelInner:=bvRaised;
 p5.BevelOuter:=bvLowered;
end;
procedure TForm1.N1Click(Sender: TObject);
begin
 Randomize;
 ss:= zz;
 start(); //начало теста
end;
procedure TForm1.FormDestroy(Sender: TObject);
begin
 DeleteFile('c:base.bsd'); //удаляем расшифрованную базу
end
end.

? Все файлы проекта и исполняемый файл рассмотренной программы находятся на прилагаемом к книге компакт-диске в папке Chapter_13.

Оглавление книги


Генерация: 0.145. Запросов К БД/Cache: 0 / 0
поделиться
Вверх Вниз