📄 unit1.cpp
字号:
//---------------------------------------------------------------------------
#include <vcl.h>
#pragma hdrstop
#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma link "DynamicSkinForm"
#pragma link "SkinBoxCtrls"
#pragma link "SkinCtrls"
#pragma resource "*.dfm"
TForm1 *Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
: TForm(Owner)
{
int File;
struct student *Tmp=First;
struct student *Tmp2;
//设置全局的中间变量
//TmpStu=(struct student *)malloc(sizeof(struct student));
//-------------------
//尝试从文件读取记录信息
First=NULL;
if(!FileExists("StuScore.rcd"))
{
Application->MessageBoxA("没找到成绩记录文件!","失败",0);
return;
}
else
{
File=FileOpen("StuScore.rcd",fmOpenRead);
if(File==-1)
{
Application->MessageBoxA("打开记录文件失败","失败",0);
return;
}
while(true)//文件没有到结尾
{
int hehe;
Tmp2=(struct student *)malloc(sizeof(struct student));
hehe=FileRead(File,Tmp2,sizeof(struct student));
if(hehe<sizeof(struct student))
{
free(Tmp2);
break;//文件读完了
}
if(!First)//First==Null
{
First=Tmp2;
First->Next=First;
First->Pre=First;
Tmp=First;
}
else //First!=Null
{
Tmp->Next=Tmp2;
Tmp->Next->Pre=Tmp;
Tmp=Tmp->Next;
Tmp->Next=First;
First->Pre=Tmp;
}
}
FileClose(File);
}
}
//---------------------------------------------------------------------------
bool __fastcall TForm1::Add(bool RePlace)
{
//姓名和学号必须填写,成绩可以不写
//并赋成绩为-1以标记没有登记成绩
if(EditNum->Text=="")
{
Application->MessageBoxA("请填写学生的学号!","错误输入",0);
return false;
}
else if(EditName->Text=="")
{
Application->MessageBoxA("请填写学生的姓名!","错误输入",0);
return false;
}
else if(!RBtnMale->Checked&&!RBtnFemale->Checked)
{
Application->MessageBoxA("请选择学生的性别!","错误输入",0);
}
else
{
struct student *temp=(struct student *)malloc(sizeof(struct student));
// 寻找对应ID的姓名,如困链表中存在ID,
// 则不添加用户
struct student *temp2=First;
if(First&&!RePlace)//链表不为空,并且新增信息,不是修改
{
do
{
if(EditNum->Text.ToInt()==temp2->ID)
{//存在此ID
Application->MessageBoxA("此学号已存在,请更改!","错误输入",0);
return false;
}
else
{
temp2=temp2->Next;
}
}while(temp2!=First);//遍历环形链表
}
//现在可以添加信息了
temp->ID=EditNum->Text.ToInt();
StrPCopy(temp->Name,EditName->Text);
//记录性别
if(RBtnMale->Checked)temp->Sex=0;//男
else temp->Sex=1;//女
//记录成绩
if(EditMath->Text=="")temp->Math=-1;//不登记成绩
else temp->Math=EditMath->Text.ToDouble();
if(EditChinese->Text=="")temp->Chinese=-1;//不登记成绩
else temp->Chinese=EditChinese->Text.ToDouble();
if(EditEnglish->Text=="")temp->English=-1;//不登记成绩
else temp->English=EditEnglish->Text.ToDouble();
//把temp加入链表中
if(!First)//没有记录
{
First=temp;
First->Next=First;
First->Pre=First;//环形链表
}
else
{
temp->Pre=First->Pre;
temp->Next=First;
temp->Pre->Next=temp;
temp->Next->Pre=temp;
}
}
return true;
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Del(struct student *DelStu)
{
if(DelStu&&First)//链表中存在学生信息,而且要删除的信息不为空
{
if(First==DelStu)//删除第一条信息
{
if(First->Next==First)//只有一条信息
First=NULL;
else
First=First->Next;
}
DelStu->Pre->Next=DelStu->Next;
DelStu->Next->Pre=DelStu->Pre;
free(DelStu);
}
}
//---------------------------------------------------------------------------
void __fastcall TForm1::EditNumChange(TObject *Sender)
{//寻找对应的ID的姓名,如果链表中存在ID,
//如果处在编辑状态,即新添信息,或者修改信息,那么不处理此事件
if(EditName->Enabled)return;
//TmpStu是全部变量,它要对应当前在窗体中显示的信息
//所以,每次的EditNum改变, 都要先清空它
TmpStu=NULL;
//清空当前窗体内的显示信息,在查找到信息之后重写
EditName->Text="";
RBtnMale->Checked=false;
RBtnFemale->Checked=false;
EditMath->Text="";
EditChinese->Text="";
EditEnglish->Text="";
if(!First)return;//还没有任何的学生信息,则直接返回
//查找、更改(查找要更改的信息)、删除(查找要删除的信息)
//都要根据学号的变化适时显示信息,这个功能由这段代码实现
struct student *NowTmp=First;
//查找对应学号的信息,并用全局变量TmpStu来指向它
if(EditNum->Text.Length())//学号输入框不为空
{
do
{
if(EditNum->Text.ToInt()==NowTmp->ID)
{//找到信息,显示在窗体中
TmpStu=NowTmp;
EditName->Text=TmpStu->Name;
if(TmpStu->Sex)RBtnFemale->Checked=true;
else RBtnMale->Checked=true;
if(TmpStu->Math==-1)EditMath->Text="";//未登记成绩
else EditMath->Text=TmpStu->Math;
if(TmpStu->Chinese==-1)EditChinese->Text="";//未登记成绩
else EditChinese->Text=TmpStu->Chinese;
if(TmpStu->English==-1)EditEnglish->Text="";//未登记成绩
else EditEnglish->Text=TmpStu->English;
//如果是在查找 和删除模式下,则反OK/Cancel按钮置为可用
if(TabSet1->TabIndex==2||TabSet1->TabIndex==3)
{
BitBtn1->Enabled=true;
BitBtn2->Enabled=true;
}
break;//找到信息后跳出While循环
}
else
{
NowTmp=NowTmp->Next;//下一个信息
}
}while(NowTmp!=First);//遍历环形链表
}
}
//---------------------------------------------------------------------------
void __fastcall TForm1::FormCloseQuery(TObject *Sender, bool &CanClose)
{
Save(false);//自动保存
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Save(bool Auto)
{
int File;
struct student *Tmp=First;
if(!First)//没有用户信息
{
if(!Auto)Application->MessageBoxA("没有学生信息!","保存失败",0);
return;
}
if(FileExists("StuScore.rcd")) //存在记录文件
{
if(!DeleteFile("StuScore.rcd"))//删除失败
{
Application->MessageBoxA("删除旧记录文件失败,不能保存","失败",0);
}
}
File=FileCreate("StuScore.rcd");
if(File==-1)//创建失败
{
Application->MessageBoxA("创建文件StuScore失败,不能保存","失败",0);
}
//写文件
do
{
if(FileWrite(File,Tmp,sizeof(struct student))==-1)
Application->MessageBoxA("一个错误了","提示",0);
Tmp=Tmp->Next;
}while(Tmp!=First);
FileClose(File);
}
//---------------------------------------------------------------------------
void __fastcall TForm1::TabSet1Click(TObject *Sender)
{//界面处理
switch(TabSet1->TabIndex)
{
case 0://添加新学生
{//设置组件可用
EditName->Enabled=true;
GroupBoxSex->Enabled=true;
GroupBoxScore->Enabled=true;
BitBtn1->Enabled=true;
BitBtn2->Enabled=true;
LableHint->Caption="提示:名字<=8字符,学号6位内整数.";
}
break;
case 1://查找学生
{
EditName->Enabled=false;
GroupBoxSex->Enabled=false;
GroupBoxScore->Enabled=false;
BitBtn1->Enabled=false;
BitBtn2->Enabled=false;
LableHint->Caption="提示:输入学生学号,其它信息随学号动态显示";
}
break;
case 2://修改学生信息
{
EditName->Enabled=false;
GroupBoxSex->Enabled=false;
GroupBoxScore->Enabled=false;
BitBtn1->Enabled=false;
BitBtn2->Enabled=false;
LableHint->Caption="提示:输入学号,点击OK,修改后按OK保存修改";
}
break;
case 3://删除学生信息
{
EditName->Enabled=false;
GroupBoxSex->Enabled=false;
GroupBoxScore->Enabled=false;
BitBtn1->Enabled=false;
BitBtn2->Enabled=false;
LableHint->Caption="提示:输入学号,点击OK完成删除";
}
break;
case 4://退出
{
Close();
}
break;
default:break;
}
//每次更改状态,都要清空各个组件的内容
EditNum->Text="";
EditName->Text="";
RBtnFemale->Checked=false;
RBtnMale->Checked=false;
EditMath->Text="";
EditChinese->Text="";
EditEnglish->Text="";
}
//---------------------------------------------------------------------------
void __fastcall TForm1::BitBtn2Click(TObject *Sender)
{
TabSet1->OnClick(this);
}
//---------------------------------------------------------------------------
void __fastcall TForm1::BitBtn1Click(TObject *Sender)
{
switch(TabSet1->TabIndex)
{
case 0: //添加新学生
{
if(Add(false))//添加成功
{
TabSet1->TabIndex=0;
TabSet1->OnClick(this);
}
else //添加失败
{}
}
case 1: break;
case 2:
{
if(!EditName->Enabled)
{
EditName->Enabled=true;
GroupBoxSex->Enabled=true;
GroupBoxScore->Enabled=true;
}
else
{
if(Add(true))//加入信息成功
{
Del(TmpStu);
TmpStu=NULL;
TabSet1->TabIndex=2;
TabSet1->OnClick(this);
}
else
{}
}
}
break;
case 3:
{
Del(TmpStu);
TmpStu=NULL;
TabSet1->TabIndex=3;
TabSet1->OnClick(this);
}
break;
case 4: break;
default:break;
}
}
//---------------------------------------------------------------------------
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -