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 + -
显示快捷键?