Розробка інтерактивного середовища навчання роботі в 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 :='';< br />
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" !!!');< br />
dec (x, 3);
if x
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 ,'');< br />
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
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 :=[];< br />
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 ,'');< br />
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 qclwhite 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
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.