u_exammanageaction.pas

来自「一个简单的学籍管理软件」· PAS 代码 · 共 409 行

PAS
409
字号
unit U_ExamManageAction;

interface

uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  StdCtrls, Buttons, ExtCtrls, DateEdit, U_GlobalVar;

type
  TFm_ExamManageAction = class(TForm)
    Label1: TLabel;
    Edit_TermCode: TEdit;
    Label2: TLabel;
    Btn_Cancel: TButton;
    Bevel1: TBevel;
    Btn_Help: TButton;
    Btn_Ok: TButton;
    Label3: TLabel;
    Label4: TLabel;
    CmbBox_Order: TComboBox;
    CmbBox_Type: TComboBox;
    Label5: TLabel;
    CmbBox_Subject: TComboBox;
    Label6: TLabel;
    DtEdit_Begin: TDateEdit;
    Label7: TLabel;
    DtEdit_End: TDateEdit;
    CmbBox_Grade: TComboBox;
    Label8: TLabel;
    Edit_Info: TEdit;
    procedure Btn_OkClick(Sender: TObject);
    procedure Edit_TermCodeKeyDown(Sender: TObject; var Key: Word;
      Shift: TShiftState);
    procedure CmbBox_OrderKeyDown(Sender: TObject; var Key: Word;
      Shift: TShiftState);
    procedure CmbBox_OrderKeyPress(Sender: TObject; var Key: Char);
    procedure CmbBox_OrderChange(Sender: TObject);
    procedure CmbBox_TypeChange(Sender: TObject);
    procedure CmbBox_SubjectChange(Sender: TObject);
    procedure CmbBox_GradeChange(Sender: TObject);
  private
    OldSubjectCode: integer;
  public
  end;

function Show_ExamManageAction(var pTermCode: string;
  var pGrade, pOrder, pType: integer;
  var pInfo, pSubjectCode: string; var pBeginDate, pEndDate: TDateRec;
  Actions: integer): Boolean;
implementation

uses DbTables, HGrids, U_ExamManage, U_GlobalProc;
{$R *.DFM}

function Show_ExamManageAction(var pTermCode: string;
  var pGrade, pOrder, pType: integer;
  var pInfo, pSubjectCode: string; var pBeginDate, pEndDate: TDateRec;
  Actions: integer): Boolean;
var
  Fm_ExamManageAction: TFm_ExamManageAction;
  aColumn: THColumn;
  aList: TStrings;
  i, tmI: integer;
begin
  Result := False;
  Fm_ExamManageAction := TFm_ExamManageAction.Create(Application);

  with Fm_ExamManageAction do
  try
    case Actions of
      1: Caption := Caption + ' — 增加一次考试';
      2: Caption := Caption + ' — 修改当前考试';
    end;
    //  学期号
    Edit_TermCode.Text := pTermCode;
    //  年级
    CmbBox_Grade.Items.Clear;
    for i := 0 to SI_GradeCount - 1 do
      CmbBox_Grade.Items.AddObject(GradeNames[i] + '年级', Pointer(i + 1));
    CmbBox_Grade.ItemIndex :=
      CmbBox_Grade.Items.IndexOfObject(Pointer(pGrade));
    CmbBox_GradeChange(CmbBox_Grade);
    if CmbBox_Grade.ItemIndex = -1 then
    begin
      CmbBox_Grade.Enabled := True;
      CmbBox_Grade.Color := clWindow;
    end;

    //  考试次别
    aColumn := Fm_ExamManage.MGrid.FindFirstColumn('SI_KSCBIE');
    if Assigned(aColumn) then
      aList := aColumn.PickList
    else
      aList := nil;
    if Assigned(aList) then
      for i := 0 to aList.Count - 1 do
        CmbBox_Order.Items.AddObject(aList.Strings[i], aList.Objects[i]);
    CmbBox_Order.ItemIndex :=
      CmbBox_Order.Items.IndexOfObject(Pointer(pOrder));
    CmbBox_OrderChange(CmbBox_Order);
    //  考试类型
    aColumn := Fm_ExamManage.MGrid.FindFirstColumn('SI_KSLXING');
    if Assigned(aColumn) then
      aList := aColumn.PickList
    else
      aList := nil;
    if Assigned(aList) then
      for i := 0 to aList.Count - 1 do
        CmbBox_Type.Items.AddObject(aList.Strings[i], aList.Objects[i]);
    CmbBox_Type.ItemIndex :=
      CmbBox_Type.Items.IndexOfObject(Pointer(pType));
    CmbBox_TypeChange(CmbBox_Type);
    //  信息
    Edit_Info.Text := pInfo;
    //  课程
    if pSubjectCode = '' then
      tmI := 0
    else
      tmI := StrToInt(pSubjectCode);
    CmbBox_Subject.ItemIndex :=
      CmbBox_Subject.Items.IndexOfObject(Pointer(tmI));
    //  开始日期
    with pBeginDate do
      if pYear <> 0 then
        DtEdit_Begin.Date := EnCodeDate(pYear, pMonth, pDay);
    // 结束日期

    with pEndDate do
      if pYear <> 0 then
        DtEdit_End.Date := EnCodeDate(pYear, pMonth, pDay);
    if ShowModal = mrOk then
    begin
      //pTermCode := Edit_TermCode.Text;
      pGrade := Integer(CmbBox_Grade.Items.Objects[CmbBox_Grade.ItemIndex]);
      if CmbBox_Order.ItemIndex = -1 then
        pOrder := 0
      else
        pOrder := Integer(CmbBox_Order.Items.Objects[CmbBox_Order.ItemIndex]);
      if CmbBox_Type.ItemIndex = -1 then
        pType := 0
      else
        pType := Integer(CmbBox_Type.Items.Objects[CmbBox_Type.ItemIndex]);
      pInfo := Edit_Info.Text;
      with CmbBox_Subject do
      begin
        if ItemIndex = -1 then
          pSubjectCode := ''
        else
          pSubjectCode := IntFormatStr(Integer(Items.Objects[ItemIndex]), 4);
      end;
      with pBeginDate do
      begin
        pYear := DtEdit_Begin.Year;
        pMonth := DtEdit_Begin.Month;
        pDay := DtEdit_Begin.Day;
      end;

      with pEndDate do
      begin
        pYear := DtEdit_End.Year;
        pMonth := DtEdit_End.Month;
        pDay := DtEdit_End.Day;
      end;
      Result := True;
    end;
  finally
    Free;
  end;
