Языки и технологии программирования
значения корней системы уравнений, решаемой программой. Числа могут быть
как с дробной частью так и без неё.
В качестве выходных данных программа выдает на стандартное устройство
вывода информации пару чисел, представляющих собой истинное решение системы
уравнений в вещественной форме. В случае если количество знаков после
десятичной точки велико, то вывод производится в экспоненциальной форме.
Часть вторая.
Демонстрационная программа графических функций языка С++.
Общие сведения. Данная программа разработана как учебная и в силу
этого не имеет кодового обозначения предусмотренного ГОСТом 19.402-78 и
представляет собой исполняемый файл grafika.exe и файлов поддержки:
Таблица 1.
|Egavga.bgi |библиотека взаимодействия с |
| |графическим адаптером |
|bold.chr |библиотека жирного шрифта |
|euro.chr |библиотека шрифта «euro» |
|goth.chr |библиотека готического шрифта |
|lcom.chr |библиотека шрифта типа |
| |«Комплекс» |
|litt.chr |библиотека шрифта типа «small» |
|sans.chr |библиотека шрифта типа |
| |«Сан_сериф» |
|scri.chr |библиотека шрифта типа «Скрипт» |
|simp.chr |библиотека шрифта типа |
| |«Симплекс» |
|trip.chr |библиотека шрифта типа |
| |«Триплекс» |
|tscr.chr |библиотека шрифта тапа |
| |«Триплекс_Скрипт» |
Вышеприведенные файлы необходимо разместить в той же директории, что и
основной модуль.
Для функционирования программы необходима операционная система MS DOS
3.30 и выше или полностью совместимой с ней.
Исходный текст программы написан на языке программирования высокого
уровня С++ фирмы Borland версии 3.1 для DOS и WINDOWS и содержится в файле
grafika.срр в форме пригодной к использованию его как текстового документа
в среде ДОС. Исходный текст программы приведен в приложении 2.
Функциональное назначение. Программа предназначена для демонстрации
основных графических возможностей языка С++ в режиме VGA. Программа дает
представление о структуре графических возможностей языка и способах их
применения на практике. Функциональным ограничением программы является
невозможность её эксплуатации на компьютерах, оснащенных видеоадаптерами,
стандарт которых отличается от EGA-VGA.
Описание логической структуры. Программа не несет в себе единого
алгоритма в привычном понимании и поэтому блок-схема не приводится. Методы,
использованные при написании программы, не являются математическими или
прочими стандартными и будут описаны ниже при описании соответствующих
функций.
Структурно программа grafika.срр представляет ряд функций, которые
кратко описаны в таблице.2
Таблица.2
|наименование | |
|функции в |краткое описание |
|программе | |
|main |главная функция из которой вызываются все другие |
| |функции |
|demoline |функция демонстрации рисования линий с |
| |применением оператора lineto различными цветами |
|democircle |функция демонстрации рисования окружностей |
| |произвольного радиуса с произвольным выбором |
| |цвета и координат центра |
|demopix |функция рисования точек в произвольном месте |
| |экрана с произвольным цветом |
|demopieslice |функция рисования закрашенных секторов с |
| |произвольным расположением на экране, |
| |произвольным выбором угла, радиуса, стиля |
| |заполнения и цвета |
|demotext |функция демонстрации вывода текстовых данных в |
| |графическом режиме всеми доступными в языке С++ |
| |стандартными способами и шрифтами c применением |
| |библиотек шрифтов, перечисленных в таблице.1 |
|mainwindow |функция формирования на экране графического окна |
| |с указанным заголовком *header |
|drawborder |функция прорисовки границ графического экрана |
|statusline |функция формирования статусной строки с выводом |
| |сообщения *msg |
|demoarcs |функция вывода на экран дуг (частей окружностей) |
| |с произвольным начальным углом, цветом и |
| |координатами центра |
|demobars |функция вывода на экран определенного числа |
| |одинаковых прямоугольников с произвольно |
| |изменяющимся цветом |
|demo3dbars |функция демонстрации вывода на экран |
| |прямоугольных параллелепипедов произвольного |
| |размера, способа заполнения передней грани, и |
| |цвета, а так же расположения на экране |
|diagram |функция демонстрации практического применения |
| |функции void pieslice(...) языка С++ для |
| |построения круговой диаграммы по заданным |
| |параметрам |
|endpage |функция демонстрации практического применения |
| |рисования линий и секторов с циклически |
| |изменяющимися параметрами |
|endpage1 |функция практического применения операторов языка|
| |С++ для построения простого калейдоскопа |
|endpage2 |завершающая страница, сообщающая пользователю о |
| |завершении работы программы |
Кроме функций mainwindow и statusline все остальные функции не имеют
входных и выходных параметров. Функция mainwindow в качестве параметра
использует символьную строку передаваемую ей вызывающей функцией, также
действует и функция statusline. Все функции вывода изображения кроме
mainwindow, statusline, drawborder вызываются из главной функции по
порядку, а вышеперечисленные вызываются из функций вывода изображения.
Каждая функция вывода изображения вызывает функцию формирования
графического окна с необходимым заголовком а также определяет визуальные
границы экрана при помощи функции drawborder и помещает в нижнюю часть
экрана статусную строку при помощи функции statusline с необходимой
надписью. Затем начинается процесс вывода на экран самого изображения,
демонстрирующего работу той или иной графической функции языка С++. После
прекращения работы управление переходит в главную функцию, откуда
вызывается следующая функция вывода изображения.
В процессе работы программа использует файлы, приведенные в таблице.1
и в случае их отсутствия или недоступности функционирование программы будет
не полным (библиотеки шрифтов) или полностью невозможным (библиотека
взаимодействия с видеоадаптером).
Используемые технические средства. Для правильного функционирования
программы необходимо применять следующие компоненты аппаратного комплекса:
персональный компьютер класса Ix86 с 640Кб ОЗУ, оснащенный одним
накопителем на гибком магнитном диске 720Кб или накопителем типа
«винчестер», а так же видеоадаптером EGA или VGA
(предпочтительно).Компьютер рекомендуется оснастить видеомонитором,
соответствующим видеоадаптеру.
Вызов и загрузка. Для правильного функционирования программы
необходимо разместить основной модуль и сопутствующие файлы в одной
директории. Для вызова программы необходимо в командой строке ДОС набрать
полное имя основного модуля. Никаких параметров в командной строке не
требуется.
Входные и выходные данные. Данная программа является демонстрационной
и не использует входных данных от пользователя. Выходными данными являются
результаты работы функций по выводу изображений на экран. Параметры
изображения сохраняются только на экране в процессе работы программы
(данной функции).
Часть третья
Программа электронной записной книжки
Общие сведения. Данная программа разработана как учебная и в силу этого не
имеет кодового обозначения предусмотренного ГОСТом 19.402-78 и представляет
собой исполняемый файл notebook.exe и создаваемые ею в процессе работы
файлы данных пользователя, структура которых приводится в приложении 3.
Для функционирования программы необходима операционная система MS DOS
3.30 и выше или полностью совместимой с ней.
Исходный текст программы написан на языке программирования высокого
уровня Турбо Паскаль версии 7.0 фирмы Borland для DOS и WINDOWS с
применением библиотеки Turbo Vision и содержится в файле notebook.pas в
форме пригодной к использованию его как текстового документа в среде ДОС, и
приведен в приложении 3.
Функциональное назначение. Данная программа предназначена для ведения
файлов баз данных подобных страницам адресной записной книжки и способна
полностью заменить собой ее бумажных предшественников. Информация из файлов
программы применяется только в «электронном» варианте и не может быть
выведена на устройство печати (данная функция в программе отсутствует). В
процессе работы программа создает файл данных и поэтому пользователю не
требуется предварительно создавать его самому.
Описание логической структуры. Программа не несет в себе
определенного алгоритма в стандартном понимании, а является объектно-
ориентированной программой (применены специфические конструкции языка -
объекты).
В силу сложившихся традиций и особенностей языка Турбо Паскаль данная
программа представляет собой ряд процедур, выполняющих определенную роль и
взаимодействующих между собой в рамках исполнительного модуля. Каждая
функция выполняет определенное действие исходя из параметров полученных от
других функций или от пользователя.
Основной текст программы можно разделить на две части: первая - описание
переменных и объектов; вторая - реализация процедур. Ниже в таблице 3
приводятся процедуры, применяемые в программе, а в таблице 4 - объекты.
Таблица 3
|tdlgwin.handleEvent | |
|Tnotebook.FileOpen |открывает файл данных |
|Tnotebook.FileSave |сохраняет файл данных |
|Tnotebook.ChangeDir |изменяет текущий каталог |
|Tnotebook.DOSCall |временный выход в ДОС |
|Tinterior.ReadFile |читает содержимое файла данных в массив |
| |LINES |
|Tinterior.Draw |выводит данные в окно просмотра |
|Control |получает команду из основного диалогового|
| |окна |
|Tinterior.HandleEvent |основная процедура обработки событий и |
| |операций с файлом данных |
|DEleteItem |удаляет указанный в Location элемент |
| |данных |
|AddItem |добавляет новый или редактирует имеющийся|
| |элемент данных |
|SearchItem |осуществляет поиск необходимого элемента |
| |данных по контексту (первые символы) |
|Tnotebook.Work |создает окно, в которое в последствии |
| |будут выводиться данные |
|Tnotebook.HandleEvent |обработчик событий программы связанных с |
| |различными объектами |
|Tnootebook.InitMenuBar |создание верхнего Bar-меню |
|Tnotebook.InitStatusLin|формирование строки статуса |
|e | |
таблица 4.
|Tworkwin |объект-потомок от Twindow - стандартного |
| |объекта ТурбоВижн создает рамочное окно с|
| |полосами прокрутки для управления |
| |встроенным в него объектом Tinterior |
|Tdlgwin |объект-потомок от Tdialog - стандартного |
| |объекта ТурбоВижн создает диалоговое окно|
| |для выбора режима работы |
|Tinterior |объект-потомок от Tscroller - |
| |стандартного объекта ТурбоВижн |
| |обуславливает внутреннюю часть рамочного |
| |окна Tworkwin, создает прокручиваемое |
| |окно с записями из файла данных и с |
| |помощью диалогового окна Tdlgwin |
| |управляет работой с этими записями |
|Tnotebook |оъект-потомок от Taplication стандартного|
| |объекта ТурбоВижн обеспечивающего внешний|
| |вид прикладной программы. |
Используемые технические средства. Для правильного функционирования
программы необходимо применять следующие компоненты аппаратного комплекса:
персональный компьютер класса Ix86 с 640Кб ОЗУ, оснащенный одним
накопителем на гибком магнитном диске 720Кб или накопителем типа
«винчестер», а так же видеоадаптером EGA или VGA
(предпочтительно).Компьютер рекомендуется оснастить видеомонитором,
соответствующим видеоадаптеру.
Вызов и загрузка. Для вызова программы необходимо в командой строке
ДОС набрать полное имя основного модуля. Никаких параметров в командной
строке не требуется.
Входные и выходные данные. Входными и выходными данными для программы
является файл (файлы) данных пользователя и выводит информацию,
содержащуюся в них на экран дисплея.
Приложения
приложение 1
#include
#include
//описание переменных, используемых в программе
double pi=3.14,a=1.8,b=-2.0,c=0.1,d=1.6,e=0.9,eps=0.000001;
int i=0;
double x,y;
//описания функций решения методами Ньютона и простых итераций
extern double newton(double xn,double yn);
extern double iterac(double xn,double yn);
int main(void)
{
//запрос начального приближения у пользователя
scanf("%f",&x);
scanf("%f",&y);
//вывод результатов через вызовы функций на экран
printf ("Окончательное решение по методу Ньютона\n");
printf ("%g\t%g\n", newton(x,y));
printf ("Окончательное решение по методу итераций\n");
printf ("%g\t%g\n", iterac(x,y));
return (0);
}
//функция решения системы уравнений методом ньютона
double newton(double xn,double yn)
{
double f1,f2,xxn,yyn;
double df1dx,df1dy,df2dx,df2dy,dxy;
do
df1dy=b;
while (1);
b: return (xxn,yyn);
}
//решение системы уравнений методом простых итераций
double iterac(double xi, double yi)
{
double xxi,yyi;
do
//явное выражение переменной x
while(1);
c: return (xxi,yyi);
}
Приложение 2
//
#include
#include
#include
#include
#include
#include
#define NFONTS 11
char *Fonts[NFONTS] = {
"Default_Font", "Triplex_Font", "Small_Font",
"SansSerif_Font", "Gothic_Font", "Script_Font", "Simplex_Font",
"TriplexScript_Font",
"Complex_Font", "European_Font", "Bold_Font"
};
int xmax,ymax,i=0,MaxColors;
//
//прототипы функций
//
void demoline(void);
void democircle(void);
void demopix(void);
void demopieslice(void);
void demotext (void);
void MainWindow(char *header);
void DrawBorder(void);
void StatusLine(char *msg);
void demoarcs(void);
void demobars(void);
void demo3dbars(void);
void diagram(void);
void endpage(void);
void endpage1(void);
void endpage2(void);
//
//начало главной функции
//
int main(void)
{
/* автоматическое определение типа видеоадаптера */
int gdriver = DETECT, gmode, errorcode;
char msg[80];
// инициализация графических и локальных переменных
initgraph(&gdriver, &gmode, "");
xmax=getmaxx();
ymax=getmaxy();
// проверка результатов инициализации
errorcode = graphresult();
if (errorcode != grOk)
{
printf("Graphics error: %s\n", grapherrormsg(errorcode));
printf("Press any key to halt:");
getch();
exit(1);
}
//вызовы функций
demoline();
demopix();
demobars();
demo3dbars();
demopieslice();
diagram();
democircle();
demoarcs();
demotext();
endpage();
endpage1();
endpage2();
cleardevice();
closegraph();
return 0;
}
//
//функция демонстрации линий
//
void demoline(void)
{
//формирование графического окна и статусной строки
MainWindow( "Line demonstration" );
StatusLine( "Press any key to continue..." );
//процесс рисования линий
do
{
setcolor( random( MaxColors - random(15) ) + random(15) );
lineto (xmax,i);
lineto (xmax,ymax);
lineto (i,ymax);
lineto (i+1,i+1);
i=i+1;xmax=xmax-1;ymax=ymax-1;
}
while (xmax!=(xmax/2));
getch();
cleardevice();
clearviewport();
}
//
//функция демонстрации окружностей
//
void democircle(void)
//xmax=getmaxx();
//ymax=getmaxy();
{
MainWindow( "Circle demonstration" );
StatusLine( "Press any key to continue..." );
randomize();
moveto(random(xmax),random(ymax));
do
{
i++;
//установка случайного цвета
setcolor( random( MaxColors - random(15) ) + random(15) );
circle(random(getmaxx()),random(getmaxy()),random(100));
}
while( !kbhit() ); // повторение пока не нажата клавиша
getch();
clearviewport();
i=1;
do
{
i++;
setcolor( random( MaxColors - random(15) ) + random(15) );
circle(getmaxx()/2,getmaxy()/2,i);
if (i==400)
{setcolor(0);
do
{i--;circle(getmaxx()/2,getmaxy()/2,i);}
while(i!=0);}
}
while( !kbhit() ); // повторение пока не нажата клавиша
getch();
cleardevice();
}
//
//функция демонстрации рисования точек в произвольном //порядке
//
void demopix(void)
{
MainWindow( "Pix demonstration" );
StatusLine( "Press any key to continue..." );
do
{
i++;
setcolor( random( MaxColors - random(15) ) + random(15) );
putpixel(random(getmaxx()),random(getmaxy()),random(15));
}
while( !kbhit() ); // повторение пока не нажата клавиша
xmax=getmaxx();
ymax=getmaxy();
getch();
cleardevice();
}
//
//функция демонстрации рисования секторов
//
void demopieslice(void)
{
MainWindow( "Pie Chart Demonstration" );
StatusLine( "Press any key to continue..." );
do
{
i++;
setcolor(random( MaxColors - random(15) ) + random(15));
setfillstyle(random(12), getmaxcolor());
// setcolor(random( MaxColors - random(15) ) + random(15));
pieslice(random(getmaxx()),random(getmaxy()),
random(360),random(360),random(150));
if(i>1000) {clearviewport();i=0;}
}
while( !kbhit() ); // повторение пока не нажата клавиша
getch();
clearviewport();
}
//
//круговая диаграмма
//
void diagram(void)
{
int sektors[] = {20,10,35,15,20};
char *percent[]={"20%","10%","35%","15%","20%"};
int secsize,k=0,i,r=150;
MainWindow( "Pie Chart Demonstration" );
StatusLine( "Press any key to continue..." );
settextjustify(CENTER_TEXT,CENTER_TEXT);
settextstyle(5,0,2);//установка атрибутов текста
outtextxy( getmaxx()/2,25,"This is the pie chart diagramm");
//процесс рисования диаграммы по данным из массива
for( i=0;i10000) {clearviewport();i=0;}
}
while( !kbhit() ); // повторение пока не нажата клавиша
getch();
clearviewport();
i=0;
//рисование многоугольников с произвольным цветом
do
{
i++;
poly[0] = random(i+random(20));//1-вершина
poly[1] = random(random(ymax)/i+2);
poly[2] = xmax-(i+20); /* 2-я */
poly[3] = i+20;
poly[4] = xmax-(i+50); /* 3-я */
poly[5] = ymax-(i+20);
poly[6] = i+xmax/2; /* 4-я */
poly[7] = i+ymax/2;
/*
drawpoly автоматически не закрывает многоугольник
поэтому необходимо это сделать самому
*/
poly[8] = poly[0];
poly[9] = poly[1];
//рисует многоугольники, изменяя координаты вершин
setcolor(random( MaxColors - random(15) ) + random(15));
drawpoly(5, poly);
if(i>1000) {clearviewport();i=0;}
}
while( !kbhit() ); // повторение пока не нажата клавиша
getch();
clearviewport();
}
//
//функция демонстрации закрашеных многоугольников и //цветов
//
void demobars(void)
{
MainWindow( "Bars and colors demonstration" );
StatusLine( "Press any key to continue..." );
int kxb=15,kyb=15;
double stx,sty,x,y;
stx=floor(getmaxx()/kxb);
sty=floor(getmaxy()/kyb);
do
{
for(x=3;x100) {clearviewport();i=0;}
}
while( !kbhit() ); // повторение пока не нажата клавиша
getch();
clearviewport();
}
//
//функция создания завершающей страницы
//
void endpage(void)
{
MainWindow( "The cycle" );
StatusLine( "Press any key to continue..." );
int i,j,rad=50;
do
{
for (i=0;i 0 then
Rewrite(Datafile);
OpFileF := IOResult=0;
{$I+}
if OpFileF then
begin
DisableCommands(WinCom2);
EnableCommands(WinCom1);
Work {переход к работе}
end
end;
end; {caseControl}
Dispose(PF, Done) {уничтожение экземпляра}
end; {FileOpen}
{---------------------------}
procedure TNotebook.FileSave;
{закрывает файл данных}
begin
Close(DataFile);
OpFileF :=False;
EnableCommands(WinCom2); {разрешение открыть файл}
DisableCommands(WinCom1) {запрещение работы и сохранение}
end; {TNotebook.FileSave}
{--------------------------}
procedure TNotebook.ChangeDir;
{изменяет текущий каталог}
var
PD: PChDirDialog; {диалоговое окно смены каталога диска}
Control: Word;
begin
New(PD, Init(cdNormal,0)); {создание диалогового окна}
Control :=DeskTop^.ExecView(PD); {использование окна}
ChDir(PD^.DirInput^.Data^); {установка нового каталога}
Dispose(PD, Done) {удаление окна из кучи}
end; {TNotebook.ChangeDir}
{-------------------------}
procedure TNotebook.DOSCall;
{временный выход в дос}
const
txt='Для возврата введите EXIT в ответ'+
'на приглашение ДОС...';
begin
DoneEvents; {закрыть обработчик событий}
DoneVideo; {закрыть монитор экрана}
DoneMemory; {закрыть монитор памяти}
SetMemTop(HeapPtr); {освободить кучу}
writeln('Введите EXIT для возврата'); {выдать сообщение о
выходе}
SwapVectors; {установить стандартные векторы}
{передать упр. ком. процессору дос}
Exec(GetEnv('COMSPEC'),'');
{возврат из дос}
SwapVectors; {восстановить векторы}
SetMemTop(HeapEnd); {восстановить кучу}
InitMemory; {открыть монитор памяти}
InitVideo; {открыть монитор экрана}
InitEvents; {открыть обработчик событий}
InitSysError; {открыть обработчик ошибок}
Redraw {восстановить вид экрана}
end; {DOSCall}
{------------------------------}
constructor TInterior.Init;
{создает окно скроллера}
begin
TScroller.Init(Bounds, HS, VS);
ReadFile;
GrowMode :=gfGrowHiX+gfGrowHiY;
SetLimit(LLine, PS^.Count)
end;
{-----------------------}
destructor TInterior.Done;
begin
Dispose(PS,Done);
inherited Done
end;
{--------------------------}
procedure TInterior.ReadFile;
{читает содержимое файла данных в массив LINES}
var
k: Integer;
s: String;
Data: DataType;
f: text;
begin
PS:= New(PStringCollection, Init(100,10));
seek(DataFile,0);
while not (EOF(DataFile) or LowMemory) do
begin
Read(DataFile, data);
with data do
begin
s:= Name;
while Length(s) < Lname do
s:= s+' ';
s:= s+Phone;
while Length(s) < LName+LPhone do
s:= s+' ';
s:= s+Addr
end;
if s<>'' then PS^.Insert(NewStr(S))
end;
Location:= 0;
end; {ReadFile}
{----------------------------}
procedure Tinterior.Draw;
{выводит данные в окно просмотра}
var
n, {текущая строка экрана}
k: integer; {текущая строка массива}
B: TDrawBuffer;
Color: Byte;
p: PString;
begin
if Delta.Y>Location then
Location:= Delta.Y;
if Location>Delta.Y+pred(Size.Y) then
Location:= Delta.Y+pred(Size.Y);
for n:= 0 to pred(Size.Y) do
{Size.Y- кол-во строк окна}
begin
k:= Delta.Y+n;
if k=Location then
Color:= GetColor(2)
else
Color:= GetColor(1);
MoveChar(B,' ',Color,Size.X);
if kPS^.Count then
write(DataFile,Data) {да - добавляем в файл}
end
until Edit or (Control=cmCancel);
Draw
end; {AddItem}
{--------------------}
procedure SearchItem;
{ищет нужный элемент }
function UpString(s: String): string;
{преобразует строку в верхний регистр}
var
k: Integer;
begin
for k:=1 to Length(s) do
if s[k] in ['a'..'z'] then
s[k]:=chr(ord('A')+ord(s[k])-ord('a'))
else if s[k] in ['а'..'п'] then
s[k]:=chr(ord('A')+ord(s[k])-ord('a'))
else if s[k] in ['р'..'я'] then
s[k]:=chr(ord('P')+ord(s[k])-ord('p'));
UpString:=s
end; {UpString}
var
InWin: PDialog;
R: TRect;
s: String;
p: PInputLine;
k: Word;
begin {SearchItem}
R.Assign(15,8,65,16);
InWin:=New(PDialog,
Init(R,'Поиск записи:'));
with InWin^ do
begin
R.Assign(2,2,47,3);
p:=New(PInputLine,Init(R,50));
Insert(p);
R.Assign(1,1,40,2);
Insert(New(PLabel, Init(R, 'Введите образец поиска:',p)));
R.Assign(10,5,20,7);
Insert(New(PButton,Init(R,'Ввести',cmOK,bfDefault)));
R.Assign(25,5,35,7);
Insert(New(PButton,Init(R,'Выход',cmCancel,bfNormal)));
SelectNext(False)
end;
if DeskTop^.ExecView(InWin)=cmCancel then
exit;
s:=p^.Data^;
Location:=0;
while (UpString(s)>=UpString(PString(PS^.At(Location))^))
and (Location
inc(Location);
if (Location
ScrollTo(Delta.X,Location)
else
Draw
end; {SearchItem}
{------------------------}
var
R: TPoint;
label Cls;
begin
TScroller.HandleEvent(Event);
case Event.What of
evCommand:
case Event.Command of
cmClose:
begin
Cls:
case Control of {получить команду из основного диалогового окна}
cmCan,
cmCancel: EndModal(cmCancel);
cmEdit: AddItem(True);
cmDelete: DeleteItem;
cmSearch: SearchItem;
cmAdd: AddItem(False);
end
end;
cmZoom: exit;
end;
evMouseDown: {реакция на щелчок мыши}
begin
MakeLocal(MouseWhere, R); {получение в R локальные
координаты мыши}
Location:=Delta.Y+R.Y;
Draw
end;
evKeyDown: {реакция на клавиши + -}
case Event.KeyCode of
kbEsc: goto Cls;
kbGrayMinus: if Location
begin
dec(Location);
Draw
end;
kbGrayPlus: if Location
begin
inc (Location);
Draw
end;
end
end
end; {TInterior.HandleEvent}
{------------------------}
procedure Tnotebook.Work;
{работа с данными}
var
R: TRect;
PW: PWorkWin;
Control: Word;
begin
R.Assign(0,0,80,23);
PW:=New(PWorkWin, Init(R));
Control:=DeskTop^.ExecView(PW);
Dispose(PW,Done)
end;
{------------------------}
procedure TNotebook.HandleEvent(var Event: TEvent);
{обработчик событий программы}
begin {TNotebook.HandleEvent}
TApplication.HandleEvent(Event); {обработка станд. команд cmQuit и
cmMenu}
if Event.What=evCommand then
case Event.Command of
{обработка новых команд}
cmOpen: FileOpen; {открыть файл}
cmSave: FileSave; {закрыть файл}
cmChangeDir: ChangeDir; {сменить диск}
cmDOSShell: DOSCall; {временный выход в дос}
cmWork: Work; {Обработать данные}
else
exit {не обрабатывать другие команды}
end;
ClearEvent(Event) {очистить событие после обработки}
end; {TNotebook.HandleEvent}
{--------------------------------}
procedure TNotebook.InitMenuBar;
{соэдание верхнего меню}
var
R: TRect;
begin
GetExtent(R);
R.B.Y:=succ(R.A.Y); {R - координаты строки меню}
MenuBar:=New(PMenuBar, Init(R,
NewMenu( {создание меню}
{первый эл-т нового меню представляет собой
подменю. Создаем его}
NewSubMenu('~F~ Файл', hcNoContext,
{описываем элемент главного меню}
NewMenu( {создание подменю}
NewItem( {первый эл-т}
'~~ Открыть','F3',kbF3,cmOpen,hcNoContext,
NewItem( {второй эл-т}
'~~ Закрыть','F2',kbF2,cmSave,hcNoContext,
NewItem( {третий эл-т}
'~~ Сменить диск','',0,cmChangeDir,hcNoContext,
NewLine( {строка-разделитель}
NewItem('~~ Вызов ДОС','',0,cmDOSShell,hcNoContext,
NewItem('~~ Конец работы','Alt-X',kbAltX,cmQuit,hcNoContext,
NIL)))))) {нет других элементов подменю}
),
{создаем второй элемент главного меню}
NewItem('~W~ Работа','',kbF4,cmWork,hcNoContext,
NIL) {нет др. эл-тов гл. меню}
))))
end; {TNotebook.InitMenuBar}
{----------------------------}
procedure TNotebook.InitStatusLine;
{формирует строку статуса}
var
R:TRect; {границы строки статуса}
begin
GetExtent(R); {получаем в R координаты всего экрана}
R.A.Y:=pred(R.B.Y);
StatusLine:=New(PStatusLine,
Init(R, {создает строку статуса}
NewStatusDef(0, $FFFF, {устанавливает макс. диап. кон-
текстной справочной службы}
NewStatusKey('~Alt-X~ Выход',kbAltX,cmQuit,
NewStatusKey('~F2~ Закрыть',kbF2,cmSave,
NewStatusKey('~F3~ Открыть',kbF3,cmOpen,
NewStatusKey('~F4~ Работа',kbF4,cmWork,
NewStatusKey('~F10~ Меню',kbF10,cmMenu,
NIL))))), {нет других клавиш}
NIL) {нет др. определений}
));
DisableCommands(WinCom1) {запрещает недоступные команды}
end; {TNotebook.InitStatusLine}
{-----------------}
var
Nbook: TNotebook;
begin
Nbook.Init;
Nbook.Run;
Nbook.Done
end.
Страницы: 1, 2
|