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

📄 formclass.pas

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

interface

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

type
  TfrmClass = class(TForm)
    Label1: TLabel;
    Label2: TLabel;
    Label3: TLabel;
    Label4: TLabel;
    dbgClass: TDBGrid;
    btnQuit: TButton;
    dbeClassID: TDBEdit;
    dbeClassName: TDBEdit;
    dbeMaster: TDBEdit;
    dbeTelephone: TDBEdit;
    GroupBox1: TGroupBox;
    dbmDesc: TDBMemo;
    dbnClass: TDBNavigator;
    dsClass: TDataSource;
    tblClass: TTable;
    tblValid: TTable;
    dblcbDepartID: TDBLookupComboBox;
    Label5: TLabel;
    dbeBeginDate: TDBEdit;
    Label6: TLabel;
    tblDepart: TTable;
    dsDepart: TDataSource;
    procedure FormShow(Sender: TObject);
    procedure btnQuitClick(Sender: TObject);
    procedure dbnClassClick(Sender: TObject; Button: TNavigateBtn);
    procedure tblClassAfterScroll(DataSet: TDataSet);
    procedure tblClassBeforeDelete(DataSet: TDataSet);
    procedure tblClassBeforePost(DataSet: TDataSet);
    procedure FormClose(Sender: TObject; var Action: TCloseAction);
  private
    function HasStudent(var str: string): Boolean;
    procedure ToggleMode;
  public
    { Public declarations }
  end;

var
  frmClass: TfrmClass;

implementation

{$R *.dfm}

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

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

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

procedure TfrmClass.dbnClassClick(Sender: TObject; Button: TNavigateBtn);
begin
  ToggleMode;
end;

procedure TfrmClass.tblClassAfterScroll(DataSet: TDataSet);
begin
  ToggleMode;
end;

function TfrmClass.HasStudent(var str: string): Boolean;
begin
  Result := false;
  tblValid.Active := false;
  tblValid.TableName := 'Student';
  tblValid.Filter := 'ClassID=''' + tblClass['ClassID'] + '''';
  tblValid.Filtered := true;
  tblValid.Active := true;
  if not tblValid.Eof then
  begin
    str := Format('不能修改班级“%s”的编号, 下面的学生:'#13, [tblClass['ClassName']]);
    repeat
      str := str + Format('%10s - %s'#13, [tblValid['StudentID'], tblValid['Name']]);
      tblValid.Next;
    until tblValid.Eof;
    str := str + '隶属于该班级。';
    Result := true;
  end;
  tblValid.Active := false;
end;

procedure TfrmClass.ToggleMode;
var
  strMsg: string;

  procedure EnableInput(Enabled: Boolean);
  begin
    dbgClass.Enabled := not Enabled;
    dbeClassID.Enabled := Enabled;
    dbeClassName.Enabled := Enabled;
    dblcbDepartID.Enabled := Enabled;
    dbeBeginDate.Enabled := Enabled;
    dbeMaster.Enabled := Enabled;
    dbeTelephone.Enabled := Enabled;
    dbmDesc.Enabled := Enabled;
  end;
begin
  case tblClass.State of
    dsInsert, dsEdit:
      begin
        EnableInput(true);
        dbnClass.VisibleButtons := [nbPost, nbCancel];
        dbeClassID.SetFocus;
      end;
  else
    EnableInput(false);
    dbnClass.VisibleButtons := [nbFirst, nbPrior, nbNext, nbLast,
      nbInsert, nbDelete, nbEdit, nbPost, nbCancel, nbRefresh];
  end;

  if (tblClass.State = dsEdit) and HasStudent(strMsg) then
  begin
    dbeClassID.Enabled := false;
    ShowMessage(strMsg)
  end;
end;

procedure TfrmClass.tblClassBeforeDelete(DataSet: TDataSet);
var
  strMsg: string;
begin
  if HasStudent(strMsg) then
  begin
    ShowMessage(strMsg);
    Abort;
  end;

  strMsg := Format('确定要删除班级"%s"吗?该班级相关信息如下:'#13, [tblClass['ClassName']]);
  strMsg := strMsg + Format('  班级编号:%s'#13, [tblClass['ClassID']]);
  strMsg := strMsg + Format('  班级名称:%s'#13, [tblClass['ClassName']]);
  strMsg := strMsg + Format('   班主任:%s'#13, [tblClass['Master']]);
  if MessageDlg(strMsg, mtConfirmation, [mbYes, mbNo], 0) <> mrYes then
    Abort;
end;

procedure TfrmClass.tblClassBeforePost(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
      tblClass.FieldByName(FieldName).AsString := dbText.Text;
  end;

  function ValidID: Boolean;
  var
    strMsg: string;
  begin
    Result := true;
    tblValid.Active := false;
    tblValid.TableName := 'Class';
    tblValid.Filter := 'ClassID=''' + tblClass['ClassID'] + '''';
    tblValid.Filtered := true;
    tblValid.Active := true;
    if not tblValid.Eof then
    begin
      strMsg := Format('班级编号“%s”已经存在,请重新输入!'#13, [tblClass['ClassID']]);
      strMsg := strMsg + Format('  班级编号:%s'#13, [tblValid['ClassID']]);
      strMsg := strMsg + Format('  班级名称:%s'#13, [tblValid['ClassName']]);
      strMsg := strMsg + Format('   班主任:%s'#13, [tblValid['Master']]);
      ShowMessage(strMsg);
      dbeClassID.SetFocus;
      Result := false;
    end;
    tblValid.Active := false;
  end;
begin
  CheckField('ClassID', '班级编号', dbeClassID, true);
  CheckField('ClassName', '班级名称', dbeClassName, true);
  CheckField('BeginDate', '入学日期', dbeBeginDate, true);
  CheckField('Master', '班主任', dbeMaster, true);
  CheckField('MasterTel', '联系电话', dbeTelephone, true);
  CheckField('Description', '说明', dbmDesc, false);
  if dblcbDepartID.Text = '' then
  begin
    ShowMessage('所属院系不能为空,请输入足够的信息!');
    dblcbDepartID.SetFocus;
    Abort;
  end;

  if dbeClassID.Modified and not ValidID then
    Abort;
end;

end.

⌨️ 快捷键说明

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