⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 unit1.cpp

📁 小型的管理系统
💻 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 + -