Рефераты - Афоризмы - Словари
Русские, белорусские и английские сочинения
Русские и белорусские изложения
 

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

Работа из раздела: «Программирование и комп-ры»

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



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



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


                       Курсовой проект по дисциплине:
              «Основы программирования и алгоритмические языки»

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

                                    [pic]
               Рисунок 1. 1 –  Окно, возникающее после запуска

      По нему «ползет» надпись: «Добро пожаловать в программу Learn
Delphi!!!». Для входа в программу надо нажать кнопку «ОК». Следующее окно
показано на рис. 1. 2:


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

      Пользователь выбирает нужный ему урок и нажимает кнопку «Загрузить».
После этого он видит основное окно, в которое загружена первая страница
урока. Это окно представлено на рис. 1. 3 (стр. 8).
      В правом нижнем углу окна помещены три кнопки SpeedButton:
Переход на предыдущую страницу

Переход на следующую страницу

Выход из текущего урока (появляется окно выбора уроков).



                      1. 3 Описание команд формата .LES


      Как уже было сказано выше, данная программа имеет специальную систему
команд. Они делятся на три типа:
 . Текстовые
 . Графические
 . Логические.
      Все команды предваряются символами /:, чтобы их можно было отличить
от обычного текста, выводимого на экран.
      Все, что не имеет в начале символов /: будет выведено!


                                    [pic]
                          Рисунок 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):

                                    [pic]

                    Рисунок 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 i0 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
ref.by 2006—2022
contextus@mail.ru