Программа электронной записной книжки




 

Общие сведения. Данная программа разработана как учебная и в силу этого не имеет кодового обозначения предусмотренного ГОСТом 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.InitStatusLine формирование строки статуса

 

 

таблица 4.

Tworkwin объект-потомок от Twindow - стандартного объекта ТурбоВижн создает рамочное окно с полосами прокрутки для управления встроенным в него объектом Tinterior
Tdlgwin объект-потомок от Tdialog - стандартного объекта ТурбоВижн создает диалоговое окно для выбора режима работы
Tinterior объект-потомок от Tscroller - стандартного объекта ТурбоВижн обуславливает внутреннюю часть рамочного окна Tworkwin, создает прокручиваемое окно с записями из файла данных и с помощью диалогового окна Tdlgwin управляет работой с этими записями
Tnotebook оъект-потомок от Taplication стандартного объекта ТурбоВижн обеспечивающего внешний вид прикладной программы.

 

Используемые технические средства. Для правильного функционирования программы необходимо применять следующие компоненты аппаратного комплекса: персональный компьютер класса Ix86 с 640Кб ОЗУ, оснащенный одним накопителем на гибком магнитном диске 720Кб или накопителем типа «винчестер», а так же видеоадаптером EGA или VGA (предпочтительно).Компьютер рекомендуется оснастить видеомонитором, соответствующим видеоадаптеру.

Вызов и загрузка. Для вызова программы необходимо в командой строке ДОС набрать полное имя основного модуля. Никаких параметров в командной строке не требуется.

Входные и выходные данные. Входными и выходными данными для программы является файл (файлы) данных пользователя и выводит информацию, содержащуюся в них на экран дисплея.

 

Приложения

 

приложение 1

 

#include <stdio.h>

#include <math.h>

//описание переменных, используемых в программе

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

{

i++;

//описания исходных ураванений

f1=sin(xn+a)+b*yn+c;

f2=cos(yn+d)+e*xn;

//производные

df1dx=cos(xn+a);

df1dy=b;

df2dx=e;

df2dy=-sin(yn+d);

//якобиан системы

dxy=df1dx*df2dy-df1dy*df2dx;

//очередное значение х

xxn=xn-((f1*df2dy-f2*df1dy)/dxy);

//очередное значение y

yyn=yn+((f1*df2dx-f2*df1dx)/dxy);

//проверка точности решения и окончания счета

if (fabs(xxn-xn)<eps||fabs(yyn-yn)<eps) goto b;

//изменение текущих значений переменных х и у

xn=xxn; yn=yyn;

}

while (1);

b: return (xxn,yyn);

}

//решение системы уравнений методом простых итераций

double iterac(double xi, double yi)

{

double xxi,yyi;

do

{

i++;

//явное выражение переменной x

xxi=-cos(yi+d)/e;

//явное выражение переменной y

yyi=-(sin(xi+a)+c)/b;

//проверка точности решения и ококнчания счета

if (fabs(xxi-xi)<eps||fabs(yyi-yi)<eps) goto c;

//изменение текущих значений

xi=xxi;yi=yyi;

}

while(1);

c: return (xxi,yyi);

}

 

Приложение 2

 

 

//

#include <graphics.h>

#include <stdlib.h>

#include <stdio.h>

#include <conio.h>

#include <time.h>

#include <math.h>

#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;i<5;i++)

{

secsize = (360 * sektors[i])/100;

setfillstyle(i,i);

pieslice((getmaxx()/2),(getmaxy()/2),k,k+secsize,r);

k = k+secsize;

}

//подписи процентов

outtextxy(getmaxx()/2+r+30,getmaxy()/2-70,percent[0]);

outtextxy(getmaxx()/2,getmaxy()/2-r-30,percent[1]);

outtextxy(getmaxx()/2-r-30,getmaxy()/2,percent[2]);

outtextxy(getmaxx()/2,getmaxy()/2+r+30,percent[3]);

outtextxy(getmaxx()/2+r+20,getmaxy()/2+50,percent[4]);

 

getch();

settextstyle(0,0,0);

clearviewport();

}

//

//функция демонстрации текста в графическом окне

//

void demotext(void)

{

int midx,midy,i;

MainWindow("Demonstration text in the graphics screen");

StatusLine("Press any key to continue...");

settextjustify(CENTER_TEXT,CENTER_TEXT);

midx=getmaxx()/2;

midy=getmaxy()/2;

outtextxy(midx,midy-40,"This programm will demonstrate to you all graphics");

outtextxy(midx,midy+40,"functions of the C++ language");getch();clearviewport();

for (i=0;i<11;i++)

{

settextstyle(i,0,0);

outtextxy(midx,midy-40,"This text is write by ");

outtextxy(midx,midy+40,Fonts[i]);

getch();clearviewport();

}

settextstyle(0,1,1); //вывод вертикального текста

outtextxy(midx,midy,"This programm created by Grinjoff Mark");

settextstyle(0,0,0);/*возвращениеи исходного начертания текста */

getch();

clearviewport();

}

//

//функция демонстрации рисования дуг и многоугольников

//

void demoarcs(void)

{

int poly[10];

MainWindow("Arcs and polygons demonstration");

StatusLine("Press any key to continue...");

xmax=getmaxx();

ymax=getmaxy();

i=0;

//рисование дуг с произвольным расположением и цветом

do

{

i++;

setcolor(random(MaxColors - random(15)) + random(15));

arc(random(xmax),random(ymax),random(358),random(358),random(100));

if(i>10000) {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;x<getmaxx();x+=stx){

for(y=3;y<getmaxy();y+=sty){

setcolor(random(MaxColors - random(15)) + random(15));

setfillstyle(SOLID_FILL,random(getmaxcolor()));

bar(x+3,y+3,x+stx-3,y+sty-3);}}

}

while(!kbhit()); // повторение пока не нажата клавиша

getch();

clearviewport();

}

//

//функция демонстрации трехмерных прямоугольников

//

void demo3dbars(void)

 

{

int i;

 

MainWindow("3D Bars demonstration");

StatusLine("Press any key to continue...");

do

{

i++;

setcolor(random(MaxColors - random(15)) + random(15));

setfillstyle(random(5),random(getmaxcolor()));

bar3d(random(getmaxx()), random(getmaxy()),

random(getmaxx()), random(getmaxy()),10,1);

for(float j=0;j<50000;j++);//эмулятор задержки

if(i>100) {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<359;i++)

{

setcolor(random(MaxColors - random(15)) + random(15));

pieslice(60,60,i,i+1,rad);

pieslice(580,60,i,i+1,rad);

pieslice(60,390,i,i+1,rad);

pieslice(580,390,i,i+1,rad);

}

for (i=0;i<getmaxx();i++)

{

setcolor(random(MaxColors - random(15)) + random(15));

line(getmaxx()/2,10,i,getmaxy()/2);

line(getmaxx()/2,440,i,getmaxy()/2);

}

setcolor(0);

for (i=0;i<getmaxx();i++)

{

line(getmaxx()/2,10,i,getmaxy()/2);

line(getmaxx()/2,440,i,getmaxy()/2);

}

}

while(!kbhit()); // повторение пока не нажата клавиша

getch();

clearviewport();

}

//

//функция калейдоскопа

//

void endpage1(void)

{

MainWindow("The simple kaleidoscope");

StatusLine("Press any key for exit to DOS");

 

int koord1[4],koord2[4],koord3[4];

 

//получение координат исходной линии

koord1[0]=random((getmaxx()/2)+10);

koord1[1]=random((getmaxy()/2)+10);

koord1[2]=random((getmaxx()/2)+10);

koord1[3]=random((getmaxy()/2)+10);

//получение координат конечной линии

koord2[0]=random((getmaxx()/2)+10);

koord2[1]=random((getmaxy()/2)+10);

koord2[2]=random((getmaxx()/2)+10);

koord2[3]=random((getmaxy()/2)+10);

//прорисовка

do

{

for (float t=0;t<1;t=t+0.01) //количество линий

{

for (int l=0;l<4;l++) //нахождение координат движения //линии

{koord3[l]=floor(koord2[l]*(1-t)+koord1[l]*t);}

setcolor(random(MaxColors - random(15)) + random(15));

line(koord3[0],koord3[1],koord3[2],koord3[3]); //первая //четверть

line(getmaxx()-koord3[0],koord3[1],getmaxx()-koord3[2],koord3[3]);//вторая четверть

line(koord3[0],getmaxy()-koord3[1],koord3[2],getmaxy()-koord3[3]);//третья четверть

line(getmaxx()-koord3[0],getmaxy()-koord3[1],

getmaxx()-koord3[2],getmaxy()-koord3[3]);//четвертая четверть

}

for (int p=0;p<4;p++)//переприсвоение координат

{koord2[p]=koord1[p];}

//получение новых координат первой линии

koord1[0]=random(getmaxx()/2);

koord1[1]=random(getmaxy()/2);

koord1[2]=random(getmaxx()/2);

koord1[3]=random(getmaxy()/2);

}

while(!kbhit()); // повторение пока не нажата клавиша

getch();

clearviewport();

}

