Самарский государственный архитектурно-строительный университет.
Факультет информационных систем и технологий.
Кафедра прикладной математики и вычислительной техники.
Реферат
“Разработка интерактивной среды обучения для работы в Borland Delphi”
Выполнил: студент 1-го курса группы
ГИП 104 Шинкарёв Г.Г.
Проверил: профессор Пиявский С. А.
Декабрь 2004 г.
Содержание
Содержание 1
Введение 2
Описание программы 3
1 Основные характеристики 3
2 Руководство для пользователя 3
3 Описание команд формата .LES 4
3. 1 Текстовые команды 5
3. 2 Графические команды 6
3. 3 Логические команды 6
4 Описание внутренней структуры программы 7
4. 1 Общая организация 7
4. 2 Алгоритмы, достойные рассмотрения 8
4. 3 Перспективы 8
Выводы 9
Список литературы 10
Приложение 11
Введение
На Земле каждый час увеличивается количество компьютеров. Они работают с программами, количество которых тоже растет. Написаны все программы с использованием разных языков программирования – С++, Delphi, Assembler. Изучение таких языков мало уступает по сложности изучению обычных, человеческих. Это очень сложный и трудоемкий процесс.
Для его облегчения и упрощения создаются различные обучающие программы. Компьютер учит человека. Такой “учитель” никогда не устает, всегда объективен, не обижается…
В данной работе представлена подобная программа, способная (как мне кажется), обучить начинающего программиста основам визуальной среды Delphi и языка Паскаль.
Моей
главной задачей будет разработка образца интерактивной среды обучения работе в Delphi, котрая имела бы такие возможности:
Описание программы
Рассматриваемая программа имеет возможность использования уроков, хранящихся в файлах, что позволяет создавать уроки, не изменяя кода программы.
Файл урока представляет собой текстовый файл с расширением .LES; в нем сдержится текст урока и специальные команды, заставляющие программу, выполнять некоторые действия, например, выводить текст таким-то цветом, изменять размер шрифта, вставлять картинки. Описание команд будет приведено ниже.
2. Руководство для пользователя
Выполняемый файл называется LD. EXE. После его запуска на экране появляется окно, показанное на рис. 1. 1
Рисунок 1. 1 – Окно, возникающее после запуска
По нему “ползет” надпись: “Добро пожаловать в программу Learn Delphi!!!”. Для входа в программу надо нажать кнопку “ОК”. Следующее окно показано на рис. 1. 2:
Рисунок 1. 2 – Окно выбора нужного урока
Пользователь выбирает нужный ему урок и нажимает кнопку “Загрузить”. После этого он видит основное окно, в которое загружена первая страница урока. Это окно представлено на рис. 1. 3 (стр. 8).
В правом нижнем углу окна помещены три кнопки SpeedButton:
Переход на предыдущую страницу
Переход на следующую страницу
Выход из текущего урока (появляется окно выбора уроков).
3. Описание команд формата .LES
Как уже было сказано выше, данная программа имеет специальную систему команд. Они делятся на три типа:
Все команды предваряются символами /:, чтобы их можно было отличить от обычного текста, выводимого на экран.
Все, что не имеет в начале символов /: будет выведено!
Рисунок 1. 3 – Окно урока
Таблица 1. 1 – Текстовые команды
/:size размер шрифта |
Устанавливает размер шрифта. Размер вводится сразу после команды. Пример: /:size 750 |
Таблица 1. 1 – Текстовые команды (продолжение) |
|
/:color цвет |
Устанавливает цвет выводимого текста. Поддерживает основные цвета: red, blue, black, yellow, green, grey. Пример: /:color red |
/:style стиль |
Устанавливает стиль выводимого текста: 1 – нормальный, 2 – полужирный, 3 – подчеркнутый, 4 – курсив, 5 – перечеркнутый. Пример: /:style 5 |
/:font имя |
Загружает другой шрифт. Пример: /:font Times New Roman |
/:newpage |
Дает знать системе, что дальше следует новая страница. |
В данной версии программы имеется только одна графическая команда – /:picture, которая загружает и помещает по указанным координатам картинку из файла в формате .BMP.
Синтаксис:
/:Picture
X-координата рисунка.
Y-координата. рисунка.
имя файла рисунка
На одну страницу можно поместить до трех картинок. Этого в большинстве случаев достаточно.
Логическая команда в данной версии тоже одна. Это /:question.
Синтаксис:
/:question
текст вопроса
правильный ответ (1-"Да" 2-"Нет")
Результатом выполнения является присутствие на странице вопроса, обведенного двойной красной рамкой. Справа, после текста вопроса, находятся две кнопки – “Да” и “Нет”. Пользователь нажимает на кнопку, которая символизирует, по его, юзера, мненеию, правильный ответ и кнопки сразу становятся неактивными. Программа посчитывает количество правильных и неправильных ответов и в конце работы выставляет оценку.
На странице не допускается размещать больше одного вопроса!
Версия программы, представленная в данной работе является DEMO-версией, поэтому вообще в уроке допускается лишь одна логическая команда.
4. Описание внутренней структуры программы
Программа имеет четыре окна: frmMain, frmRun, frmLesson и frmRes. В табл. 1. 2 представлены функции, выполняемые каждым из них:
Таблица 1. 2 Функции, выполняемые окнами в программе
Название окна |
Функции, которые выполняет в программе |
frmMain |
Данное окно появляется, когда пользователь запускает программу. Оно служит как-бы приглашением к работе. Показано данное окно на рис. 1. 1. |
FrmRun |
После frmMain пользователь попадает в окно frmRun. Здесь он может выбрать нужный урок и загрузить его или выйти из программы. Показано оно на рис. 1. 2. |
FrmLesson |
Основное окно для обучения. В нем выводится текст урока, все картинки и вопросы. В модуле этого окна описаны все подпрограммы для обработки файлов уроков. Показано это окно на рис. 1. 3. |
FrmRes |
После прохождения урока пользователь должен знать, как он усвоил материал. В данном окне помещена таблица с числом вопросов и правильных ответов. Это очнь простое окно, поэтому не представлено на рисунках. |
4. 2 Алгоритмы, достойные рассмотрения
Одним из удачно реализованных алгоритмов автор считает реализацию распознавания команд. В приложении, в конце записки представлен исходный код программы, в котором можно рассмотреть эти процедуры. Текст выводится в окне с помощью объекта Canvas. Это вызвано необходимостью помещать картинки вперемежку с текстом. Проще всего реализуется такая идея с применением Canvas’a. При тестировании возникла проблема: при перерисовке окна (в случае временного перекрытия другим окном и т. п.) объекты, выведенные с помощью Canvas’a, не перерисовывались. Исчезали крупные фрагменты текста. В конце-концов проблема решена: запускается обработчик события OnPaint.
Каждая страница урока загружается в специальную переменную (процедура LoadPage), а потом выводится на экран процедурой DrawPage. При этом и распознаются команды.
Данная программа, как мне кажется, является довольно перспективным “прожектом”. В следующих версиях программы, которые, несомненно, появятся, будут усовершенствованы возможности тестирования, добавятся несколько логических и графических команд, а чуть позже – и специальный редактор для упрощения создания уроков.
Кроме того, используя возможности Windows, можно будет “заставить” обучалку взаимодействовать с системой программирования Delphi, что повысит наглядность примеров и тогда Learn Delphi способна будет готовить неплохих специалистов в области компьютерных технологий.
Но и это еще не все! LD – универсальная система, в файл урока можно записать что-угодно, так что применять это средство можно и для обучения другим предметам, даже несколько удаленным от информатики, как, например, история, иностранные языки.
В данной работе представлена образовательная программа, разработанная в среде программирования 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.