end;

procedure TFm_ExamManageAction.Btn_OkClick(Sender: TObject);
var
  tmType: integer;
begin
  if CmbBox_Grade.ItemIndex = -1 then
  begin
    MessageBeep(0);
    U_GlobalProc.Show_ErrorMess('年级不能为空。');
    CmbBox_Grade.SetFocus;
    Exit;
  end;

  if CmbBox_Order.ItemIndex = -1 then
  begin
    MessageBeep(0);
    U_GlobalProc.Show_ErrorMess('考试次别不能为空。');
    CmbBox_Order.SetFocus;
    Exit;
  end;

  if Trim(Edit_Info.Text) = '' then
  begin
    MessageBeep(0);
    U_GlobalProc.Show_ErrorMess('考试说明不能为空。');
    Edit_Info.SetFocus;
    Exit;
  end;

  if CmbBox_Type.ItemIndex = -1 then
    tmType := 0
  else
    tmType := Integer(CmbBox_Type.Items.Objects[CmbBox_Type.ItemIndex]);

  if (tmType = 2) and (CmbBox_Subject.ItemIndex = -1) then
  begin
    MessageBeep(0);
    U_GlobalProc.Show_ErrorMess('考试课程不能为空。');
    CmbBox_Subject.SetFocus;
    Exit;
  end;
  ModalResult := mrOk;
end;

procedure TFm_ExamManageAction.Edit_TermCodeKeyDown(Sender: TObject;
  var Key: Word; Shift: TShiftState);
begin
  if (Key = VK_RETURN) then
  begin
    if Shift = [] then
      SelectNext(ActiveControl, True, True)
    else if ssShift in Shift then
      SelectNext(ActiveControl, False, True);
  end;
end;

procedure TFm_ExamManageAction.CmbBox_OrderKeyDown(Sender: TObject;
  var Key: Word; Shift: TShiftState);
begin
  if (Key = VK_RETURN) and (not (Sender as TComboBox).DroppedDown) then
  begin
    if Shift = [] then
      SelectNext(ActiveControl, True, True)
    else if ssShift in Shift then 
      SelectNext(ActiveControl, False, True);
    Key := 0;
  end;
  if (Key = VK_UP) and (not (Sender as TComboBox).DroppedDown) then
  begin
    Key := 0;
    SelectNext(ActiveControl, False, True);
  end;

  if (Key = VK_DOWN) and (not (Sender as TComboBox).DroppedDown) then
  begin
    Key := 0;
    (Sender as TComboBox).DroppedDown := TRUE;
  end;
  if (key = VK_LEFT) or (Key = VK_RIGHT) then
  begin
    if Key = VK_LEFT then
      SelectNext(ActiveControl, False, True)
    else
      SelectNext(ActiveControl, True, True);
    Key := 0;
  end;
end;

procedure TFm_ExamManageAction.CmbBox_OrderKeyPress(Sender: TObject;
  var Key: Char);
var
  tCmbBox: TComboBox;
  i: integer;
