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

Министерство образования Украины

Харьковскийгосударственный технический университет радиоэлектроники


Кафедра ПО ЭВМ

 

Курсовой проект по дисциплине:

«Основы программирования иалгоритмические языки»

Тема:

«Разработка интерактивной среды обученияработе в 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.

еще рефераты
Еще работы по информатике, программированию