Реферат: Разработка интерактивной среды обучения работе
Министерство образования Украины
Харьковскийгосударственный технический университет радиоэлектроники
Кафедра ПО ЭВМ
Курсовой проект по дисциплине:
«Основы программирования иалгоритмические языки»
Тема:
«Разработка интерактивной среды обученияработе в BorlandDelphi»
Работу выполнил:
Ст. гр. ИПД-99-1
Иванов А. В.
Руководитель:
Работа защищена с оценкой:
Комиссия:
доц. Ерохин А. Л.
доц. Четвериков Г. Г.
проф. Дударь З. В.
Харьков, 2000 г.
ХГТУРЭ
/>Кафедра ПО ЭВМЗадание
на курсовую работу по дисциплине «ОП иАЯ»
ст. гр. ИПД-99-1 Иванова А. В.
Тема: «Разработка интерактивной средыобучения работе в Borland Delphi»
І Разработатьинтерактивную среду обучения работе в Delphi,котрая имела бы такие возможности:
· Подавать учебный материал в наглядном виде
· Иметь возможности иллюстрирования
· Иметь средства для тестированияприобретенных знаний
ІІ Типизированныеконстанты. Их синтаксис и применение.
Дата выдачи задания: Дата защиты:
Студент: Иванов А. В.
Руководитель:
/>Реферат
Даннаяработа содержит 34 страницы, включая приложение; 2 таблицы; 4 иллюстрации.
Цельработы: создать, используя систему программированя Delphi, обучающую программу
Объектисследования: обучающая система, разработанная в Delphi 5, использующая дляхранения уроков текстовые файлы, подобные по структуре файлам HTML. В перспективе планируется объединение формата уроков с даннымформатом.
Ключевыеслова:
DELPHI,ОБУЧАЮЩАЯ СИСТЕМА, ТИПИЗИРОВАННЫЕ КОНСТАНЫ, ФОРМАТ ФАЙЛОВ УРОКОВ, ПЕРСПЕКТИВЫ
/>Содержание
Реферат… 3
Содержание… 4
Введение… 5
1 Описание программы… 6
1. 1 Основные характеристики… 6
1. 2 Руководство для пользователя… 6
1. 3 Описание команд формата .LES… 7
1. 3. 1 Текстовые команды… 8
1. 3. 2 Графические команды… 9
1. 3. 3 Логические команды… 10
1. 4 Описание внутренней структуры программы… 11
1. 4. 1 Общая организация… 11
1. 4. 2 Алгоритмы, достойные рассмотрения… 11
1. 4. 3 Перспективы… 12
2 Типизированные константы… 13
2. 1 Общая характеристика… 13
2. 2 Константы-массивы… 13
2. 3 Константы-записи… 14
2. 4 Процедурные константы… 15
2. 5 Константы-указатели… 16
2. 6 Примеры программ… 17
Выводы… 21
Перечень ссылок… 22
Приложение А… 23
/>Введение
НаЗемле каждый час увеличивается количество компьютеров. Они работают спрограммами, количество которых тоже растет. Написаны все программы сиспользованием разных языков программирования – С++, Delphi,Assembler. Изучение таких языков мало уступает по сложности изучениюобычных, человеческих. Это очень сложный и трудоемкий процесс.
Для его облегчения и упрощения создаются различные обучающие программы.Компьютер учит человека. Такой «учитель» никогда не устает, всегда объективен,не обижается…
В данной работе представлена подобная программа, способная (как мнекажется), обучить начинающего программиста основам визуальной среды Delphi и языка Паскаль.
/>1Описание программы/>1. 1 Основныехарактеристики
Рассматриваемаяпрограмма имеет возможность использования уроков, хранящихся в файлах, чтопозволяет создавать уроки, не изменяя кода программы.
Файл урока представляет собой текстовый файл с расширением .LES; в нем сдержится текст урока и специальные команды,заставляющие программу, выполнять некоторые действия, например, выводить тексттаким-то цветом, изменять размер шрифта, вставлять картинки. Описание командбудет приведено ниже.
/>1. 2 Руководство дляпользователяВыполняемый файлназывается LD. EXE. После его запуска на экранепоявляется окно, показанное на рис. 1. 1
/>
Рисунок 1. 1 – Окно, возникающее после запуска
По нему «ползет» надпись: «Добро пожаловать в программу Learn Delphi!!!». Для входа в программу надо нажать кнопку«ОК». Следующее окно показано на рис. 1. 2:
/>
Рисунок1. 2 – Окно выбора нужного урока
Пользователь выбираетнужный ему урок и нажимает кнопку «Загрузить». После этого он видит основноеокно, в которое загружена первая страница урока. Это окно представлено на рис.1. 3 (стр. 8).
В правом нижнем углу окнапомещены три кнопки SpeedButton:
/>Переход напредыдущую страницу
/>
Переход на следующую страницу
/>
Выход из текущего урока (появляетсяокно выбора уроков).
/>1. 3 Описание командформата .LES
Как уже былосказано выше, данная программа имеет специальную систему команд. Они делятся натри типа:
· Текстовые
· Графические
· Логические.
Всекоманды предваряются символами /:, чтобы их можно былоотличить от обычного текста, выводимого на экран.
Все, что неимеет в начале символов /:будет выведено!
/>
Рисунок 1. 3 –Окно урока
/>1. 3. 1 Текстовыекоманды
Таблица1. 1 – Текстовые команды
/:size
размер шрифта
Устанавливает размер шрифта. Размер вводится сразу после команды.
Пример:
Таблица 1. 1 – Текстовые команды (продолжение)/:size
750
/:color
цвет
Устанавливает цвет выводимого текста. Поддерживает основные цвета: red, blue, black, yellow, green, grey.
Пример:
/:color
red
/:style
стиль
Устанавливает стиль выводимого текста:
1 – нормальный,
2 – полужирный,
3 – подчеркнутый,
4 – курсив,
5 – перечеркнутый.
Пример:
/:style
5
/:font
имя
Загружает другой шрифт.
Пример:
/:font
Times New Roman
/:newpage Дает знать системе, что дальше следует новая страница. />1. 3.2 Графические командыВданной версии программы имеется только одна графическая команда –/:picture, которая загружает ипомещает по указанным координатам картинку из файла вформате .BMP.
Синтаксис:
/:Picture
X-координатарисунка.
Y-координата. рисунка.
имяфайла рисунка
На однустраницу можно поместить до трех картинок. Этого в большинстве случаевдостаточно.
/>1. 3. 3 Логические командыЛогическая команда вданной версии тоже одна. Это /:question.
Синтаксис:
/:question
текствопроса
правильныйответ (1-«Да» 2-«Нет»)
Результатомвыполнения является присутствие на странице вопроса, обведенного двойнойкрасной рамкой. Справа, после текста вопроса, находятся две кнопки – «Да» и«Нет». Пользователь нажимает на кнопку, которая символизирует, по его, юзера, мненеию, правильный ответ и кнопки сразу становятся неактивными. Программапосчитывает количество правильных и неправильных ответов и в конце работывыставляет оценку.
На странице недопускается размещать больше одного вопроса!
Версия программы,представленная в курсовой работе является DEMO-версией, поэтому вообще в уроке допускается лишь одналогическая команда.
/>1. 4 Описание внутренней структуры программы/>1. 4. 1 Общаяорганизация
Программаимеет четыре окна: frmMain, frmRun, frmLesson и frmRes. В табл. 1. 2 представлены функции,выполняемые каждым из них:
Таблица 1. 2 Функции, выполняемые окнами в программе
Название окна Функции, которые выполняет в программе frmMain Данное окно появляется, когда пользователь запускает программу. Оно служит как-бы приглашением к работе. Показано данное окно на рис. 1. 1. FrmRun После frmMain пользователь попадает в окно frmRun. Здесь он может выбрать нужный урок и загрузить его или выйти из программы. Показано оно на рис. 1. 2. FrmLesson Основное окно для обучения. В нем выводится текст урока, все картинки и вопросы. В модуле этого окна описаны все подпрограммы для обработки файлов уроков. Показано это окно на рис. 1. 3. FrmRes После прохождения урока пользователь должен знать, как он усвоил материал. В данном окне помещена таблица с числом вопросов и правильных ответов. Это очнь простое окно, поэтому не представлено на рисунках. />1. 4. 2Алгоритмы, достойные рассмотренияОднимиз удачно реализованных алгоритмов автор считает реализацию распознаваниякоманд. В приложении А, в конце записки представлен исходный код программы, вкотором можно рассмотреть эти процедуры. Текст выводится в окне с помощьюобъекта Canvas. Это вызванонеобходимостью помещать картинки вперемежку с текстом. Проще всего реализуетсятакая идея с применением Canvas’a. Притестировании возникла проблема: при перерисовке окна (в случае временногоперекрытия другим окном и т. п.) объекты, выведенные спомощью Canvas’a, не перерисовывались. Исчезали крупные фрагменты текста. В конце-концов проблемарешена: запускается обработчик события OnPaint.
Каждаястраница урока загружается в специальную переменную (процедура LoadPage), а потом выводится на экран процедурой DrawPage. При этом и распознаются команды.
/>1. 4. 3 ПерспективыДаннаяпрограмма, как мне кажется, является довольно перспективным «прожектом». В следующих версиях программы,которые, несомненно, появятся, будут усовершенствованы возможноститестирования, добавятся несколько логических и графических команд, а чуть позже– и специальный редактор для упрощения создания уроков.
Крометого, используя возможности Windows, можно будет «заставить» обучалкувзаимодействовать с системой программирования Delphi, что повысит наглядностьпримеров и тогда Learn Delphi способна будет готовитьнеплохих специалистов в области компьютерных технологий.
Но иэто еще не все! LD – универсальная система, в файлурока можно записать что-угодно, так что применять это средство можно и дляобучения другим предметам, даже несколько удаленным от информатики, как,например, история, иностранные языки.
/>2 Типизированныеконстанты/>2. 1 Общаяхарактеристика
ЯзыкПаскаль, и, соответственно, Делфи, имеет специальный вид констант –типизированные. В отличие от обычных, констант, они могут содержать массивы,указатели, записи и значения процедурных типов. При установленной директивекомпилятора {$J+} они ведут себя какобычные инициализированные переменные. При {$J-}значения не могут изменяться.
Синтаксис:Const имя_константы:тип =значение
Пример: Const Max: integer=200
/>2.2 Константы-массивыЧтобы задать какую-либоконстанту-массив, нужно описать значения всех элементов. Значения описываются вкруглых скобках, через запятую. Например:
Const Digits: array[1..5] ofbyte=(1, 2, 3, 4, 5)
Вданном примере объявляется константа-массив Digitsтипа Byte. Ей сразу присваиваютсячисла от 1 до 5.
Константы-массивычасто используются для задания строк, оканчивающихся символом #0. В этом случае описание выглядит так:
Const Stroka: array[1..5] ofchar=(‘Hello’)
Константой может быть имногомерный массив. Для этого каждое его измерение помещается в круглые скобки.Пример:
type TCube = array[0..1, 0..1,0..1] of Integer;
const Maze: TCube = (((0, 1), (2,3)), ((4, 5), (6,7)))
Создается массив Maze, где:
Maze[0,0,0] = 0
Maze[0,0,1] = 1
Maze[0,1,0] = 2
Maze[0,1,1] = 3
Maze[1,0,0] = 4
Maze[1,0,1] = 5
Maze[1,1,0] = 6
Maze[1,1,1] = 7
Все константы-массивы не могут содержать файловыхпеременных ни на каком уровне.
/>2. 3Константы-записи
Длязадания константы-записи необходимо заполнить ее поля согласно синтаксису: Имя_поля:значение. Значения разделяются точками с запятой и все выражение помещаетсяв круглые скобки. Значения должны быть представлены константами. Поля должныбыть перечисленны в том порядке, в каком они размещены в описании записи.Поле-описатель, если такое есть, должно быть заполнено; в случае записи свариантами только вариант, выбранный описателем может использоваться.
Примеры:
type
TPoint = record
X, Y: Single;
end;
TVector = array[0..1] of TPoint;
TMonth = (Jan, Feb, Mar, Apr, May, Jun, Jul, Aug, Sep, Oct, Nov, Dec);
TDate = record
D: 1..31;
M: TMonth;
Y: 1900..1999;
end;
const
Origin: TPoint = (X: 0.0; Y: 0.0);
Line: TVector = ((X: -3.1; Y: 1.5), (X: 5.8; Y: 3.0));
SomeDay: TDate = (D: 2; M: Dec; Y: 1960);
Все константы-записи не могут содержать файловых переменных ни накаком уровне.
/>2. 4 Процедурные константыДляопределения процедурной константы нужна процедура с подходящими параметрами.Например:
function Calc(X, Y: Integer): Integer;
begin
...
end;
type TFunction = function(X, Y: Integer):Integer;
const MyFunction: TFunction = Calc;
Послетакого описания, функция вызывается:
I := MyFunction(5, 7)
Вытакже можете присвоить константе значение nil.
/>2. 5Константы-указателиТакиеконстанты содержат адрес в памяти переменной или подпрограммы. При ихобъявлении констант нужно следить за тем, чтобы адрес, на который онауказывает, использовался. Примеры:
Константасодержит адрес переменной:
const PI: ^Integer = @I;
Константасодержит адрес подпрограммы:
const PF: Pointer = @MyFunction;
Выможете объявить константу типа PChar сострочным значением, т. к. литералы хранятся в памяти как глобальныеконстанты.
Адресалокальных (размещенных в стеке) и динамических переменных не могут быть помещеныв подобную константу.
/>2. 6 Примеры программ
Нижеприведены примеры программ, использующих типизированные константы. Они написаныв Delphi, но в виде консольногоприложения – чтобы не загромождать текст программ описанием форм идругих объектов, к которым данная задача не имеет отношения.
Текстыпрограмм-примеров помещены на дискете с курсовой работой в директории EXAMPLES.
Пример 1.
programExample1;
{$APPTYPECONSOLE}
{Даннаяпрограмма-пример демонстрирует применение констант-массивов. Преобразуетчисленный формат даты в обычный, с названием месяца}
uses
SysUtils;
constmonth:array[1..12] of string[20]=('January','February','March','April','May','June','July','August','September','October','November', 'December');
vard:string[10];
s:string[30];
s1:string[3];
begin
write('Enter date (dd:mm:yyyy): ');
readln(d);
s:='';
if copy(d,1,1)<>'1' then begin
if copy(d,2,1)='1' then s1:='`st' else
if copy(d,2,1)='2' then s1:='`nd' else
if copy(d,2,1)='3' then s1:='`rd'
end else s1:='`th';
s:=copy(d,1,2)+s1+' of '+month[strtoint(copy(d,4,2))]+' ' +copy(d,7,4);
writeln(s);
readln
end.
Пример 2.
unit Example2frm;
{Этот примерпоказывает, как применяются константы-записи. Здесь строится многоугольник (сприменением метода Polylineобъекта Canvas), а координаты вершин многоугольникасодержатся в массиве констант-записей.}
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls,Forms, Dialogs, StdCtrls;
type
TForm1 = class(TForm)
Button1: TButton;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
PolyLines:array[1..4] oftpoint=((x:170;y:20),(x:320;y:320),(x:20;y:320), (x:170;y:20));
implementation
{$R *.DFM}
procedure TForm1.Button1Click(Sender: TObject);
begin
form1.Canvas.Pen.Width:=3;
form1.canvas.Polyline(polylines)
end;
end.
Окноэтой программы-примера приведено на рис. 2. 1 (стр. 20):
/>
Рисунок 2. 1– Окно программы-примера
/>Выводы
Вданной работе представлена образовательная программа, разработанная в средепрограммирования Borland Delphi 5. Кней прилагается файл урока, описывающего основы Delphi. Но вообще, эту систему обучения можно «заставить»обучать какой-угодно дисциплине – для этого достаточно создать файлы уроков изаписать их имена в файл конфигурации.
Впроцессе разработки программы детально изучены графические возможности Делфи иобъекта Canvas.
Вовторой части работы рассмотрены типизированные константы вПаскале, их применение. Даны примеры программ.
/>Переченьссылок
1. КультинН. Delphi4. Программированиена ObjectPascal. BHV, Санкт-Петербург,1999. – 480 с., ил.
2. ДэнОузьер и др. Delphi3. Освойсамостоятельно. М.: “Издательство БИНОМ”, 1998 г. – 560 с.: ил.
3.Бондарев В. М., Рублинецкий В. И., Качко Е. Г. Основы программирования.Харьков: Фолио; Ростов н/Д: Феникс, 1998 – 368 с.
4.Справочная система Delphi
5.Фаронов В. В.Delphi 4. Учебный курс. М.: «Нолидж», 1999 – 464 с., ил.
/>ПриложениеА
Ниже дан исходный код всех модулей программы
unitMainfrm;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
ExtCtrls, StdCtrls;
type
TfrmMain = class(TForm)
Image1: TImage;
Timer1: TTimer;
Button1: TButton;
procedure Timer1Timer(Sender: TObject);
procedure FormCreate(Sender: TObject);
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
frmMain: TfrmMain;
implementation
usesrunfrm;
{$R*.DFM}
varx:integer;
procedureTfrmMain.Timer1Timer(Sender: TObject);
varr:trect;
begin
r.Left:=x;
r.Top:=150;
r.Bottom:=170;
r.Right:=frmmain.Width;
frmmain.canvas.fillrect(r);
frmmain.canvas.TextOut(x,151,'Добро пожаловать в программу «LearnDelphi» !!!');
dec(x,3);
if x<-720 then x:=frmmain.width
end;
procedureTfrmMain.FormCreate(Sender: TObject);
begin
frmmain.canvas.Brush.Color:=clsilver;
frmmain.canvas.pen.color:=clblue;
x:=frmmain.width;
frmmain.canvas.font.name:='Times New Roman';
frmmain.canvas.font.size:=19;
frmmain.canvas.font.color:=clblue
end;
procedureTfrmMain.Button1Click(Sender: TObject);
begin
frmmain.hide;
frmrun.show;
end;
end.
unit runfrm;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics,Controls, Forms, Dialogs,
StdCtrls, checklst;
type
Tfrmrun = class(TForm)
lblessons: TListBox;
Label1: TLabel;
Button1: TButton;
Button2: TButton;
procedure FormClose(Sender: TObject; var Action:TCloseAction);
procedure FormCreate(Sender: TObject);
procedure lblessonsDblClick(Sender: TObject);
procedure lblessonsKeyPress(Sender: TObject; varKey: Char);
procedure Button2Click(Sender: TObject);
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
frmrun: Tfrmrun;
lessonname:string[40];
implementation
uses Mainfrm, lessonfrm;
{$R *.DFM}
type
tconfig=record
name:string[50];
filename:string[40];
end;
var names:array[1..100] of string[40];
procedure loadlesson;
begin
lessonname:=names[frmrun.lblessons.itemindex+1];
frmrun.hide;
frmlesson.show
end;
procedure Tfrmrun.FormClose(Sender: TObject; varAction: TCloseAction);
begin
halt;
end;
procedure Tfrmrun.FormCreate(Sender: TObject);
var f:file of tconfig;
lesson:tconfig;
n:byte;
begin
n:=0;
assignfile(f,'ld.cfg');
reset(f);
while not eof(f) do begin
inc(n);
read(f,lesson);
names[n]:=lesson.filename;
lblessons.Items.Add('Урок'+inttostr(n)+' '+lesson.name);
end;
closefile(f);
end;
procedure Tfrmrun.lblessonsDblClick(Sender: TObject);
begin
loadlesson;
end;
procedure Tfrmrun.lblessonsKeyPress(Sender: TObject;var Key: Char);
begin
if key=#13 then loadlesson
end;
procedure Tfrmrun.Button2Click(Sender: TObject);
begin
close
end;
procedure Tfrmrun.Button1Click(Sender: TObject);
begin
loadlesson;
end;
end.
unitlessonfrm;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
ExtCtrls, Buttons, StdCtrls;
type
TfrmLesson = class(TForm)
pic1:timage;
pic2:timage;
pic3:timage;
SpeedButton1: TSpeedButton;
SpeedButton2: TSpeedButton;
SpeedButton3: TSpeedButton;
cmdYes: TButton;
cmdNo: TButton;
procedure FormClose(Sender: TObject; var Action: TCloseAction);
procedure SpeedButton3Click(Sender: TObject);
procedure FormPaint(Sender: TObject);
procedure FormShow(Sender: TObject);
procedure FormDeactivate(Sender: TObject);
procedure Timer1Timer(Sender: TObject);
procedure FormCreate(Sender: TObject);
procedure cmdYesClick(Sender: TObject);
procedure cmdNoClick(Sender: TObject);
procedure SpeedButton2Click(Sender: TObject);
procedure SpeedButton1Click(Sender: TObject);
procedure FormActivate(Sender: TObject);
private
{ Private declarations }
public
nq,npq:byte;
end;
var
frmLesson: TfrmLesson;
implementation
{$R*.DFM}
usesrunfrm, resfrm;
varf:textfile;
textY:integer;
first,nopaint:boolean;
strpage:array[1..80]of string[80];
numpage,ap,np,sp,pp:byte;{прав. ответ; кол-во вопросов; правильных ответов}
pages:array[0..100]of byte;
fontemp:tfont;
pagefonts:array[1..100]of tfont;
procedureloadpage;
begin
pagefonts[numpage]:=frmlesson.canvas.font;
sp:=1;
inc(pp);
pages[pp]:=pages[pp-1];
while not eof(f) do begin
readln(f,strpage[sp]);
inc(sp);
inc(pages[pp]);
if strpage[sp-1]='/:newpage' then exit
end;
end;
proceduredrawpage;
label1;
vars:string;
x,y:integer;
npic:^timage;
q:tcolor;
i,n:byte;
w:tfontstyles;
r:trect;
temp:tfont;
begin
{ frmlesson.pic1.left:=0;}
frmlesson.Canvas.TextOut(3,3,'');
np:=1;
r.Left:=0;
r.Top:=0;
r.Right:=frmlesson.Width;
r.Bottom:=frmlesson.Height-80;
frmlesson.Canvas.FillRect(r);
if not nopaint then begin
npic:=@frmlesson.pic1;
frmlesson.pic1.hide;
frmlesson.pic2.hide;
frmlesson.pic3.hide
end;
frmlesson.canvas.fillrect(r);
i:=1;
while i<sp-1 do begin
s:=strpage[i];
inc(i);
if s='/:question' then begin
temp:=frmlesson.Canvas.Font;
frmlesson.Canvas.Font.Color:=clred;
frmlesson.Canvas.pen.Color:=clred;
r.Top:=texty;
r.Left:=3;
r.Right:=frmlesson.Width-10;
r.Bottom:=texty+38;
frmlesson.Canvas.Rectangle(r);
frmlesson.cmdyes.top:=texty+6;
frmlesson.cmdYes.Left:=frmlesson.width-170;
frmlesson.cmdno.top:=texty+6;
frmlesson.cmdno.Left:=frmlesson.width-90;
frmlesson.cmdYes.Show;
frmlesson.cmdno.show;
frmlesson.Canvas.Font:=temp;
s:=strpage[i];
frmlesson.Canvas.TextOut(5,texty+3,s);
ap:=strtoint(strpage[i+1]);
inc(texty,40);
inc(i,2)
end else
if s='/:picture' then begin
inc(i,3);
if nopaint then goto 1;
x:=strtoint(strpage[i-3]);
y:=strtoint(strpage[i-2]);
s:=strpage[i-1];
npic^.Enabled:=true;
npic^.Picture.LoadFromFile(s);
npic^.left:=x;
npic^.top:=y;
npic^.visible:=true;
if np=1 then begin
np:=2;
npic:=@frmlesson.pic2;
end else npic:=@frmlesson.pic3;
1:
end else
if s='/:size' then begin
n:=strtoint(strpage[i]);
inc(i);
frmlesson.canvas.Font.Size:=n
end else
if s='/:font' then begin
s:=strpage[i];
inc(i);
frmlesson.canvas.Font.Name:=s
end else
if s='/:style' then begin
n:=strtoint(strpage[i]);
inc(i);
case n of
1:w:=[];
2:w:=[fsbold];
4:w:=[fsitalic];
3:w:=[fsunderline];
5:w:=[fsstrikeout];
end;
frmlesson.canvas.Font.Style:=w
end else
if s='/:color' then begin
s:=strpage[i];
inc(i);
if s='black' then q:=clblack;
if s='red' then q:=clred;
if s='blue' then q:=clblue;
if s='green' then q:=clgreen;
if s='gray' then q:=clgray;
if s='yellow' then q:=clyellow;
frmlesson.canvas.font.Color:=q
end else
if s='/:newpage' then exit else begin
frmlesson.Canvas.TextOut(2,texty,s);
inc(texty,frmlesson.Canvas.Font.Size+10)
end;
end
end;
procedureTfrmLesson.FormClose(Sender: TObject; var Action: TCloseAction);
begin
closefile(f);
if nq>0 then frmresult.show else frmrun.Show
end;
procedureTfrmLesson.SpeedButton3Click(Sender: TObject);
begin
frmlesson.hide;
frmresult.show
end;
procedureTfrmLesson.FormPaint(Sender: TObject);
begin
texty:=2;
if first then begin
first:=false;
fontemp:=frmlesson.canvas.font;
drawpage
end else begin
nopaint:=true;
drawpage;
nopaint:=false
end
end;
procedureTfrmLesson.FormShow(Sender: TObject);
vars,name:string;
begin
nq:=0;
first:=true;
nopaint:=true;
assignfile(f,lessonname);
reset(f);
while not eof(f) do begin
readln(f,s);
if s='/:question' then inc(nq)
end;
closefile(f);
reset(f);
readln(f,name);
frmlesson.Caption:=name;
textY:=2;
loadpage;
frmlesson.Canvas.textout(20,20,'');
end;
procedureTfrmLesson.FormDeactivate(Sender: TObject);
begin
nopaint:=true
end;
procedureTfrmLesson.Timer1Timer(Sender: TObject);
varq:tcolor;
x,y:integer;
begin
{ if not frmlesson.Visible then exit;
x:=random(frmlesson.Width);
y:=random(frmlesson.Height);
if (x in [pic1.Left..pic1.Left+pic1.Width]) or (y in[pic1.Top..pic1.Top+pic1.Height]) then exit;
q:=frmlesson.canvas.pixels[x,y];
if q<>clwhite then begin
nopaint:=true;
texty:=1;
drawpage
end;
frmlesson.canvas.pixels[x,y]:=clred;}
end;
procedureTfrmLesson.FormCreate(Sender: TObject);
begin
npq:=0;
ap:=1;
pp:=0;
numpage:=1;
end;
procedureTfrmLesson.cmdYesClick(Sender: TObject);
begin
if ap=1 then inc(npq);
frmlesson.cmdYes.enabled:=false;
frmlesson.cmdno.enabled:=false;
end;
procedureTfrmLesson.cmdNoClick(Sender: TObject);
begin
if ap=2 then inc(npq);
frmlesson.cmdYes.enabled:=false;
frmlesson.cmdno.enabled:=false;
end;
procedureTfrmLesson.SpeedButton2Click(Sender: TObject);
begin
canvas.Rectangle(0,0,width,height);
pic1.Hide;
pic2.Hide;
pic3.Hide;
frmlesson.Repaint;
{ pic1.show;
pic1.hide; }
inc(numpage);
if not speedbutton1.enabled then speedbutton1.Enabled:=true;
frmlesson.cmdYes.hide;
frmlesson.cmdno.hide;
{ frmlesson.pic1.hide;}
frmlesson.pic2.hide;
frmlesson.pic3.hide;
texty:=1;
sp:=0;
loadpage;
drawpage;
if eof(f) then speedbutton2.Enabled:=false
end;
procedureTfrmLesson.SpeedButton1Click(Sender: TObject);
vari:byte;
q:integer;
s:string[100];
begin
pic1.Hide;
pic2.Hide;
pic3.Hide;
frmlesson.Repaint;
dec(numpage);
if not speedbutton2.enabled then speedbutton2.Enabled:=true;
closefile(f);
reset(f);
canvas.Font:=pagefonts[numpage];
if numpage=1 then begin
readln(f);
speedbutton1.Enabled:=false
end else begin
i:=0;
while i<numpage-1 do begin
readln(f,s);
if s='/:color' then begin
readln(f,s);
if s='black' then q:=clblack;
if s='red' then q:=clred;
if s='blue' then q:=clblue;
if s='green' then q:=clgreen;
if s='gray' then q:=clgray;
if s='yellow' then q:=clyellow;
frmlesson.canvas.font.Color:=q
end;
if s='/:name' then begin
readln(f,s);
canvas.Font.Name:=s
end;
if s='/:size' then begin
readln(f,q);
canvas.Font.Size:=q
end;
if s='/:newpage' then inc(i)
end
end;
{ for i:=1 to pages[pp-2] do readln(f);
for i:=1 to pp do pages[pp]:=0;
dec(pp,2);
if pp=0 then begin
readln(f);
frmlesson.canvas.Font:=fontemp;
end;}
frmlesson.cmdYes.hide;
frmlesson.cmdno.hide;
frmlesson.pic1.hide;
frmlesson.pic2.hide;
frmlesson.pic3.hide;
texty:=1;
sp:=0;
loadpage;
if pp=1 then speedbutton1.enabled:=false;
drawpage;
end;
procedureTfrmLesson.FormActivate(Sender: TObject);
begin
formcreate(sender);
end;
end.
unit resfrm;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics,Controls, Forms, Dialogs,
StdCtrls, Grids;
type
TfrmResult = class(TForm)
StringGrid1: TStringGrid;
Button1: TButton;
procedure FormActivate(Sender: TObject);
procedure Button1Click(Sender: TObject);
procedure FormClose(Sender: TObject; var Action:TCloseAction);
private
{ Private declarations }
public
{ Public declarations }
end;
var
frmResult: TfrmResult;
implementation
uses runfrm, lessonfrm;
{$R *.DFM}
procedure TfrmResult.FormActivate(Sender: TObject);
begin
with stringgrid1 do begin
colwidths[0]:=150;
cells[1,0]:='Количество';
cells[0,1]:='Вопросов';
cells[0,2]:='Правильных ответов';
cells[1,1]:=inttostr(frmlesson.nq);
cells[1,2]:=inttostr(frmlesson.npq);
end
end;
procedure TfrmResult.Button1Click(Sender: TObject);
begin
frmresult.Hide;
frmrun.Show
end;
procedure TfrmResult.FormClose(Sender: TObject; varAction: TCloseAction);
begin
action:=cahide;
frmrun.Show
end;
end.