begin
  tCmbBox := (Sender as TComboBox);
  if Key = #27 then
  begin
    if tCmbBox.DroppedDown then
      tCmbBox.DroppedDown := False
    else
    begin
      tCmbBox.ItemIndex := -1;
      if Assigned(tCmbBox.OnChange) then
        tCmbBox.OnChange(tCmbBox);
    end;
  end;
  if Key = #32 then
  begin
    if tCmbBox.ItemIndex < (tCmbBox.Items.Count - 1) then
      tCmbBox.ItemIndex := tCmbBox.ItemIndex + 1
    else
      tCmbBox.ItemIndex := 0;
    if Assigned(tCmbBox.OnChange) then
      tCmbBox.OnChange(tCmbBox);
    Key := #0;
    Exit;
  end;
  if Key in ['1'..'9'] then
  begin
    i := StrToInt(Key) - 1;
    if i < tCmbBox.Items.Count then
    begin
      tCmbBox.ItemIndex := i;
      if Assigned(tCmbBox.OnChange) then
        tCmbBox.OnChange(tCmbBox);
    end else
      MessageBeep(0);
    Key := #0;
    Exit;
  end;
  if not ((Key = #13) and (tCmbBox.DroppedDown)) then
    Key := #0;
end;

procedure TFm_ExamManageAction.CmbBox_OrderChange(Sender: TObject);
var
  tmOrder: integer;
begin
  if CmbBox_Order.ItemIndex = -1 then
    tmOrder := 0
  else
    tmOrder := Integer(CmbBox_Order.Items.Objects[CmbBox_Order.ItemIndex]);
  case tmOrder of
    0:
    begin
      CmbBox_Type.ItemIndex := -1;
      CmbBox_Type.Enabled := False;
    end;
    1, 2:
    begin
      CmbBox_Type.ItemIndex :=
        CmbBox_Type.Items.IndexOfObject(Pointer(1));
      CmbBox_Type.Enabled := False;
    end;
    3, 4:
    begin
      CmbBox_Type.ItemIndex :=
        CmbBox_Type.Items.IndexOfObject(Pointer(2));
      CmbBox_Type.Enabled := True;
    end;
  end;
  if Assigned(CmbBox_Type.OnChange) then
    CmbBox_Type.OnChange(CmbBox_Type);
end;

procedure TFm_ExamManageAction.CmbBox_TypeChange(Sender: TObject);
var
  tmType: integer;
begin
  if CmbBox_Type.ItemIndex = -1 then
    tmType := 0
  else
    tmType := Integer(CmbBox_Type.Items.Objects[CmbBox_Type.ItemIndex]);
  case tmType of
    0, 1, 3:
    begin
      CmbBox_Subject.ItemIndex := -1;
      CmbBox_Subject.Enabled := False;
    end;
    2:
    begin
      CmbBox_Subject.Enabled := True;
      CmbBox_Subject.ItemIndex :=
        CmbBox_Subject.Items.IndexOfObject(Pointer(OldSubjectCode));
    end;
  end;
  if Assigned(CmbBox_Subject.OnChange) then
    CmbBox_Subject.OnChange(CmbBox_Subject);
end;

procedure TFm_ExamManageAction.CmbBox_SubjectChange(Sender: TObject);
begin
  if CmbBox_Subject.ItemIndex = -1 then
    OldSubjectCode := 0
  else
    OldSubjectCode :=
      Integer(CmbBox_Subject.Items.Objects[CmbBox_Subject.ItemIndex]);
end;

procedure TFm_ExamManageAction.CmbBox_GradeChange(Sender: TObject);
var
  aQuery: TQuery;
  tmGrade: integer;
  OldKc: integer;
begin
  if CmbBox_Grade.ItemIndex = -1 then
    Exit;
  tmGrade := Integer(CmbBox_Grade.Items.Objects[CmbBox_Grade.ItemIndex]);
  aQuery := TQuery.Create(Application);

  if CmbBox_Subject.ItemIndex = -1 then
    OldKc := 0
  else
    OldKc := Integer(CmbBox_Subject.Items.Objects[CmbBox_Subject.ItemIndex]);
  CmbBox_Subject.Items.Clear;
  with aQuery do
  try
    DataBaseName := DataDBase;
    SQL.Text := 'SELECT d1.s_kcdhao, d2.s_kcmcheng FROM xqkskc d1, ' +
      'kc d2 WHERE d1.s_xqhao=''' + S_CurTermCode + ''' AND d1.si_nji=' +
      IntToStr(tmGrade) + ' AND d1.s_kcdhao=d2.s_kcdhao AND ' +
      ' d2.si_kclxing=1';
    Open;
    while not Eof do
    begin
      CmbBox_Subject.Items.AddObject(FieldByName('s_kcmcheng').AsString,
        Pointer(FieldByName('s_kcdhao').AsInteger));
      Next;
    end;
    CmbBox_Subject.ItemIndex :=
      CmbBox_Subject.Items.IndexOfObject(Pointer(OldKc));
    CmbBox_SubjectChange(CmbBox_Subject);
  finally
    Close;
    Free;
  end;
end;

end.

⌨️ 快捷键说明

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