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

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

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

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

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

Текст программы на языке Basic
HotMail своими руками, или Что может PH
Управление расположением значков Microsoft Windows XP
Концентраторы Ethernet NetGear
Мой Милый Ослик Или Настройка Emule
Хищение компьютерной информации
Электронные вычислительные машины (ЭВМ)
Создание и использование сводных таблиц EXCEL
Устройства вывода
"Адские" мифы
ВСТАВКА ТАБЛИЦ
Основные стимулы трудовой деятельности в индустриальном, постиндустриальном и информационном обществе
Сокращение занимаемого Windows XP дискового пространства
Электронная почта
Обзор Ca Recovery Management R12. Новая Версия Продукта
Как Сделать Резервное Копирование Почты Mozilla Thunderbird
Пристрої виводу інформації
Подсказки програмного обеспечения и программы присоединенного филиала
Использование паролей
Совместимость Windows Vista
Открытие, сохранение, создание проекта
ИСТОРИЯ РАЗВИТИЯ КОМПЬЮТЕРОВ
Друкувальні пристрої, графобудівники
Области применения МП
Процедуры и функции модуля CRT
Просмотр графики в Программе просмотра изображений и факсов
Расследование нарушения правил эксплуатации ЭВМ: системы ЭВМ или их сети
Доступ в Internet
Лучшие Антивирусы
Разработка Программного Обеспечения, Разработка Программ
Рисование с помощью кисти
Физические аспекты работы с дисками
Языки программирования системного уровня
Зарождение кибернетики
Работа с дисками по средствам MS-DOS
Простые и быстрые способы проектирования собственных CompactPCI модулей ввода/вывода
Знакомство с элементами среды PowerPoint
Дата создания или изменения файла
Использование загрузочных дискет Microsoft
WordPad: Внедрение специальных объектов
Операционные системы реального времени для CompactPCI- компьютеров
Структура конструкций и поколения ЭВМ
Разработка и распространение компьютерных вирусов
ЭЛЕКТРОСТАТИЧЕСКИЕ ПЛОТТЕРЫ
Агрегатный принцип построения ЭВМ
Зао «Лайт Коммуникейшн» Подтвердила Свой Статус «Microsot Gold Certified Partner» В 2008 Году
Настройка параметров видеоустройства
Расследование создание: распространение и использование вредоносных программ для ЭВМ
Краткие сведения о кодировках кириллицы
Основные физические и логические параметры жестких дисков
ПРОБЛЕМА ПРЕДСТАВЛЕНИЯ ЗНАНИЙ В КОМПЬЮТЕРНЫХ СИСТЕМАХ
Особенности драйверов PCI и CompactPCI устройств
Экспорт изображений в файл
Прочие функции Microsoft Internet Explorer 6
Определение структурированной кабельной системы