📄 dbms.cpp
字号:
{ ClrLine(1,25);
PSat(1,25,"文件被修改,是否保存?[Y/N]<Y>");
char c=getch();
if(c=='y'||c=='Y'||c=='\r'||c=='\n') Save();
}
if(Header.Next!=0) {Release(); Header.Next=CurRec=0;}
fclose(fp);
strcpy(FileName,"Untitled.YDB"); /////
Modified=0;
State=0;
Release();
}
////////////////////////////////////////////////////////////
void TDBF::ListStruct()
{
textcolor(RED);
PSat(20,5,"字段名 字段长度");
textcolor(YELLOW);
Line(1,6,79);
for(int i=0;i<FieldCount;i++)
{ PSat( 20,7+i,FieldName[i]);
char s[11];
itoa(FieldWidth[i],s,10);
PSat(43,7+i,s);
}
}
////////////////////////////////////////////////////////////
void TDBF::Goto(word NO)
{
TRecord *T=Header.Next;
while(T!=0&&T->NO!=NO) T=T->Next;
if(T!=0) CurRec=T;
}
////////////////////////////////////////////////////////////
void TDBF::Del(word no)
{
if(no<1||no>RecCount) return;
TRecord *t=CurRec;
int f=1;
if(CurRec->NO==no)
{ f=0;
if(CurRec->Flag=='D')t=t->Next;
}
Goto(no);
if(CurRec->Flag==' '){ CurRec->Flag='D';CurRec=t; return;}
if(CurRec->Next!=0) CurRec->Next->Prev=CurRec->Prev;
if(CurRec->Prev!=0) CurRec->Prev->Next=CurRec->Next;
RecCount--;
for(int i=0;i<FieldCount;i++)
delete CurRec->Values[i];
delete CurRec;
Modified=1;
CurRec=t;
if(f) t=t->Next;
while(t){ t->NO--;t=t->Next;}
}
////////////////////////////////////////////////////////////
void TDBF::Recall(word no)
{
TRecord *t=CurRec;
Goto(no);
if(CurRec->Flag=='D'){CurRec->Flag=' ';Modified=1;}
CurRec=t;
}
////////////////////////////////////////////////////////////
void State(int whitch=0)
{
MenuDraw();
PSat(1,5," 工作区间 是否被用 文件名 记录数");
Line(1,6,80);
gotoxy(1,7);
if(whitch==0)
for(int j=0;j<10;j++)
{
if(j==CurWork) putch('>');
else putch(' ');
if(DBF[j].State==0)
cprintf(" %3c 没有 --------- -----\n\r", j+'A');
else
cprintf(" %3c 已用 %-15s %d\n\r",
j+'A',DBF[j].FileName,DBF[j].RecCount);
}
else if(DBF[whitch].State==0)
cprintf(" %3c 没有 --------- -----\n\r", whitch+'A');
else cprintf(" %3c 已用 %-15s %d\n\r",
whitch+'A',DBF[whitch].FileName,DBF[whitch].RecCount);
}
////////////////////////////////////////////////////////////
void TDBF::GoTop() { Goto(1); }
////////////////////////////////////////////////////////////
void TDBF::GoBottom() { Goto(RecCount); }
////////////////////////////////////////////////////////////
void Command()
{
char *p=cmdstr;
Cursor=0x0000;
ShowCursor();
clrscr();
window(1,1,80,25);
loop:
gettime(&Time);
ClrLine(1,1);
cprintf(" YKH 数据库管理统系-[当前工作区间%c-->%s]",CurWork+'A',DBF[CurWork].FileName);
gotoxy(69,1);
cprintf("[%2d:%2d:%2d]",Time.ti_hour,Time.ti_min,Time.ti_sec);
textcolor(BLUE); Line(1,2,80);
textcolor(YELLOW);
MenuDraw();
ClrLine(1,25);
PSat(1,25,"命令:");
char s[80];
gotoxy(6,25);
int tk=bioskey(0);
PSM sm=HaveShortKey(tk);
if(sm) {SelectSM(sm);goto loop;}
else {s[1]=1; s[2]=tk;}
s[0]=80;cgets(s);
if(s[1]==0||s[2]==27) goto loop;
strcpy(cmdstr,s+2);
p=cmdstr;
gotoxy(1,25);cputs("命令:");
while(isspace(*p)) p++;
if(!strncmpi(p,"del",3)||!strncmpi(p,"删除",4)) /// command " del "
{p+=(!strncmpi(p,"del",3)? 3:4);
while((*p==' '||isalpha(*p))&&*p!='\n'&&*p!='\r') p++;
if(*p=='\n'||*p=='\r'||*p=='\0')
for(int i=1;i<=DBF[CurWork].RecCount;i++) DBF[CurWork].Del(i);
else while(1){
DBF[CurWork].Del(atoi(p));
p=strchr(p,','); if(p){ p++;continue;}
else break;
}
goto loop;
}
if(!strncmpi(p,"recall",6)||!strncmpi(p,"恢复",4)) // command " Recall"
{ while(*p==' '||isalpha(*p)||*p&0x80) p++;
if(*p=='\n'||*p=='\r'||*p=='\0')
for(int i=1;i<=DBF[CurWork].RecCount;i++) DBF[CurWork].Recall(i);
else while(1){
DBF[CurWork].Recall(atoi(p));
p=strchr(p,','); if(p){ p++; continue;}
else break;
}
goto loop;
}
if(!strncmpi(p,"create",6)||!strncmpi(p,"new",3)||!strncmpi(p,"新建",4))
{ drawflag=1;
if(DBF[CurWork].State!=0)
{ PSat(1,25,"当前工作区间的记录已被修改,保存吗?[Y/N/Cancel]<Y>:");
const char ch=getch();
if( ch=='Y'||ch=='y'||ch=='\n'){ DBF[CurWork].Save(); DBF[CurWork].Close();}
else if(ch=='c'||ch=='C') goto loop;
else DBF[CurWork].Close();
}
p+=(!strncmpi(p,"create",6)?6:(!strncmpi(p,"New",3)?3:4));
while(*p==' ') p++;
if(*p=='\n'||*p=='\r'||*p=='\0') DBF[CurWork].Create();
else DBF[CurWork].Create(p);
goto loop;
}
if(!strncmpi(p,"open",4)||!strncmpi(p,"use",3)||!strncmpi(p,"load",4)||!strncmpi(p,"打开",4))
{
drawflag=1;
if(DBF[CurWork].State!=0)
{
PSat(1,25,"当前工作区间的记录已被修改,保存并关闭它吗?[Y/N/C取消]<Y>:");
const char ch=getch();
if( ch=='Y'||ch=='y'||ch=='\n'){ DBF[CurWork].Save();
DBF[CurWork].Close();}
else if(ch=='c'||ch=='C') return;
else DBF[CurWork].Close();
}
p+=((!strncmpi(p,"open ",5)||!strncmpi(p,"打开 ",5))?4:3);
while(*p==' ') p++;
if(isalnum(*p)) DBF[CurWork].Load(p);
else DBF[CurWork].Load(NULL);goto loop;
}
if(!strncmpi(p,"close",5)||!strncmpi(p,"关闭",4))
{ drawflag=1;
DBF[CurWork].Close();goto loop;
}
if(!strncmpi(p,"Save",4)||!strncmpi(p,"保存",4))
{DBF[CurWork].Save();goto loop;
}
if(!strncmpi(p,"exit",4)||!strncmpi(p,"quit",4)||!strncmpi(p,"退出",4))
{Quit();goto loop;
}
if(!strncmpi(p,"select",6)||!strncmpi(p,"选择",4))
{drawflag=1;
p+=(!strncmpi(p,"select",6)?6:4);
while(*p==' ') p++;
if(*p=='\0') CurWork=LastWork;
else if(isalnum(*p)&&*p>='A'&&*p<='J') CurWork=*p-'A';
else if(*p>='0'&&*p<='9') CurWork=*p-'0';
else if(*p>='a'&&*p<='j') CurWork=*p-'a';
else { PSat(1,25,"不是正确的工作区间!"); getch();}
}
if(!strncmpi(p,"state",5)||!strncmpi(p,"状态",4))
{drawflag=1;
p+=(!strncmpi(p,"state",5)?5:4);
while(*p==' ') p++;
if(*p=='\0') State();
else State(isdigit(*p)?*p-'0':*p-'A');
goto loop;
}
if(!strncmpi(p,"Modify",6)||!strncmpi(p,"修改",4))
{p+=(!strncmpi(p,"modify",6)?6:4);
while(*p==' ') p++;
if(*p=='\0') DBF[CurWork].Modify();
else DBF[CurWork].Modify(atoi(p));
}
if(!strncmpi(p,"Add",3)||!strncmpi(p,"Ins",3)||!strncmpi(p,"添加",4))
{p+=(!strncmpi(p,"add",3)||(!strncmpi(p,"ins",3))?3:4);
while(*p==' ') p++;
if(*p=='\0') DBF[CurWork].Add();
else DBF[CurWork].Add(atoi(p));
goto loop;}
if(!strncmpi(p,"dir",3)||!strncmpi(p,"目录",4)) { drawflag=1; Dir();goto loop;}
if(*p=='!')
{ drawflag=1;
system(p+1);
goto loop;}
if(!strncmpi(p,"List",4)||!strncmpi(p,"清单",4))
{ ListLine=5;
drawflag=1;
p+=4; while(*p==' ') p++;
if(*p=='\0'){DBF[CurWork].List(1,DBF[CurWork].RecCount);goto loop;}
int n1=atoi(p);while(isdigit(*p)||*p==' ')p++;
itea:if(*p=='\0') { DBF[CurWork].List(n1,n1);goto loop;}
if(*p=='-')
{ while(!isdigit(*p)) p++;
DBF[CurWork].List(n1,atoi(p));
while(isdigit(*p)||*p==' ') p++;
if(*p=='\0') goto loop;
while(isdigit(*p)||*p==' ') p++;
if(*p==',')
{ n1=atoi(p); while(isdigit(*p)||*p==' ') p++; goto itea;}
}
if(*p==',')
{ DBF[CurWork].List(n1,n1);
while(*p==' '||*p==',') p++;
if(*p=='\0') goto loop;
n1=atoi(p);
while(isdigit(*p)) p++;
goto itea;
}
goto loop;
}
if(!strncmpi(p,"help",4)||!strncmpi(p,"帮助",4))
{
Help();goto loop;
}
if(!strncmpi(p,"record",6)||!strncmpi(p,"记录",4))
{
gotoxy(1,24);
cprintf(" 当前记录是:%d",DBF[CurWork].CurRec->NO);
goto loop;
}
if(!strncmpi(p,"struct",6)||!strncmpi(p,"结构",4))
{
drawflag=1;
DBF[CurWork].ListStruct();goto loop;
}
if(!strncmpi(p,"clear",5)||!strncmpi(p,"cls",3)||!strncmpi(p,"清屏",4))
{
drawflag=1;
clrscr();goto loop;
}
if(!strncmpi(p,"skip",4))
{
while(!isdigit(*p)&&*p!='\0')p++;
int a;
if(*p=='\0')a=1;
else a=atoi(p);
DBF[CurWork].Skip(a);
goto loop;
}
if(!strncmpi(p,"GOTO",4))
{
if(!strncmpi(p+5,"top",3)) { DBF[CurWork].GoTop();goto loop;}
else if(!strncmpi(p+5,"bottom",6)){ DBF[CurWork].GoBottom();goto loop;}
else { DBF[CurWork].Goto(atoi(p+5));goto loop;}
}
if(!strncmpi(p,"Total",6)||!strncmpi(p,"统计",4))
{
gettime(&Time);
ClrLine(1,25);
cputs("命令:");
ClrLine(1,1);
cprintf(" YKH 数据库管理统系-[当前工作区间%c-->%s]",CurWork+'A',DBF[CurWork].FileName);
gotoxy(69,1);
cprintf("[%2d:%2d:%2d]",Time.ti_hour,Time.ti_min,Time.ti_sec);
textcolor(BLUE); Line(1,2,80);
textcolor(YELLOW);
gotoxy(2,18);cprintf("表文件 [%s]",DBF[CurWork].FileName);
gotoxy(2,19);cprintf("统计[%d]个记录.",DBF[CurWork].RecCount);
}
goto loop;
}
////////////////////////////////////////////////////////////
PSM smFile,smEdit,smSearch,smRecord,smHelp;
PMI miNew,miOpen,miClose,miCloseAll,miSave,miSaveAll,miPrint,miFileBlank,
miDos,miExit;
PMI miCopy,miCut,miPaste,miEditBlank,miSwitch,miLast,miState;
PMI miFind,miReplace,miFindAgain;
PMI miEdit,miAdd,miList,miDel,miRecall,miRecallAll,miRecordBlank,miSort,miGoto,miGoTop,miGoBottom;
PMI miTopic,miCommand,miAbout;
////////////////////////////////////////////////////////////////////////
void New(){ DBF[CurWork].Create(NULL);}
void Open(){ DBF[CurWork].Load(NULL);}
void Close(){DBF[CurWork].Close();}
void CloseAll(){ int i=0;for(;i<10;i++) DBF[i].Close();}
void Save(){ DBF[CurWork].Save();}
void SaveAll(){ int i=0;for(;i<10;i++) DBF[i].Save();}
void Print(){Prompt("对不起,本版本还不支持此功能");}
void Dos(){PSat(1,25,"请输入DOS命令:"); char s[80];s[0]=80; cgets(s);if(s[1]==0) goto ret;system(s+2);getch();ret:ClrLine(1,25);}
void Copy(){Prompt("对不起,本版本还不支持此功能");}
void Cut(){Prompt("对不起,本版本还不支持此功能");}
void Paste(){Prompt("对不起,本版本还不支持此功能");}
void state(){ State(0);}
void Find(){Prompt("对不起,本版本还不支持此功能");}
void Replace(){Prompt("对不起,本版本还不支持此功能");}
void FindAgain(){Prompt("对不起,本版本还不支持此功能");}
void Edit(){DBF[CurWork].Modify(0);}
void Add(){DBF[CurWork].Add(0);}
void Del(){DBF[CurWork].Del(0);}
void RecallAll(){DBF[CurWork].Recall(0);}
void Recall(){ PSat(1,25,"请输入要恢复的记录号:");int no;InputInt(22,25,&no);DBF[CurWork].Recall(no); }
void Goto(){PSat(1,25,"请输入目的记录号:");int no;InputInt(22,25,&no);DBF[CurWork].Goto(no); }
void GoTop(){ DBF[CurWork].GoTop();}
void GoBottom(){ DBF[CurWork].GoBottom();}
void Sort(){Prompt("对不起,本版本还不支持此功能");}
void Topic(){Prompt("对不起,本版本还不支持此功能");}
void command(){Help();}
void Switch(){ ClrLine(1,25);PSat(1,25,"请输入目的记录号:");int n;cscanf("%d",&n);CurWork=n<=9&&n>=0?n:CurWork;}
void Last(){ CurWork=LastWork;}
void List(){ DBF[CurWork].List();}
void About(){
Rectangle(10,10,70,20);
PSat(25,13,"YKH数据库管理系统 第2版");
PSat(23,14,"版权所有(C)余康华 2002,2003");
Prompt("敲任意键继续.....");
ClrLine(1,25);
PSat(1,25,"命令:");
}
////////////////////////////////////////////////////////////////////////
void main() {
char *copyrights[]={" 谢谢使用YKH数据库管理系统V2.0!\r\n",
" 版权所有(C) 2002. 余康华\n\r",
" 作者 :余康华 2002.4.1\n\r",
" 更多的信息请访问: http:ykhlab.iscool.net\n\r",
" 或者E-Mail至:Yukanghua@etang.com\n\r"};
smFile=NewSM(3,3,15,"&F文件",kbAltF,0);
smEdit=NewSM(6,3,25,"&E编辑",kbAltE,1);
smSearch=NewSM(15,3,17,"&S查找",kbAltS,2);
smRecord=NewSM(25,3,15,"&R记录",kbAltR,3);
smHelp=NewSM(35,3,15,"&H帮助",kbAltH,4);
miNew=NewMI("&N新建",'N'-'A'+1 ,5,"新建表文件",New,NULL);
miOpen=NewMI("&O打开",'O'-'A'+1 ,6,"打开表文件",Open,NULL);
miClose=NewMI("&C关闭",3, 7,"关闭当前文件",Close,NULL);
miCloseAll=NewMI("&A全部关闭",1, 8,"关闭全部打开的文件",CloseAll,NULL);
miSave=NewMI("&S保存",'S'-'A'+1, 9,"保存当前表文件",Save,NULL);
miSaveAll=NewMI("&V全部保存",'V'-'A'+1,10,"保存全部打开的文件",SaveAll,NULL);
miPrint=NewMI("&P打印",'P'-'A'+1,11,"打印当前表文件",Print,NULL);
miFileBlank=NewMI("\\",0,0,NULL,VOID,NULL);
miEditBlank=NewMI("\\",0,0,NULL,VOID,NULL);
miRecordBlank=NewMI("\\",0,0,NULL,VOID,NULL);
miDos=NewMI("&DOS命令",4, 12,"执行DOS命令",Dos,NULL);
miExit=NewMI("&E退出",5, 13,"退出系统",Quit,NULL);
AddMI(smFile,miNew); AddMI(smFile,miOpen);
AddMI(smFile,miClose); AddMI(smFile,miClose);
AddMI(smFile,miCloseAll); AddMI(smFile,miSave);
AddMI(smFile,miSaveAll); AddMI(smFile,miPrint);
AddMI(smFile,miFileBlank);AddMI(smFile,miDos);
AddMI(smFile,miExit);
miCopy=NewMI("&C复制",3,13,"复制",Copy,NULL);
miCut=NewMI("&T剪切",'T'-'A'+1,14,"剪切",Cut,NULL);
miPaste=NewMI("&P粘贴",'P'-'A'+1,15,"粘贴",Paste,NULL);
miSwitch=NewMI("&W切换到...",'w'-'a'+1,40,"切换到指定工作区间",Switch,NULL);
miLast=NewMI("&L最后一次工作区间",'l'-'a'+1,50,"切换到最后一次工作区间",Last,NULL);
miState=NewMI("&S状态",'s'-'a'+1,16,"工作区间使用状态",state,NULL);
AddMI(smEdit,miCopy); AddMI(smEdit,miCut);
AddMI(smEdit,miPaste); AddMI(smEdit,miEditBlank);
AddMI(smEdit,miLast);AddMI(smEdit,miSwitch);
AddMI(smEdit, miState);
miFind=NewMI("&F查找",5,17,"查找",Find,NULL);
miReplace=NewMI("&R替换",'r'-'a'+1,18,"替换",Replace,NULL);
miFindAgain=NewMI("&A继续查找",1,19,"继续查找",FindAgain,NULL);
AddMI(smSearch,miFind); AddMI(smSearch,miReplace);
AddMI(smSearch,miFindAgain);
miEdit=NewMI("&E编辑",4,20,"编辑",Edit,NULL);
miAdd=NewMI("&A添加",1,21,"添加",Add,NULL);
miDel=NewMI("&D删除",4,22,"删除",Del,NULL);
miRecall=NewMI("&R恢复",'r'-'a'+1,23,"恢复",Recall,NULL);
miRecallAll=NewMI("&C全恢复",3,30,"全部恢复",RecallAll,NULL);
miList=NewMI("&L记录清单",'l'-'a'+1,30,"显示记录清单",List,NULL);
miSort=NewMI("&S排序",'s'-'a'+1,24,"排序",Sort,NULL);
miGoto=NewMI("&G移动",8,26,"移动当前记录指针",Goto,NULL);
miGoTop=NewMI("&F第一条记录",7,27,"移动到第一条记录",GoTop,NULL);
miGoBottom=NewMI("&L最后一条记录",'l'-'a'+1,28,"移动到最后一条记录",GoBottom,NULL);
AddMI(smRecord,miEdit); AddMI(smRecord,miAdd);
AddMI(smRecord,miDel); AddMI(smRecord,miRecall);
AddMI(smRecord,miRecallAll);AddMI(smRecord,miList);
AddMI(smRecord,miRecordBlank);
AddMI(smRecord,miGoto); AddMI(smRecord,miGoTop);
AddMI(smRecord,miGoBottom);AddMI(smRecord,miSort);
miTopic=NewMI("&T主题",'t'-'a'+1,25,"主题",Topic,NULL);
miCommand=NewMI("&C命令",3, 26,"命令",command,NULL);
miAbout=NewMI("&A关于...",1, 27,"关于本系统",About,NULL);
AddMI(smHelp,miTopic); AddMI(smHelp,miCommand);
AddMI(smHelp,miAbout);
AddSM(smFile);AddSM(smEdit);AddSM(smSearch);AddSM(smRecord);AddSM(smHelp);
clrscr();
textcolor(YELLOW);
HideCursor();
Rectangle(10,5,70,20);
for(int i=0;i<6;i++){ PSat(15,10+i,copyrights[i]); }
getch();
MenuDraw();
window(1,3,80,25);
ShowCursor();
CurWork=0;
Command();
}
////////////////////////////////////////////////////////////
void Quit() {
for(int i=0;i<10;i++)
if(DBF[i].Modified&&DBF[CurWork].fp!=NULL)
{ ClrLine(1,25);
gotoxy(1,25);
cprintf("工作区间%c--文件:[%s]没有保存,是否保存?[Y/N/Cancel]<Y>",i+'A',DBF[i].FileName);
char c=getch();
if(c=='c'||c=='C') return;
if(c=='y'||c=='Y'||c=='\n') DBF[i].Save();
}
clrscr();
exit(0);
}
////////////////////////////////////////////////////////////////////////
void Help()
{
ClrLine(1,25);
textcolor(RED);
PSat(33,5,"系统命令:");
Line(1,6,80);
textcolor(YELLOW);
PSat(5,7,"1.新建/new/create [文件名] 2. 打开/load/open [文件名]");
PSat(5,8,"3.保存/save 4. 状态/state");
PSat(5,9,"5.退出/exit/quit 6. 帮助/help");
PSat(5,10,"7.统计/total 8. GOTO ");
PSat(5,11,"9.SKIP [偏移个数] 10. DIR/目录");
PSat(4,12,"11.!DOS命令 12. 结构/struct " );
PSat(4,13,"13.modify/修改 [记录号] 14. 记录/record");
PSat(4,14,"15.清屏/clear/cls 16. 添加/add/ins [插入位置]");
PSat(4,15,"17.关闭/close 18. 选择/select [工作区间]");
PSat(4,16,"19.清单/list [位置] 或 [起始-结束]");
return;
}
////////////////////////////////////////////////////////////////////////
void Dir()
{
struct find_t ffblk;
int done,tab=1,num=0;
window(1,4,79,24);
done = _dos_findfirst("*.YDB",_A_NORMAL,&ffblk);
while (!done) {
cprintf(" %s ", ffblk.name);
done = _dos_findnext(&ffblk);
num++;
if(tab++%5==0) cputs("\n\r");
}
cprintf("\n\r当前目录共有表文件%d个",num);
window(1,1,80,25);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -