45920 (Языки и технологии программирования), страница 3
Описание файла
Документ из архива "Языки и технологии программирования", который расположен в категории "". Всё это находится в предмете "информатика" из , которые можно найти в файловом архиве . Не смотря на прямую связь этого архива с , его также можно найти и в других разделах. Архив можно найти в разделе "рефераты, доклады и презентации", в предмете "информатика, программирование" в общих файлах.
Онлайн просмотр документа "45920"
Текст 3 страницы из документа "45920"
Для функционирования программы необходима операционная система 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
#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
{
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) //изменение текущих значений переменных х и у 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) //изменение текущих значений xi=xxi;yi=yyi; } 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;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 for(y=3;y 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 { 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 { 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 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) 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 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.