//

//последняя страница

//

void endpage2(void)

{

MainWindow("The end");

StatusLine("Press any key for exit to DOS");

do

{

settextstyle(BOLD_FONT,0,2);

outtextxy(getmaxx()/2,getmaxy()/2,"The end ");

}

while(!kbhit());

getch();

clearviewport();

}

 

//

//функция создания графического окна

//

void MainWindow(char *header)

{

int height;

xmax=getmaxx();

ymax=getmaxy();

cleardevice();//очистка экрана

setcolor(MaxColors - 2);//установка текущего цвета //белым

setviewport(0, 0, xmax, ymax, 1);//открыть окно во //весь экран

 

height = textheight("H");//установить начальную высоту //текста

 

settextjustify(CENTER_TEXT, TOP_TEXT);

outtextxy(xmax/2, 2, header);

setviewport(0, height+4, xmax, ymax-(height+4), 1);

DrawBorder();

setviewport(1, height+5, xmax-1, ymax-(height+5), 1);

 

}

//

//функция создания строки статуса в нижней части экрана

//

void StatusLine(char *msg)

{

int height;

xmax=getmaxx();

ymax=getmaxy();

setviewport(0, 0, xmax, ymax, 1); //открыть окно во //весь экран

 

setcolor(MaxColors - 1); //установка текущего цвета //черным

 

 

settextjustify(CENTER_TEXT, TOP_TEXT);

setlinestyle(SOLID_LINE, 0, NORM_WIDTH);

setfillstyle(EMPTY_FILL, 0);

 

height = textheight("H");//установка текущей высоты //текста

bar(0, ymax-(height+4), xmax, ymax);

rectangle(0, ymax-(height+4), xmax, ymax);

outtextxy(xmax/2, ymax-(height+2), msg);

setviewport(1, height+5, xmax-1, ymax-(height+5), 1);

}

//

//функция, образующая границу графического окна

//

void DrawBorder(void)

{

// struct viewporttype vp;

 

setcolor(MaxColors - 1);//установка текущего цвета //белым

 

setlinestyle(SOLID_LINE, 0, NORM_WIDTH);

 

// getviewsettings(&vp);

rectangle(0, 0, getmaxx(), getmaxy());

}

 

приложение 3

 

Program Notebook;

{программа обслуживает файлы данных "записной книжки".}

Uses App, Objects, Menus, Drivers, Views, StdDlg, DOS, Memory, Dialogs;

type

{объект TWorkWin создает рамочное окно с полосами прокрутки для

управления встроенным в него объектом TInterrior}

PWorkWin =^TWorkWin;

TWorkWin = object (TWindow)

Constructor Init(Bounds: Trect);

end;

 

{Объект TDlgWin создает диалоговое окно для выбора режима работы}

PDlgWin =^TDlgWin;

TDlgWin = object (TDialog)

Procedure HandleEvent (var Event: TEvent); Virtual;

end;

{Следующий объект обуславливает внутреннюю часть рамочного окна TWorkWin. Он

создает прокручиваемое окно с записями из архивного файла и с помощью диало-

гового окна TDlgWin управляет работой с этими записями}

PInterior =^Tinterior;

Tinterior = object (TScroller)

PS: PStringCollection;

Location: Word;

Constructor Init (var Bounds: TRect; HS, VS: PScrollBar);

Procedure Draw; Virtual;

Procedure ReadFile;

Destructor Done; Virtual;

Procedure HandleEvent (var Event: TEvent); Virtual;

end;

 

{объект-программа ТNotebook поддерживает работу с меню и строкой стстуса}

TNotebook = object (TApplication)

procedure InitStatusLine; virtual;

procedure InitMenuBar; virtual;

procedure HandleEvent (var Event: TEvent); virtual;

procedure FileSave;

procedure ChangeDir;

procedure DOSCall;

procedure FileOpen;

procedure Work;

end;

 

const

{Команды для обработчиков событий:}

cmChDir = 202;{сменить каталог}

cmWork = 203;{обработать данные}

cmDOS = 204;{временно выйти в дос}

cmCan = 205;{команда завершения работы}

cmDelete = 206;{уничтожить текущую запись}

cmSearch = 207;{искать нужную запись}

cmEdit = 208;{редактировать запись}

cmAdd = 209;{добавить запись}

{ножество временно недоступных команд:}

WinCom1: TCommandSet = [cmSave, cmWork];

WinCom2: TCommandSet = [cmOpen];

 

LName=25; {длина поля NAME}

