Соглашение | Публикация статей

Красивые рольшторы - roll-service.by

Программа электронной записной книжки
Категория: Статьи

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


Статьи по теме:

Настройка уровня звука
Кибернетический подход
Выбор системы защиты
Разновидности: Atree ADA, Janus ADA, Meridian ADA
Команды для контроллера НГМД
Блокнот: Поиск и замена
Международная сеть INTERNET
Заливка области рисунка
Активный Рабочий стол Windows XP
TCO '99
Теория фреймов
Три Тренинга От Известных Вендоров: Специально Для «Антивирусных Решений»
Микропроцессор
Создание, использование и распространение вредоносных программ для ЭВМ
Мой Милый Ослик Или Настройка Emule
Критерий использования ЭС для решения задач
Компания Janet Systems Llc Представила Soa-Платформу На Выставке «E-Kazakhstan»
Протокол управления передачей (TCP) и протокол пользовательских дейтаграмм (UDP)
Компьютерный вирус - понятие и классификация
ПРИНЦИП ПОСТРОЕНИЯ КОМПЬЮТЕРНЫХ СЕТЕЙ
Языки программирования системного уровня
Завершены работы по настройке нового продукта Алее Архив 3 для работы с СУБД
Переход на новую систему и ее поддержка
Обмен данными : Excel - другие приложения
Компания Janet Systems Проведет Круглый Стол «Будущее Соа-Проектов»
Метод простой итерации
Понятие: и виды следственных действий
МИНИМАЛЬНЫЙ НАБОР ТИПОВЫХ ОПЕРАЦИЙ ПРИ ПОДГОТОВКЕ ТЕКСТА
Геоинформационные Системы (Гис) Как Средства Сбора И Анализа Геоданных
Правда об активации Windows Vista
Политика безопасности Microsoft Internet Explorer
Мобильная Торговля Optimum - Управление Торговыми Представителями
НЕКОТОРЫЕ РЕКОМЕНДАЦИИ
Где Купить Картридж С Доставкой В Офис
Обслуживание Компьютеров В Рамках Ит Аутсорсинга
Внедрение Crm Системы Quick Sales 2 В Компании «Эпос»
Условия и предпосылки информатизации
Копирование данных с компакт-диска
Периферійні пристрої
Печать фотографий через Интернет
Проверка Софта На Лицензионность
Кибернетика – наука ХХ века
Особенности системной интеграции CompactPCI-систем
Как работает вирус
Использование паролей
Вход в систему с полномочиями администратора
Содержимое таблицы FAT
Мир програмного обеспечения
Критерий пользователя ЭС
Отображение и скрытие значков
Internet
Главная загрузочная запись
Поиск фотографий в Интернете
Государственное регулирование информатизации Украины
Время создания или изменения файла