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

📄 ugrade.pas

📁 可实现学生成绩管理系统的各种功能,无需登陆,直接查询学生的各种信息
💻 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 + -