📄 ugrade.pas
字号:
unit uGrade;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, DB, StdCtrls, Mask, DBCtrls, ExtCtrls, Buttons, ComCtrls, Grids,
DBGrids, dbcgrids, ADOdb;
type
TfrmGrade = class(TForm)
ActiveSource: TDataSource;
Panel2: TPanel;
DBNavBtns: TDBNavigator;
DBDeleteBtns: TBitBtn;
DBEditBtns: TDBNavigator;
DBInsertBtns: TDBNavigator;
DBSaveBtns: TBitBtn;
DBCancelBtns: TDBNavigator;
Panel1: TPanel;
LblCNo: TLabel;
DBEdtCNo: TDBEdit;
DBGrdProd: TDBGrid;
LblSno: TLabel;
DBEdtSno: TDBEdit;
LblGrade: TLabel;
DBEdtGrade: TDBEdit;
BtnGetCNo: TButton;
LblSName: TLabel;
EdtSName: TEdit;
LblCName: TLabel;
EdtCName: TEdit;
BitBtnClose: TBitBtn;
LblRec: TLabel;
LblText: TLabel;
ModeIndicator: TLabel;
BtnGetSNo: TButton;
procedure FormCreate(Sender: TObject);
procedure FormCloseQuery(Sender: TObject; var CanClose: Boolean);
procedure FormClose(Sender: TObject; var Action: TCloseAction);
procedure BitBtnCloseClick(Sender: TObject);
procedure ActiveSourceDataChange(Sender: TObject; Field: TField);
procedure ActiveSourceStateChange(Sender: TObject);
procedure DBInsertBtnsClick(Sender: TObject; Button: TNavigateBtn);
procedure DBDeleteBtnsClick(Sender: TObject);
procedure DBSaveBtnsClick(Sender: TObject);
procedure BtnGetCNoClick(Sender: TObject);
procedure BtnGetSNoClick(Sender: TObject);
private
{ Private declarations }
procedure AppException(Sender: TObject; E: Exception);
procedure BeforeSaveCheck ;
public
{ Public declarations }
end;
var
frmGrade: TfrmGrade;
VRecNo, VRecCount : integer;
implementation
uses uDm, uPubProg, uGetSNo, uGetCNo ;
{$R *.dfm}
const
DatasetStates: array[TDataSetState] of string =
('Not active', '浏览', '编辑', '插入', '删除', '',
'', '', '', '', '', '', '');
HelpTopicEdit = 2;
HelpTopicBrowse = 3;
procedure TfrmGrade.AppException(Sender: TObject; E: Exception);
begin
if DMSchool.ADOConn.InTransaction then
DMSchool.ADOConn.RollbackTrans ; // 事务回退
if Copy(E.Message,1,3) = 'ORA' then
begin
Application.MessageBox(PChar('请正确输入数据,重试!' + #13
+ '出错信息:' + Copy(E.Message,11, Length(E.Message)-10)),
'校验信息', MB_OK+MB_ICONInformation);
Exit;
end;
Application.MessageBox(PChar('请正确输入数据,重试!' + #13
+ '出错信息:' + E.Message), '出错信息', MB_ICONSTOP);
end;
procedure TfrmGrade.FormCreate(Sender: TObject);
begin
if not ActiveSource.DataSet.Active then
ActiveSource.DataSet.Open ;
ActiveSource.OnStateChange := ActiveSourceStateChange;
ActiveSourceDataChange(Self, Nil);
Application.OnException := AppException;
end;
procedure TfrmGrade.FormCloseQuery(Sender: TObject;
var CanClose: Boolean);
begin
if ActiveSource.Dataset.State in dsEditModes then
begin
Application.MessageBox('正在录入数据,不能退出!',
'出错信息',MB_ICONSTOP);
Abort;
end;
end;
procedure TfrmGrade.FormClose(Sender: TObject;
var Action: TCloseAction);
begin
ActiveSource.OnStateChange := nil;
if ActiveSource.DataSet.Active then
ActiveSource.DataSet.Close ;
Action := caFree;
end;
procedure TfrmGrade.ActiveSourceDataChange(Sender: TObject;
Field: TField);
begin
VRecCount := ActiveSource.DataSet.RecordCount ;
if VRecCount = 0 then
VRecNo := 0
else
VRecNo := ActiveSource.DataSet.RecNo ; // 计算记录数
LblRec.Caption := IntToStr(VRecNo) + ' / ' + IntToStr(VRecCount);
EdtSName.Text := GetSName(DBEdtSno.Text) ;
EdtCName.Text := GetCName(DBEdtCno.Text) ;
end;
procedure TfrmGrade.ActiveSourceStateChange(Sender: TObject);
begin
with ActiveSource do
begin
if Dataset <> nil then ModeIndicator.Caption :=
Format('[%S]', [DatasetStates[State]]);
// Format('[%S: %S]', [Dataset.Name, DatasetStates[State]]);
if State in [dsEdit, dsInsert] then
begin
HelpContext := HelpTopicEdit;
ModeIndicator.Font.Color := clRed;
end
else
begin
HelpContext := HelpTopicBrowse;
ModeIndicator.Font.Color := clBlue;
end;
end;
DBNavBtns.Enabled := (ActiveSource.Dataset.State = dsBrowse) ;
DBDeleteBtns.Enabled := ActiveSource.Dataset.State = dsBrowse;
DBInsertBtns.Enabled := ActiveSource.Dataset.State = dsBrowse;
DBEditBtns.Enabled := ActiveSource.Dataset.State = dsBrowse;
DBSaveBtns.Enabled := ActiveSource.Dataset.State in dsEditModes;
DBCancelBtns.Enabled := ActiveSource.Dataset.State in dsEditModes;
// 只能在插入/修改状态下才可修改字段的值
DBEdtSNo.Enabled := ActiveSource.Dataset.State = dsInsert ;
DBEdtCNo.Enabled := ActiveSource.Dataset.State = dsInsert ;
BtnGetSNo.Enabled := ActiveSource.Dataset.State = dsInsert ;
BtnGetCNo.Enabled := ActiveSource.Dataset.State = dsInsert ;
end;
procedure TfrmGrade.BitBtnCloseClick(Sender: TObject);
begin
Close;
end;
procedure TfrmGrade.BtnGetSNoClick(Sender: TObject);
begin
with TfrmGetSNo.Create(Application) do
try
ShowModal;
finally
Free;
end;
ActiveSource.DataSet.FieldByName('SNO').AsString := VSNo;
end;
procedure TfrmGrade.BtnGetCNoClick(Sender: TObject);
begin
with TfrmGetCNo.Create(Application) do
try
ShowModal;
finally
Free;
end;
ActiveSource.DataSet.FieldByName('CNO').AsString := VCNo;
end;
procedure TfrmGrade.DBInsertBtnsClick(Sender: TObject; Button: TNavigateBtn);
begin
ActiveControl := DBEdtSNo ;
end;
procedure TfrmGrade.DBDeleteBtnsClick(Sender: TObject);
var VStr : string;
begin
if (VRecCount <= 0) then
begin
DBDeleteBtns.Enabled := False;
Abort;
end;
ModeIndicator.Caption := '删除';
ModeIndicator.Font.Color := clRed;
VStr := VStr + '学生学号: ' + DBEdtSNo.Text + #13;
VStr := VStr + '学生姓名: ' + EdtSName.Text + #13;
VStr := VStr + '课 程 号: ' + DBEdtCNo.Text + #13;
VStr := VStr + '课程名称: ' + EdtCName.Text + #13 ;
VStr := VStr + '成 绩: ' + DBEdtGrade.Text + #13;
if Application.MessageBox(PChar('将删除该学生所选课程的成绩数据!' + #13
+ #13 + '确信要删除当前的数据?' + #13 + VStr),
' 提示信息', MB_IconInformation+MB_YESNO) = IDNo then
begin
ModeIndicator.Caption := '浏览';
ModeIndicator.Font.Color := clBlue;
Abort;
end
else // 确认后,删除处理
begin
ActiveSource.DataSet.Delete ;
// ActiveSource.DataSet.Refresh ;
ModeIndicator.Caption := '浏览';
ModeIndicator.Font.Color := clBlue;
end;
end;
procedure TfrmGrade.DBSaveBtnsClick(Sender: TObject);
var i : integer;
begin
BeforeSaveCheck; // 检查必须输入的字段不可为空
if (ActiveSource.Dataset.State = dsInsert) then // 插入状态
begin
with DMSchool.ADOQuery do // 判断是否重复
begin
if Active then
Close ;
SQL.Clear;
SQL.ADD('SELECT COUNT(*) RECNUM FROM SCORE');
SQL.ADD(PChar(' WHERE (SNO = ''' + DBEdtSNo.Text + ''')'));
SQL.ADD(PChar(' AND (CNO = ''' + DBEdtCNo.Text + ''')'));
Open;
end;
i := DMSchool.ADOQuery.FieldByName('RECNUM').AsInteger;
if i > 0 then
begin
Application.MessageBox('该学生所选课程的成绩已存在,请重新输入!',
'出错信息',MB_ICONSTOP);
DBEdtCNo.SetFocus ;
Abort;
end;
end;
ActiveSource.DataSet.Post ;
end;
procedure TfrmGrade.BeforeSaveCheck; // 保存数据前的检查
begin
if Length(Trim(DBEdtSNo.Text)) <> 5 then // 检查学生学号
begin
Application.MessageBox('必须输入 5 位学生学号!',
'出错信息',MB_ICONSTOP);
DBEdtSNo.SetFocus ;
Abort;
end;
if Length(Trim(DBEdtCNo.Text)) <> 3 then // 检查课程号
begin
Application.MessageBox('必须输入 3 位课程号!',
'出错信息',MB_ICONSTOP);
DBEdtCNo.SetFocus ;
Abort;
end;
if Length(Trim(DBEdtGrade.Text)) > 0 then
if (StrToFloat(Trim(DBEdtGrade.Text)) < 0) then // 检查成绩
begin
Application.MessageBox('成绩值必须为正数!',
'出错信息',MB_ICONSTOP);
DBEdtGrade.SetFocus ;
Abort;
end;
end;
end.
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -