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

📄 formstudent.pas

📁 Delphi数据库编程
💻 PAS
字号:
unit FormStudent;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, DB, DBTables, DBCtrls, ExtCtrls, StdCtrls, Mask, Grids, DBGrids;

type
  TfrmStudent = class(TForm)
    Label1: TLabel;
    Label2: TLabel;
    Label3: TLabel;
    Label5: TLabel;
    Label6: TLabel;
    dbgStudent: TDBGrid;
    btnQuit: TButton;
    dbeStudentID: TDBEdit;
    dbeName: TDBEdit;
    dbeNative: TDBEdit;
    dbnStudent: TDBNavigator;
    dblcbClassID: TDBLookupComboBox;
    dbeBirthday: TDBEdit;
    dsStudent: TDataSource;
    tblStudent: TTable;
    tblValid: TTable;
    tblClass: TTable;
    dsClass: TDataSource;
    Label4: TLabel;
    dbrgSex: TDBRadioGroup;
    procedure FormShow(Sender: TObject);
    procedure btnQuitClick(Sender: TObject);
    procedure dbnStudentClick(Sender: TObject; Button: TNavigateBtn);
    procedure tblStudentAfterScroll(DataSet: TDataSet);
    procedure tblStudentBeforeDelete(DataSet: TDataSet);
    procedure tblStudentBeforePost(DataSet: TDataSet);
    procedure FormClose(Sender: TObject; var Action: TCloseAction);
  Private
    function HasRec(TableName: string): Boolean;
    procedure ToggleMode;
  Public
    { Public declarations }
  end;

var
  frmStudent: TfrmStudent;

implementation

{$R *.dfm}

procedure TfrmStudent.FormShow(Sender: TObject);
begin
  tblClass.Active := true;
  tblStudent.Active := true;
  ToggleMode;
end;

procedure TfrmStudent.btnQuitClick(Sender: TObject);
begin
  Close;
end;

procedure TfrmStudent.FormClose(Sender: TObject; var Action: TCloseAction);
begin
  tblStudent.Active := false;
  tblClass.Active := false;    
end;

procedure TfrmStudent.dbnStudentClick(Sender: TObject;
  Button: TNavigateBtn);
begin
  ToggleMode;
end;

procedure TfrmStudent.tblStudentAfterScroll(DataSet: TDataSet);
begin
  ToggleMode;
end;