LPhone=11; {---------- PHONE}

LAddr=40; {---------- ADDR}

LLIne=LName+LPhone+LAddr; {длина строки}

type

DataType = record {тип данных в файле}

Name: string [LName]; {имя}

Phone: string [LPhone];{телефон}

Addr: string [LAddr]; {адрес}

end;

var

DataFile: file of DataType; {файловая переменная}

OpFileF: Boolean; {флаг открытого файла}

 

{---------------------------------------------

реализация объекта TWorkWin

----------------------------------------------}

constructor TWorkWin.Init(Bounds: Trect);

{создание окна данных}

var

HS, VS: PScrollBar; {полосы-указатели}

Interior: PInterior; {указатель на управляемое текстовое окно}

begin

TWindow.Init(Bounds,'',0); {создание нового окна с рамкой}

GetClipRect(Bounds); {получение в BOUNDS кординаты минимальной перерисо-

вываемой части окна}

Bounds.Grow(-1,-1); {установка размеров окна с текстом}

{Включение стандартных по размеру и положению полос-уаказателей:}

VS:= StandardScrollBar(sbVertical+sbHandleKeyBoard);

HS:= StandardScrollBar(sbHorizontal+sbHandleKeyBoard);

{создание текстового окна:}

Interior:=New(Pinterior,Init(Bounds, HS, VS));

Insert(Interior) {включение его в основное окно}

end; {TWrkWin.Init}

{--------------------}

procedure TDlgWin.HandleEvent;

begin

inherited HandleEvent (Event);

if Event.What=evCommand then

EndModal(Event.Command)

end;

{--------------------}

procedure TNotebook.FileOpen;

{открывает файл данных}

var

PF: PFileDialog; {диалоговое окно выбора файла}

Control: Word;

s: PathStr;

begin

{создание экземпляра динамического объекта:}

New(PF, Init('*.dat','Выберите нужный файл:','Имя файла',fdOpenButton,0));

{с помощью следующего оператора окно выводится на экран и результат работы

пользователя с ним помещается в переменную Control:}

Control:=DeskTop^.ExecView(PF);

{анализ результата запроса:}

case Control of

StdDlg.cmFileOpen,cmOk:

begin {польов. указал имя файла:}

PF^.GetFileName(s); {s содержит имя файла}

Assign(DataFile,s);

{$I-}

Reset(DataFile);

if IOResult <> 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 k<pred(PS^.Count) then

begin

p:= PS^.At(k);

MoveStr(B, Copy(p^,Delta.X+1,Size.X),Color);

end;

writeline(0,N,Size.X,1,B)

end

end; {TInterior.Draw}

{-----------------------------}

Function Control: Word;

{получает команду из основного диал. окна}

const

x=1;

L=12;

DX=13;

But: array [0..4] of string [13]= {надписи на кнопках}

('~1~ Выход ','~2~ Убрать ','~3~ Искать ','~4~ Изменить ','~5~ Добавить ');

Txt: array [0..3] of string [52] = (

{справочный текст}

'Убрать - удалить запись, выделенную цветом',

'Искать - искать запись, начинающуюся с нужных букв',

'Изменить - изменить поле (поля) выделенной записи',

'Добавить - добавить новую запись');

var

R: TRect;

D: PDlgWin;

k: Integer;

begin

R.Assign(7,6,74,15);

D:=New(PDlgWin,Init(R, 'Выберите продолжение:'));

with D^ do

begin

for k:=0 to 3 do {вставляем поясняющий текст}

begin

R.Assign(1,1+k,65,2+k);

