Разработка интерактивной среды обучения

работе в Borland Delphi

Введение

На Земле каждый час увеличивается количество компьютеров. Они работают с

Программами, количество которых тоже растет. Написаны все программы с

Использованием разных языков программирования – С++, Delphi, Assembler. Изучение

Таких языков мало уступает по сложности изучению обычных, человеческих. Это

Очень сложный и трудоемкий процесс.

Для его облегчения и упрощения создаются различные обучающие программы.

Компьютер учит человека. Такой “учитель” никогда не устает, всегда объективен,

Не обижается…

В данной работе представлена подобная программа, способная (как мне кажется),

Обучить начинающего программиста основам визуальной среды Delphi и языка

Паскаль.

1 Описание программы

1. 1 Основные характеристики

Рассматриваемая программа имеет возможность использования уроков, хранящихся в

Файлах, что позволяет создавать уроки, не изменяя кода программы.

Файл урока представляет собой текстовый файл с расширением. LES; в нем сдержится

Текст урока и специальные команды, заставляющие программу, выполнять некоторые

Действия, например, выводить текст таким-то цветом, изменять размер шрифта,

Вставлять картинки. Описание команд будет приведено ниже.

1. 2 Руководство для пользователя

Выполняемый файл называется LD. EXE. После его запуска на экране появляется

Окно.

По нему “ползет” надпись: “Добро пожаловать в программу Learn Delphi!!!”. Для

Входа в программу надо нажать кнопку “ОК”. Следующее окно показано на рис. 1. 2:

Рисунок 1. 2 – Окно выбора нужного урока

Пользователь выбирает нужный ему урок и нажимает кнопку “Загрузить”. После этого

Он видит основное окно, в которое загружена первая страница урока. Это окно

Представлено на рис. 1. 3 (стр. 8).

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-версией,

Поэтому вообще в уроке допускается лишь одна логическая команда.

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. При этом и распознаются команды.

4. 3 Перспективы

Данная программа, как мне кажется, является довольно перспективным “прожектом”.

В следующих версиях программы, которые, несомненно, появятся, будут

Усовершенствованы возможности тестирования, добавятся несколько логических и

Графических команд, а чуть позже – и специальный редактор для упрощения создания

Уроков.

Кроме того, используя возможности Windows, можно будет “заставить” обучалку

Взаимодействовать с системой программирования Delphi, что повысит наглядность

Примеров и тогда Learn Delphi способна будет готовить неплохих специалистов в

Области компьютерных технологий.

Но и это еще не все! LD – универсальная система, в файл урока можно записать

Что-угодно, так что применять это средство можно и для обучения другим

Предметам, даже несколько удаленным от информатики, как, например, история,

Иностранные языки.

2 Типизированные константы

2. 1 Общая характеристика

Язык Паскаль, и, соответственно, Делфи, имеет специальный вид констант –

Типизированные. В отличие от обычных, констант, они могут содержать массивы,

Указатели, записи и значения процедурных типов. При установленной директиве

Компилятора {$J+} они ведут себя как обычные инициализированные переменные. При

{$J-} значения не могут изменяться.

Синтаксис: Const имя_константы: тип =значение

Пример:Const Max: integer=200

2. 2 Константы-массивы

Чтобы задать какую-либо константу-массив, нужно описать значения всех элементов.

Значения описываются в круглых скобках, через запятую. Например:

Const Digits: array[1..5] of byte=(1, 2, 3, 4, 5)

В данном примере объявляется константа-массив Digits типа Byte. Ей сразу

Присваиваются числа от 1 до 5.

Константы-массивы часто используются для задания строк, оканчивающихся символом

#0. В этом случае описание выглядит так:

Const Stroka: array[1..5] of char=(‘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.

Program Example1;

{$APPTYPE CONSOLE}

{Данная программа-пример демонстрирует применение констант-массивов. Преобразует

Численный формат даты в обычный, с названием месяца}

Uses

SysUtils;

Const month:array[1..12] of

String[20]=(‘January’,’February’,’March’,’April’,’May’,

‘June’,’July’,’August’,’September’,’October’,’November’, ‘December’);

Var d: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] of tpoint=((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.

Во второй части работы рассмотрены типизированные константы в Паскале, их

Применение. Даны примеры программ.

Приложение А

Ниже дан исходный код всех модулей программы

Unit Mainfrm;

Interface

Uses

Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,

ExtCtrls, StdCtrls;

Type

TfrmMain = class(TForm)

8518_1: T8518_;

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

Uses runfrm;

{$R *.DFM}

Var x:integer;

Procedure TfrmMain. Timer1Timer(Sender: TObject);

Var r:trect;

Begin

R. Left:=x;

R. Top:=150;

R. Bottom:=170;

R. Right:=frmmain. Width;

Frmmain. canvas. fillrect(r);

Frmmain. canvas. TextOut(x,151,’Добро пожаловать в программу “Learn Delphi” !!!’);

Dec(x,3);

If x<-720 then x:=frmmain. width

End;

Procedure TfrmMain. 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;

Procedure TfrmMain. 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; var Key: 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; var Action: 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.

Unit lessonfrm;

Interface

Uses

Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,

ExtCtrls, Buttons, StdCtrls;

Type

TfrmLesson = class(TForm)

Pic1:t8518_;

Pic2:t8518_;

Pic3:t8518_;

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}

Uses runfrm, resfrm;

Var f: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;

Procedure loadpage;

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;

Procedure drawpage;

Label 1;

Var s:string;

X, y:integer;

Npic:^t8518_;

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;

Procedure TfrmLesson. FormClose(Sender: TObject; var Action: TCloseAction);

Begin

Closefile(f);

If nq>0 then frmresult. show else frmrun. Show

End;

Procedure TfrmLesson. SpeedButton3Click(Sender: TObject);

Begin

Frmlesson. hide;

Frmresult. show

End;

Procedure TfrmLesson. 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;

Procedure TfrmLesson. FormShow(Sender: TObject);

Var s, 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;

Procedure TfrmLesson. FormDeactivate(Sender: TObject);

Begin

Nopaint:=true

End;

Procedure TfrmLesson. Timer1Timer(Sender: TObject);

Var q: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;

Procedure TfrmLesson. FormCreate(Sender: TObject);

Begin

Npq:=0;

Ap:=1;

Pp:=0;

Numpage:=1;

End;

Procedure TfrmLesson. cmdYesClick(Sender: TObject);

Begin

If ap=1 then inc(npq);

Frmlesson. cmdYes. enabled:=false;

Frmlesson. cmdno. enabled:=false;

End;

Procedure TfrmLesson. cmdNoClick(Sender: TObject);

Begin

If ap=2 then inc(npq);

Frmlesson. cmdYes. enabled:=false;

Frmlesson. cmdno. enabled:=false;

End;

Procedure TfrmLesson. 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;

Procedure TfrmLesson. SpeedButton1Click(Sender: TObject);

Var i: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;

Procedure TfrmLesson. 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; var Action: TCloseAction);

Begin

Action:=cahide;

Frmrun. Show

End;

End.


Разработка интерактивной среды обучения