function TfrmStudent.HasRec(TableName: string): Boolean;
begin
  Result := false;
  tblValid.Active := false;
  tblValid.TableName := TableName;
  tblValid.Filter := 'StudentID=''' + tblStudent['StudentID'] + '''';
  tblValid.Filtered := true;
  tblValid.Active := true;
  if not tblValid.Eof then
    Result := true;
  tblValid.Active := false;
end;

procedure TfrmStudent.ToggleMode;
var
  strMsg: string;
  CanModify: Boolean;

  procedure EnableInput(Enabled: Boolean);
  begin
    dbgStudent.Enabled := not Enabled;
    dbeStudentID.Enabled := Enabled;
    dbrgSex.Enabled := Enabled;
    dbeName.Enabled := Enabled;
    dblcbClassID.Enabled := Enabled;
    dbeBirthday.Enabled := Enabled;
    dbeNative.Enabled := Enabled;
  end;
begin
  case tblStudent.State of
    dsInsert, dsEdit:
      begin
        EnableInput(true);
        dbnStudent.VisibleButtons := [nbPost, nbCancel];
        dbeStudentID.SetFocus;
      end;
  else
    EnableInput(false);
    dbnStudent.VisibleButtons := [nbFirst, nbPrior, nbNext, nbLast,
      nbInsert, nbDelete, nbEdit, nbPost, nbCancel, nbRefresh];
  end;

  if tblStudent.State = dsEdit then
  begin
    CanModify := true;
    strMsg := '不能修改该学生的学号。该学生存在如下教务管理记录:'#13;
    if HasRec('Change') then
    begin
      strMsg := strMsg + '  【学籍变更】'#13;
      CanModify := false;
    end;
    if HasRec('Reward') then
    begin
      strMsg := strMsg + '  【奖励】'#13;
      CanModify := false;
    end;
    if HasRec('Punish') then
    begin
      strMsg := strMsg + '  【处罚】'#13;
      CanModify := false;
    end;
    strMsg := strMsg + '修改学号会破坏数据的完整性!';

    if not CanModify then
      ShowMessage(strMsg);
    dbeStudentID.Enabled := CanModify;
  end;
end;

procedure TfrmStudent.tblStudentBeforeDelete(DataSet: TDataSet);
var
  strMsg: string;
  CanDelete: Boolean;
begin
  CanDelete := true;
  strMsg := '不能删除该学生的基本信息。该学生存在如下教务管理记录:'#13;
  if HasRec('Change') then
  begin
    strMsg := strMsg + '  【学籍变更】'#13;
    CanDelete := false;
  end;
  if HasRec('Reward') then
  begin
    strMsg := strMsg + '  【奖励】'#13;
    CanDelete := false;
  end;
  if HasRec('Punish') then
  begin
    strMsg := strMsg + '  【处罚】'#13;
    CanDelete := false;
  end;
  strMsg := strMsg + '删除该学生的基本信息会破坏数据的完整性!';
  if not CanDelete then begin
    ShowMessage(strMsg);
    Abort;
  end;

  strMsg := Format('确定要删除学生“%s”[%s] 的基本信息吗?', [tblStudent['StudentID'], tblStudent['Name']]);
  if MessageDlg(strMsg, mtConfirmation, [mbYes, mbNo], 0) <> mrYes then
    Abort;
end;

procedure TfrmStudent.tblStudentBeforePost(DataSet: TDataSet);
  procedure CheckField(FieldName, FieldDesc: string; dbText: TCustomEdit; NotEmpty: Boolean);
  begin
    dbText.Text := Trim(dbText.Text);
    dbText.Text := StringReplace(dbText.Text, '''', '', [rfReplaceAll]);
    dbText.Text := StringReplace(dbText.Text, ' ', '', [rfReplaceAll]);
    if NotEmpty and (dbText.Text = '') then begin
      ShowMessageFmt('“%s”不能为空,请输入足够的信息!', [FieldDesc]);
      dbText.SetFocus;
      Abort;
    end
    else
      tblStudent.FieldByName(FieldName).AsString := dbText.Text;
  end;

  function ValidID: Boolean;
  var
    strMsg: string;
  begin
    Result := true;
    tblValid.Active := false;
    tblValid.TableName := 'Student';
    tblValid.Filter := 'StudentID=''' + tblStudent['StudentID'] + '''';
    tblValid.Filtered := true;
    tblValid.Active := true;
    if not tblValid.Eof then
    begin
      strMsg := Format('学号“%s”[%s] 已经存在,请重新输入!', [tblStudent['StudentID'], tblValid['Name']]);
      ShowMessage(strMsg);
      dbeStudentID.SetFocus;
      Result := false;
    end;
    tblValid.Active := false;
  end;
begin
  CheckField('StudentID', '学号', dbeStudentID, true);
  CheckField('Name', '姓名', dbeName, true);
  CheckField('Birthday', '出生日期', dbeBirthday, true);
  CheckField('Native', '籍贯', dbeNative, true);
  if dbrgSex.Value = '' then begin
    ShowMessage('性别不能为空,请输入足够的信息!');
    dbrgSex.SetFocus;
    Abort;
  end;
  if dblcbClassID.Text = '' then
  begin
    ShowMessage('所在班级不能为空,请输入足够的信息!');
    dblcbClassID.SetFocus;
    Abort;
  end;

  if dbeStudentID.Modified then
    if not ValidID then Abort;
end;

end.

⌨️ 快捷键说明

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