Delphi. Учимся на примерах - [23]
Поскольку в программе будет предусмотрена возможность динамической загрузки базы вопросов/ответов, нам понадобится диалоговое окно открытия файла. Для этого разместим на форме компонент OpenDialog категории Dialogs и присвоим ему имя Open1 (свойство Name). Кроме того, определите в свойстве Filter следующий фильтр: ini-файлы|*.ini|Все файлы|*.*.
Теперь разработаем меню программы. Для этого разместите на форме компонент MainMenu категории Standard и создайте меню в соответствии с рис. 13.1.
⇖ Разработка меню рассматривается в главе 6, "Программа просмотра рисунков".
Рис. 13.1. Меню для программы-теста
Полученная форма должна примерно соответствовать рис. 13.2.
Рис. 13.2. Форма программы-теста
Разработка программного кода
Для начала, объявим все глобальные переменные:
>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; //для работы с каждым символом отдельно
Добавим в раздел uses ссылку на модуль IniFiles, который потребуется для работы с классом TIniFile. Мы также разработаем четыре собственные процедуры. Объявим их как закрытые члены класса формы:
>type
>TForm1 = class(TForm)
> …
>private
> { Private declarations }
> procedure start; //начало теста
> procedure question_select; //выбор вопроса
> procedure vars(var variant: integer); {сортировка и определение правильного варианта ответа}
> procedureverno(); {проверка: правильно ли ответил пользователь}
>public
> { Public declarations }
>end;
Теперь создадим сами процедуры в разделе implementation. Процедура Start:
>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;
Эта процедура начинает игру. Сначала делаем все элементы видимыми и прячем метку, отображающую результат прохождения теста. Затем открываем файл, содержащий вопросы, и считываем из него по одному символу. Каждый байт расшифровывается особо и записывается в отдельный файл. Далее мы работаем с расшифрованным файлом как с обычным ini-файлом. Первое, что мы считываем, — это общее количество вопросов в базе.
Теперь очередь процедуры question_select:
>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;
Эта процедура случайным образом выбирает вопрос. Затем выполняется проверка: не задавался ли этот вопрос ранее. Если мы нашли вопрос, который еще не был задан, то задаем его и помечаем как уже заданный, чтобы не задавать его больше в текущей сессии.
В книге рассказывается история главного героя, который сталкивается с различными проблемами и препятствиями на протяжении всего своего путешествия. По пути он встречает множество второстепенных персонажей, которые играют важные роли в истории. Благодаря опыту главного героя книга исследует такие темы, как любовь, потеря, надежда и стойкость. По мере того, как главный герой преодолевает свои трудности, он усваивает ценные уроки жизни и растет как личность.
Сейчас во многих школах, институтах и других учебных заведениях можно встретить компьютеры старого парка, уже отслужившие свое как морально, так и физически. На таких компьютерах можно изучать разве что Dos, что далеко от реалий сегодняшнего дня. К тому же у большинства, как правило, жесткий диск уже в нерабочем состоянии. Но и выбросить жалко, а новых никто не дает. Различные спонсоры, меценаты, бывает, подарят компьютер (один) и радуются, как дети. Спасибо, конечно, большое, но проблемы, как вы понимаете, этот компьютер в общем не решает, даже наоборот, усугубляет, работать на старых уже как-то не хочется, теперь просто есть с чем сравнивать.
В книге рассказывается история главного героя, который сталкивается с различными проблемами и препятствиями на протяжении всего своего путешествия. По пути он встречает множество второстепенных персонажей, которые играют важные роли в истории. Благодаря опыту главного героя книга исследует такие темы, как любовь, потеря, надежда и стойкость. По мере того, как главный герой преодолевает свои трудности, он усваивает ценные уроки жизни и растет как личность.
В книге рассказывается история главного героя, который сталкивается с различными проблемами и препятствиями на протяжении всего своего путешествия. По пути он встречает множество второстепенных персонажей, которые играют важные роли в истории. Благодаря опыту главного героя книга исследует такие темы, как любовь, потеря, надежда и стойкость. По мере того, как главный герой преодолевает свои трудности, он усваивает ценные уроки жизни и растет как личность.
В книге рассказывается история главного героя, который сталкивается с различными проблемами и препятствиями на протяжении всего своего путешествия. По пути он встречает множество второстепенных персонажей, которые играют важные роли в истории. Благодаря опыту главного героя книга исследует такие темы, как любовь, потеря, надежда и стойкость. По мере того, как главный герой преодолевает свои трудности, он усваивает ценные уроки жизни и растет как личность.
Python - объектно-ориентированный язык сверхвысокого уровня. Python, в отличии от Java, не требует исключительно объектной ориентированности, но классы в Python так просто изучить и так удобно использовать, что даже новые и неискушенные пользователи быстро переходят на ОО-подход.