45920 (Языки и технологии программирования), страница 3

2016-07-31СтудИзба

Описание файла

Документ из архива "Языки и технологии программирования", который расположен в категории "". Всё это находится в предмете "информатика" из , которые можно найти в файловом архиве . Не смотря на прямую связь этого архива с , его также можно найти и в других разделах. Архив можно найти в разделе "рефераты, доклады и презентации", в предмете "информатика, программирование" в общих файлах.

Онлайн просмотр документа "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.

Свежие статьи
Популярно сейчас
Почему делать на заказ в разы дороже, чем купить готовую учебную работу на СтудИзбе? Наши учебные работы продаются каждый год, тогда как большинство заказов выполняются с нуля. Найдите подходящий учебный материал на СтудИзбе!
Ответы на популярные вопросы
Да! Наши авторы собирают и выкладывают те работы, которые сдаются в Вашем учебном заведении ежегодно и уже проверены преподавателями.
Да! У нас любой человек может выложить любую учебную работу и зарабатывать на её продажах! Но каждый учебный материал публикуется только после тщательной проверки администрацией.
Вернём деньги! А если быть более точными, то автору даётся немного времени на исправление, а если не исправит или выйдет время, то вернём деньги в полном объёме!
Да! На равне с готовыми студенческими работами у нас продаются услуги. Цены на услуги видны сразу, то есть Вам нужно только указать параметры и сразу можно оплачивать.
Отзывы студентов
Ставлю 10/10
Все нравится, очень удобный сайт, помогает в учебе. Кроме этого, можно заработать самому, выставляя готовые учебные материалы на продажу здесь. Рейтинги и отзывы на преподавателей очень помогают сориентироваться в начале нового семестра. Спасибо за такую функцию. Ставлю максимальную оценку.
Лучшая платформа для успешной сдачи сессии
Познакомился со СтудИзбой благодаря своему другу, очень нравится интерфейс, количество доступных файлов, цена, в общем, все прекрасно. Даже сам продаю какие-то свои работы.
Студизба ван лав ❤
Очень офигенный сайт для студентов. Много полезных учебных материалов. Пользуюсь студизбой с октября 2021 года. Серьёзных нареканий нет. Хотелось бы, что бы ввели подписочную модель и сделали материалы дешевле 300 рублей в рамках подписки бесплатными.
Отличный сайт
Лично меня всё устраивает - и покупка, и продажа; и цены, и возможность предпросмотра куска файла, и обилие бесплатных файлов (в подборках по авторам, читай, ВУЗам и факультетам). Есть определённые баги, но всё решаемо, да и администраторы реагируют в течение суток.
Маленький отзыв о большом помощнике!
Студизба спасает в те моменты, когда сроки горят, а работ накопилось достаточно. Довольно удобный сайт с простой навигацией и огромным количеством материалов.
Студ. Изба как крупнейший сборник работ для студентов
Тут дофига бывает всего полезного. Печально, что бывают предметы по которым даже одного бесплатного решения нет, но это скорее вопрос к студентам. В остальном всё здорово.
Спасательный островок
Если уже не успеваешь разобраться или застрял на каком-то задание поможет тебе быстро и недорого решить твою проблему.
Всё и так отлично
Всё очень удобно. Особенно круто, что есть система бонусов и можно выводить остатки денег. Очень много качественных бесплатных файлов.
Отзыв о системе "Студизба"
Отличная платформа для распространения работ, востребованных студентами. Хорошо налаженная и качественная работа сайта, огромная база заданий и аудитория.
Отличный помощник
Отличный сайт с кучей полезных файлов, позволяющий найти много методичек / учебников / отзывов о вузах и преподователях.
Отлично помогает студентам в любой момент для решения трудных и незамедлительных задач
Хотелось бы больше конкретной информации о преподавателях. А так в принципе хороший сайт, всегда им пользуюсь и ни разу не было желания прекратить. Хороший сайт для помощи студентам, удобный и приятный интерфейс. Из недостатков можно выделить только отсутствия небольшого количества файлов.
Спасибо за шикарный сайт
Великолепный сайт на котором студент за не большие деньги может найти помощь с дз, проектами курсовыми, лабораторными, а также узнать отзывы на преподавателей и бесплатно скачать пособия.
Популярные преподаватели
Добавляйте материалы
и зарабатывайте!
Продажи идут автоматически
5209
Авторов
на СтудИзбе
430
Средний доход
с одного платного файла
Обучение Подробнее