Insert(New(PStaticTEXT,Init(R,#3+Txt[k])))

end;

for k:=0 to 4 do {вставляем кнопки:}

begin

R.Assign(X+k*DX,6,X+k*DX+L,8);

Insert(New(PButton,

Init(R,But[k],cmCan+k,bfNormal)))

end;

SelectNext(False); {активизируем первую кнопку}

end;

Control:=DeskTop^.ExecView(D); {выполняем диалог}

end;{Conrol}

{------------}

Procedure TInterior.HandleEvent;

Procedure DeleteItem;

{удаляет указанный в Location эл-т данных}

var

D: Integer;

PStr: PString;

s: String;

Data: DataType;

begin

PStr:=PS^.At(Location); {получаем текущую запись}

s:=copy(PStr^,1,LName);

seek(DataFile,0);

D:=-1; {D-номер записи в файле}

repeat {цикл поиска по освпадению поля Name:}

inc(D);

read(DataFile,Data);

with Data do while Length(Name)<LName do

Name:=Name+' '

until Data.Name=s;

seek(DataFile,pred(FileSize(DataFile)));

read(DataFile,Data); {читает последнюю запись}

seek(DataFile,D);

write(DataFile,Data); {помещает ее на место удаляемой}

seek(DataFile,pred(FileSize(DataFile)));

truncate(DataFile); {удаляет последнюю запись}

with PS^ do D:=IndexOf(At(Location));

PS^.AtFree(D); {удаляет строку из коллекции}

Draw {обновляет окно}

end;{DeleteItem}

{----------------------}

procedure AddItem(Edit: Boolean);

{добавляет новый или редактирует элемент данных}

const

y=1;

dy=2;

L=LName+LPhone+LAddr;

var

Data: DataType;

R: TRect;

InWin: PDialog;

BName,BPhone,BAddr:PInputLine;

Control: Word;

OldCount: Word;

s: String;

p: PString;

begin

Seek(DataFile,FileSize(DataFile)); {добавяет записи в конец файла}

repeat {цикл ввода записей}

if Edit then {готовит заголовок}

s:='Редактирование'

else

begin

Str(FileSize(DataFile)+1,s);

while Length(s)<3 do

s:='0'+s;

s:='Вводится запись N'+s

end;

FillChar(Data,SizeOf(Data),' '); {заполняет поля пробелами}

R.Assign(15,5,65,16);

InWin:=New(PDialog, Init(R, s)); {создает окно}

with InWin^ do

begin {формируем окно:}

R.Assign(2,y+1,2+LName,y+2);

BName:=New(PInputline, Init(R,LName));

Insert(BName); {поле имени}

R.Assign(2,y,2+LName,y+1);

Insert(New(PLabel,

Init(R, 'Имя',BName)));

R.Assign(2,y+dy+1,2+LPhone,y+dy+2);

BPhone:=New(PInputLine,

Init(R,LPhone));

Insert(BPhone); {поле телеф.}

R.Assign(2,y+dy,2+LPhone,y+dy+1);

Insert(New(PLabel, Init(R, 'Телефон',BPhone)));

R.Assign(2,y+2*dy+1,2+LAddr,y+2*dy+2);

BAddr:=New(PInputLIne, Init(R,LAddr));

Insert(BAddr); {поле адреса}

R.Assign(2,y+2*dy,2+LAddr,y+2*dy+1);

Insert(New(PLabel, Init(R, 'Адрес',BAddr)));

{вставляем две комаедные кнопки}

R.Assign(2,y+3*dy+1,12,y+3*dy+3);

Insert(New(PButton, Init(R, 'Ввести',cmOK,bfDefault)));

R.Assign(2+20,y+3*dy+1,12+20,y+3*dy+3);

Insert(New(PButton, Init(R, 'Выход',cmCancel,bfNormal)));

SelectNext(False) {Активизируем 1-ую кнопку}

end; {конец формирования окна}

if Edit then with Data do

begin {готовим начальный текст}

p:=PS^.At(Location);{читает данные из записи}

s:=p^;

Name:=copy(s,1,LName);

Phone:=copy(s,succ(LName),LPhone);

Addr:=copy(s,succ(LName+LPhone),LAddr);

InWin^.SetData(Data) {вставляет текст в поля ввода}

end;

Control:=DeskTop^.ExecView(InWin); {выполняем диалог}

if Control=cmOK then with Data do

begin

if Edit then

DeleteItem; {удаляет старую запись}

Name:=BName^.Data^;

Phone:=BPhone^.Data^;

Addr:=BAddr^.Data^;

s[0]:=chr(L);

FillChar(s[1],L,' ');

move(Name[1],s[1],Length(Name));

move(Phone[1],s[succ(LName)],Length(Phone));

move(Addr[1],s[succ(LName+LPhone)],Length(Addr));

OldCount:=PS^.Count; {прежнее кол-во записей}

PS^.Insert(NewStr(s)); {добавляет в коллекцию}

{проверяем добавление}

if OldCount<>PS^.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<pred(PS^.Count)) do

inc(Location);

if (Location<Delta.Y+pred(Size.Y)) then

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<Delta.Y then

begin

dec(Location);

Draw

end;

kbGrayPlus: if Location<Delta.Y+pred(Size.Y) then

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.



Поделиться:




Поиск по сайту

©2015-2024 poisk-ru.ru
Все права принадлежать их авторам. Данный сайт не претендует на авторства, а предоставляет бесплатное использование.
Дата создания страницы: 2019-10-17 Нарушение авторских прав и Нарушение персональных данных


Поиск по сайту: