Программа написана на языке С++, с помощью программной среды Borland C++ ver. 3.0 и библиотеки Turbo Vision. Исходник программы находится в файле KURSOVIK.CPP.
Стандартные библиотеки С++:stdio.h, stdlib.h, string.h
Библиотеки Turbo Vision: tv.h, app.h, objects.h, menus.h, dialog.h, stddlg.h, msgbox.h.
Инструкция пользователю
Если вы решили использовать в своих целях данный программный продукт, запустите файл KURSOVIK.EXE и наслаждайтесь приятной работой которую обеспечит вам данная программа. База данных студентов сохраняется в файле с расширением .sdb.
После запуска программы перед вами появляется окно программы в верхней части которого находится меню. Для создания новой базы войдите в меню File и выберите пункт НОВАЯ БАЗА ДАННЫХ, появится окно в котором нужно ввести название базы не более 8 символов. После этого вы увидите рабочий диалог. Вы сможете перемещаться по базе с помощью кнопок >> и <<, а также добавлять и удалять записи с помощью кнопок Add и Del, при закрытии базы кнопкой Close происходит автосохранение базы. Для поиска элемента используйте пункт ПОИСК меню EDIT или клавишу F7. С помощью пункта ОТМЕНИТЬ ИСПРАВЛЕНИЯ в меню EDIT или клавиши Alt-Q вы можете отменить исправления в данной записи.
Выводы
В результате выполнения работы я полностью освоил организацию и работу с диалоговыми окнами в Turbo Vision C++. Была написана «мощнейшая» база данных, обрабатывающая данные о студентах, способная сохранять данные в файл и считывать из файла в новом стандарте SDB. В программе организован сверх-удобный и вместе с тем несложный пользовательский интерфейс. Данный программный продукт является коммерческим. Копирование и взлом преследуются по закону.
Приложение
Текст программы.
#define Uses_TKeys
#define Uses_TApplication
#define Uses_TInputLine
#define Uses_TLabel
#define Uses_TMenuBar
#define Uses_TSubMenu
#define Uses_TButton
#define Uses_TMenuItem
#define Uses_TStatusLine
#define Uses_TStatusItem
#define Uses_TStatusDef
#define Uses_TDeskTop
#define Uses_TDialog
#define Uses_TFileDialog
#define Uses_TChDirDialog
#define Uses_TSItem
#define Uses_TRadioButtons
#define Uses_MsgBox
#include <tv.h>
#include <msgbox.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>cmNewBase=200,//=201,=202,=203,=204,=205,=206,//=207,//=208, //=209, //=210;*wd;TStudent
{soname[30];name[30];patron[30];sex;group[12];course[3];contra;grant[10];studnum[8];
};blocksize=sizeof(TStudent);TSearchRec
{pole;val[30];
};TStudentBase
{:();
~TStudentBase();Sets(char*,char*,char*,char*,ushort,char*,char*,char*,ushort);*persone;*prev;*next;
};*StudentBase, *firstItm, *tmpS;*searchRec;control;*basename;*fileName;TStudentApp : public TApplication
{:();void handleEvent(TEvent& event);TStatusLine *initStatusLine(TRect);TMenuBar *initMenuBar(TRect);:WorkDialog();SaveBase(char *filename);*ReadBase(char *filename);NewBase();changeDir();openBase();searchDialog();*Search(TSearchRec *);*SAgain(TSearchRec *,TStudentBase *);
};::TStudentApp():(&TStudentApp::initStatusLine,
&TStudentApp::initMenuBar,
&TStudentApp::initDeskTop)
{(cmSaveBase);(cmSearch);(cmSAgain);(cmUndoCh);
};*TStudentApp::initStatusLine(TRect r)
{.a.y=r.b.y-1;new TStatusLine(r,
*new TStatusDef(0,0xFFFF)+
*new TStatusItem("~Alt-X~ Выход",kbAltX,cmQuit)
);
}*TStudentApp::initMenuBar(TRect r)
{.b.y=r.a.y+1;new TMenuBar(r,
*new TSubMenu("~F~ile",kbAltF,hcNoContext)+
*new TMenuItem("Новая база данных... ~Alt-N~",cmNewBase,kbAltN)+
*new TMenuItem("Открыть базу... ~F3~",cmOpenBase,kbF3)+
*new TMenuItem("Сохранить базу ~F2~",cmSaveBase,kbF2)+
newLine()+
*new TMenuItem("Сменить каталог...",cmChDir,hcNoContext)+()+
*new TMenuItem("~В~ыход ~Alt-X~",cmQuit,hcNoContext)+
*new TSubMenu("~E~dit",kbAltE,hcNoContext)+
*new TMenuItem("Поиск... ~F7~",cmSearch,kbF7)+
*new TMenuItem("Поиск следующей записи ~Shift-F7~",cmSAgain,kbShiftF7)+
*new TMenuItem("Отменить исправления ~Alt-Q~",cmUndoCh,kbAltQ)
);
};TStudentApp::handleEvent(TEvent& event)
{( event.what == evCommand )
{( event.message.command )
{cmNewBase:();(control==cmCancel)break;=new TStudentBase();=StudentBase;=basename;();( event );;cmAddItm:>getData(StudentBase->persone);*tmp=new TStudentBase();>prev=StudentBase;>next=StudentBase->next;>next->prev=tmp;>next=tmp;=StudentBase->next;>setData(StudentBase->persone);( event );;cmDel:((StudentBase->prev!=NULL)||(StudentBase->next!=NULL))
{(StudentBase->prev!=NULL)>prev->next=StudentBase->next;(StudentBase->next!=NULL)
{StudentBase->next->prev=StudentBase->prev;=StudentBase->next;}StudentBase=StudentBase->prev;
}(StudentBase!=NULL)wd->setData(StudentBase->persone);( event );;cmFwd:>getData(StudentBase->persone);(StudentBase->next!=NULL)
{=StudentBase->next;>setData(StudentBase->persone);
};( event );;cmBck:>getData(StudentBase->persone);(StudentBase->prev!=NULL)
{=StudentBase->prev;>setData(StudentBase->persone);
};( event );;cmCancel:(cmSaveBase);(cmSearch);(cmSAgain);(cmUndoCh);(cmOpenBase);(cmNewBase);>getData(StudentBase->persone);(fileName);(wd);( event );;cmChDir:();( event );;cmOpenBase:();((control==cmCancel)||StudentBase==NULL)break;();( event );;cmSaveBase:(fileName);( event );;cmSearch:=new TSearchRec;(searchRec->val,"");>pole=0;();(control==cmCancel)break;=Search(searchRec);( event );;cmSAgain:=SAgain(searchRec,tmpS);( event );;cmUndoCh:>setData(StudentBase->persone);:;
}
};::handleEvent( event );
}TStudentApp::NewBase()
{*nb=new TDialog(TRect(20,5,60,15),"Новая База");*bnm=new TInputLine(TRect(3,3,37,4),9);*ok=new TButton(TRect(4,6,19,8),"~O~k",cmOK,bfDefault);*canc=new TButton(TRect(21,6,36,8),"~C~ancel",cmCancel,bfNormal);>insert(canc);>insert(ok);>insert(bnm);=deskTop->execView(nb);(control!=cmCancel)
{>getData(basename);(basename,".sdb");
}(nb);
};TStudentApp::WorkDialog()
{=new TDialog(TRect(3,2,77,21),basename);>flags=0x00;*stdn=new TInputLine(TRect(23,2,30,3),8);*sn=new TInputLine(TRect(12,4,42,5),30);*nm=new TInputLine(TRect(12,6,42,7),30);*pt=new TInputLine(TRect(12,8,42,9),30);*cr=new TInputLine(TRect(37,10,42,11),3);*gr=new TInputLine(TRect(12,10,26,11),12);*st=new TInputLine(TRect(14,12,25,13),10);*Sex=new TRadioButtons(TRect(44,4,57,6),TSItem( "Мужской",TSItem( "Женский",0
)));>insert(new TLabel(TRect(3,12,13,13),"~С~тепендия",st));>insert(new TLabel(TRect(44,7,60,8),"~К~онтрактник",Contr));>insert(new TLabel(TRect(31,10,36,11),"~К~урс",cr));>insert(new TLabel(TRect(3,10,11,11),"~Г~руппа",gr));>insert(new TLabel(TRect(44,3,57,4),"~П~ол",Sex));>insert(new TLabel(TRect(3,8,11,9),"~О~чество",pt));>insert(new TLabel(TRect(3,6,7,7),"~И~мя",nm));>insert(new TLabel(TRect(3,4,11,5),"~Ф~амилия",sn));>insert(new TLabel(TRect(3,2,22,3),"~Н~омер студ. билета",stdn));>insert(sn);>insert(nm);>insert(pt);>insert(Sex);>insert(gr);>insert(cr);>insert(Contr);>insert(st);>insert(new TButton(TRect(60,5,71,7),"~A~dd",cmAddItm,bfNormal));>insert(new TButton(TRect(60,8,71,10),"~D~el",cmDel,bfNormal));>insert(new TButton(TRect(60,11,71,13),"~C~lose",cmCancel,bfDefault));>insert(new TButton(TRect(19,15,35,17),"<<",cmBck,bfNormal));>insert(new TButton(TRect(39,15,55,17),">>",cmFwd,bfNormal));>insert(stdn);>setData(StudentBase->persone);(cmSaveBase);(cmSearch);(cmSAgain);(cmUndoCh);(cmOpenBase);(cmNewBase);>insert(wd);>getData(StudentBase->persone);
}TStudentApp::searchDialog()
{*sr=new TDialog(TRect(17,5,63,20),"Поиск");*Val=new TInputLine(TRect(3,3,37,4),30);*ok=new TButton(TRect(4,10,19,12),"~O~k",cmOK,bfDefault);*canc=new TButton(TRect(21,10,36,12),"~C~ancel",cmCancel,bfNormal);*Pole=new TRadioButtons(TRect(3,5,43,9),TSItem( "Номер студенческого",TSItem( "Фамилия",TSItem( "Имя",TSItem( "Отчество",TSItem( "Группа",TSItem( "Курс",TSItem( "Степендия",0
))))))));>insert(canc);>insert(ok);>insert(Pole);>insert(Val);=deskTop->execView(sr);(control!=cmCancel)
{>getData(searchRec);
}(sr);
};*TStudentApp::Search(TSearchRec *srec)
{*Sb=new TStudentBase();=firstItm;found;=2;((Sb!=NULL)&&(found))
{(srec->pole)
{0:found=strcmp(srec->val,Sb->persone->studnum);break;1:found=strcmp(srec->val,Sb->persone->soname);break;2:found=strcmp(srec->val,Sb->persone->name);break;3:found=strcmp(srec->val,Sb->persone->patron);break;4:found=strcmp(srec->val,Sb->persone->group);break;5:found=strcmp(srec->val,Sb->persone->course);break;6:found=strcmp(srec->val,Sb->persone->grant);break;
}(found!=0)Sb=Sb->next;{StudentBase=Sb;>setData(StudentBase->persone);
}
};(found!=0)
{mfOkError=mfOKButton | mfError;
messageBox("Запись не найдена!!!",mfOkError);
return NULL;
};Sb->next;
};*TStudentApp::SAgain(TSearchRec *srec,TStudentBase *tmp)
{found;=2;((tmp!=NULL)&&(found))
{(srec->pole)
{0:found=strcmp(srec->val,tmp->persone->studnum);break;1:found=strcmp(srec->val,tmp->persone->soname);break;2:found=strcmp(srec->val,tmp->persone->name);break;3:found=strcmp(srec->val,tmp->persone->patron);break;4:found=strcmp(srec->val,tmp->persone->group);break;5:found=strcmp(srec->val,tmp->persone->course);break;6:found=strcmp(srec->val,tmp->persone->grant);break;
}(found!=0)tmp=tmp->next;{StudentBase=tmp;>setData(StudentBase->persone);
}
};(found!=0)
{mfOkError=mfOKButton | mfError;
messageBox("Запись не найдена!!!",mfOkError);
return NULL;
};tmp->next;
};TStudentApp::openBase()
{*d= (TFileDialog *)validView(TFileDialog( "*.sdb", "Открыть файл", "~N~ame", fdOpenButton, 100 ));=deskTop->execView(d);( d != 0 && control!=cmCancel)
{>getFileName( basename );(fileName,basename);
{(basename,strchr(basename,'\\')+1);
}while (strchr(basename,'\\')!=NULL);=ReadBase(fileName);=firstItm;
}( d );
}TStudentApp::changeDir()
{*d = validView( new TChDirDialog( 0, cmChangeDir ) );( d != 0 )
{>execView( d );( d );
}
}::TStudentBase()
{=new TStudent;("","","","",0,"","","",0);=NULL;=NULL;
};::~TStudentBase()
{persone;
};TStudentBase::Sets(char *stdn,char *sn,char *nm,char *pt,sx,char *gr,char *cr,char *st,ushort cntr)
{(persone->studnum,stdn);(persone->soname,sn);(persone->name,nm);(persone->patron,pt);(persone->group,gr);(persone->course,cr);(persone->grant,st);> sex=sx;>contra=cntr;
};filesize(FILE *f)
{curpos, length;=ftell(f);(f,0L,SEEK_END);=ftell(f);(f,curpos,SEEK_SET);length;
};Eof(FILE *f)
{curpos=ftell(f);*st;(st,sizeof(TStudent),1,f);(feof(f))
{(f, curpos, SEEK_SET);1;
};(f, curpos, SEEK_SET);0;
};*TStudentApp::ReadBase(char *filename)
{*baseF;(((baseF=fopen(filename,"r"))==NULL)||(filesize(baseF)==0))
{NULL;(baseF);
}*base=new TStudentBase();*tmp;=base;
{(tmp->persone,sizeof(TStudent),1,baseF);(Eof(baseF)!=0)break;>next=new TStudentBase();>next->prev=tmp;>next->next=NULL;=tmp->next;
}while (!feof(baseF));(baseF);base;
}TStudentApp::SaveBase(char *filename)
{*baseF;=fopen(filename,"w");*tmp;=firstItm;
{(tmp->persone,sizeof(TStudent),1,baseF);=tmp->next;
}(tmp!=NULL);(baseF);
};main()
{=new char[100];=new char[100];StBase;.run();
}