showcourse.cpp

来自「C++ Builder数据库开发经典案例解析 示例程序都是在C++ Build」· C++ 代码 · 共 125 行

CPP
125
字号
//---------------------------------------------------------------------------

#include <vcl.h>
#pragma hdrstop

#include "showcourse.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TfmShowCourse *fmShowCourse;

//---------------------------------------------------------------------------
__fastcall TfmShowCourse::TfmShowCourse(TComponent* Owner)
    : TForm(Owner)
{
    // 清空编辑框信息
    edStuNum->Text = "";
    edStuName->Text = "";
    edStuClass->Text = "";
    this->Height = 520;
    // 设置StringGrid的标题头
    StringGrid1->Cells[0][0] = "星期一";
    StringGrid1->Cells[1][0] = "星期二";
    StringGrid1->Cells[2][0] = "星期三";
    StringGrid1->Cells[3][0] = "星期四";
    StringGrid1->Cells[4][0] = "星期五";
    // 标题行,设置行高
    StringGrid1->RowHeights[0] = 20;
}
//---------------------------------------------------------------------------
void __fastcall TfmShowCourse::FormClose(TObject *Sender,
      TCloseAction &Action)
{
    // 删除窗体并回收空间
    Action = caFree;
}
//---------------------------------------------------------------------------
// 在学号编辑框中回车,显示学生信息和课程表
void __fastcall TfmShowCourse::edStuNumKeyPress(TObject *Sender, char &Key)
{
    // 回车,显示课程表
    if(Key == 13)
    {
        if(edStuNum->Text.Length() == 0)    // 学号为空,返回
            return;
        AnsiString szCon, sql;
        // 按照编号查询
        szCon += "学号='" + edStuNum->Text + "'";
        sql = "select 姓名, 班级名称 from 学生信息 as a, 班级信息 as b ";
        sql += "where a.班级编号=b.班级编号 and " + szCon;
        queQuery->SQL->Clear();
        queQuery->SQL->Add(sql);
        queQuery->Open();
        if(queQuery->RecordCount <= 0)
        {
            Application->MessageBox("学号输入错误","提示",MB_OK);
            return;
        }
        // 更新学生信息
        edStuName->Text = queQuery->FieldByName("姓名")->AsString;
        edStuClass->Text = queQuery->FieldByName("班级名称")->AsString;
        // 输出课程表
        sql = "select b.课程名称,";
        sql += "a.上课时间天,a.上课时间节,a.上课地点 from 选课表 as c, ";
        sql += "课程表 as a, 课程信息 as b where a.课程编号=b.课程编号 ";
        sql += "and c.课序号=a.课序号";
        sql += " and " + szCon + " order by a.课序号";
        queQuery->SQL->Clear();
        queQuery->SQL->Add(sql);
        queQuery->Open();
        // 清空StringGrid,注意第一行标题不应该清除
        for(int i=0; i<5; i++)
            for(int j=1; j<11; j++)
                StringGrid1->Cells[i][j] = "";
        // 读取课程表信息,保存到StringGrid相应的Cell中
        AnsiString szCouName, szClassRoom;
        int nDay, nNum;
        while(!queQuery->Eof)
        {
            szCouName = queQuery->FieldByName("课程名称")->AsString;
            nDay = queQuery->FieldByName("上课时间天")->AsInteger;
            nNum = queQuery->FieldByName("上课时间节")->AsInteger;
            szClassRoom = queQuery->FieldByName("上课地点")->AsString;
            szCouName = szCouName.TrimRight();
            // 用 || 作为分隔符,后面draw函数可以拆分分两行显示
            szCouName += "||" + szClassRoom.TrimRight();
            StringGrid1->Cells[nDay-1][nNum] = szCouName;
            queQuery->Next();
        }
    }
}
//---------------------------------------------------------------------------
// 继承DrawCell事件,定义输出,按照报表的形式输出课程表
void __fastcall TfmShowCourse::StringGrid1DrawCell(TObject *Sender,
      int ACol, int ARow, TRect &Rect, TGridDrawState State)
{
    // 演示如何将文本对中输出
    // 将原来的区域填充
    StringGrid1->Canvas->FillRect(Rect);
    // 重新输出文本,居中对齐
    AnsiString szCon = StringGrid1->Cells[ACol][ARow];  //显示的内容
    // 先获取输出文本宽度
    int nTextLen = StringGrid1->Canvas->TextWidth(szCon);
    // 居中输出信息
    if(ARow == 0)    // 标题栏
        StringGrid1->Canvas->TextRect(Rect,
            Rect.Left+Rect.Width()/2-nTextLen/2, Rect.Top+3, szCon );
    else             // 课程显示部分,每个Cell分两行显示名称和教室
    {
        AnsiString szT;
        int npos = szCon.Pos("||");
        // 分离课程名称,输出为第一行
        szT = szCon.SubString(1, npos-1);
        nTextLen = StringGrid1->Canvas->TextWidth(szT);
        StringGrid1->Canvas->TextOut(
            Rect.Left+Rect.Width()/2-nTextLen/2, Rect.Top+3, szT );
        // 分离上课地点,输出为第二行
        szT = szCon.SubString(npos+2, szCon.Length()-npos-1);
        nTextLen = StringGrid1->Canvas->TextWidth(szT);
        StringGrid1->Canvas->TextOut(
            Rect.Left+Rect.Width()/2-nTextLen/2, Rect.Top+20, szT );
    }
}
//---------------------------------------------------------------------------

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?