Каталог :: Программирование и комп-ры

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

                        Министерство образования Украины                        
Харьковский государственный технический университет радиоэлектроники
                              Кафедра ПО ЭВМ                              
                         Курсовой проект по дисциплине:                         
            «Основы программирования и алгоритмические языки»            
                                      Тема:                                      
    «Разработка интерактивной среды обучения работе в Borland Delphi»    
     

Работу выполнил:

Ст. гр. ИПД-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] 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. Во второй части работы рассмотрены типизированные константы в Паскале, их применение. Даны примеры программ.

Перечень ссылок

1. Культин Н. Delphi 4. Программирование на Object Pascal. BHV, Санкт-Петербург, 1999. – 480 с., ил. 2. Дэн Оузьер и др. Delphi 3. Освой самостоятельно. М.: “Издательство БИНОМ”, 1998 г. – 560 с.: ил. 3. Бондарев В. М., Рублинецкий В. И., Качко Е. Г. Основы программирования. Харьков: Фолио; Ростов н/Д: Феникс, 1998 – 368 с. 4. Справочная система Delphi 5. Фаронов В. В. Delphi 4. Учебный курс. М.: «Нолидж», 1999 – 464 с., ил.

Приложение А

Ниже дан исходный код всех модулей программы unit Mainfrm; 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 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: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} 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:^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; 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.