ugradecount.pas

来自「一.录入学生信息(预计有81个学生」· PAS 代码 · 共 549 行

PAS
549
字号
unit uGradeCount;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, ImgList, DB, ADODB, ComCtrls, StdCtrls, Grids, Aligrid, ExtCtrls,
  Mask;

type
  TfrmGradeCount = class(TForm)
    GroupBox1: TGroupBox;
    Tree: TTreeView;
    dsQuery: TADODataSet;
    ImageList1: TImageList;
    PageControl1: TPageControl;
    TabSheet1: TTabSheet;
    Grid: TStringAlignGrid;
    Panel1: TPanel;
    dsStudent: TADODataSet;
    dsSubject: TADODataSet;
    dsTemp: TADODataSet;
    dsStd: TADODataSet;
    GroupBox2: TGroupBox;
    GridB: TStringAlignGrid;
    Label1: TLabel;
    cmbSubj: TComboBox;
    Label2: TLabel;
    MaskEdit1: TMaskEdit;
    MaskEdit2: TMaskEdit;
    Label3: TLabel;
    cmdFilter: TButton;
    ListSubjCode: TListBox;
    cmdDetail: TButton;
    cmdClose: TButton;
    Panel2: TPanel;
    Label4: TLabel;
    Label5: TLabel;
    Label6: TLabel;
    Label7: TLabel;
    Function ReadyData():Boolean;
    Function ReadyStudent():Boolean;
    Function ReadySubj(NeedReLoadList:Boolean=False):Boolean;
    Function ReadyGrade():Boolean;

    Function GetStudentRow(SelID:String):Integer;
    Function GetSubjectCol(SelSubjName:String):Integer;
    Procedure CalcTotal();
    procedure CheckHonours();
    Function GetHScore(SelSubj:String):Extended;
    Procedure HideArea();
    Procedure SetJB();

    procedure FormClose(Sender: TObject; var Action: TCloseAction);
    procedure TreeClick(Sender: TObject);
    procedure cmdFilterClick(Sender: TObject);
    procedure cmdDetailClick(Sender: TObject);
    procedure cmdCloseClick(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

Function ShowGradeCount():Boolean;

implementation

uses uDM,uPub,uStudentEdit;

{$R *.dfm}

Function ShowGradeCount():Boolean;
var
  frmGradeCount: TfrmGradeCount;
begin
  Result:=False;
  frmGradeCount:=TfrmGradeCount.Create(nil);
  if Not frmGradeCount.ReadyData then
  begin
    frmGradeCount.Free;
    Exit;
  end;
  frmGradeCount.Show;
  Result:=True;
end;

Function TfrmGradeCount.ReadyData():Boolean;
var TmpSQL:String;
    OldTerm:String;
    TmpData:PNodeData;
    TmpItem,LastPar:TTreeNode;
begin
  Result:=False;
  TmpSQL:='select TTermToClass.*,TTerm.TermName,TClass.ClassName from TTermToClass,TTerm,TClass'+
    ' where TTermToClass.TermCode=TTerm.TermCode And TTermToClass.ClassCode=TClass.ClassCode'+
    ' Order by TTermToClass.TermCode,TTermToClass.ClassCode';
  dsQuery.Close;
  dsQuery.CommandText:=TmpSQL;
  Try
    dsQuery.Open;
  Except
    ShowMessage('读取本地数据文件发生错误!');
    Exit;
  End;
  dsQuery.First;
  LastPar:=nil;
  While Not dsQuery.Eof Do
  begin
    if OldTerm<>dsQuery.FieldByName('TermCode').AsString then
    begin
      new(TmpData);
      TmpItem:=Tree.Items.Add(nil,dsQuery.FieldByName('TermName').AsString);
      TmpItem.ImageIndex:=0;
      TmpItem.SelectedIndex:=0;
      TmpData.Code:=dsQuery.FieldByName('TermCode').AsString;
      TmpData.Name:=dsQuery.FieldByName('TermName').AsString;
      TmpItem.Data:=TmpData;
      OldTerm:=dsQuery.FieldByName('TermCode').AsString;
      LastPar:=TmpItem;
    end;
    new(TmpData);
    TmpItem:=Tree.Items.AddChild(LastPar,dsQuery.FieldByName('ClassName').AsString);
    TmpItem.ImageIndex:=1;
    TmpItem.SelectedIndex:=1;
    TmpData.Code:=dsQuery.FieldByName('ClassCode').AsString;
    TmpData.Name:=dsQuery.FieldByName('ClassName').AsString;
    TmpItem.Data:=TmpData;
    dsQuery.Next;
  end;
  Result:=True;
end;

Function TfrmGradeCount.ReadyStudent():Boolean;
var TmpSQL:String;
    TmpRow:Integer;
begin
  Result:=False;
  dsStudent.Close;  
  if Tree.Selected=nil then Exit;
  if Tree.Selected.Level<>1 then Exit;
  EmptyGrid(Grid);
  TmpSQL:='Select * from TStudent Where ClassCode='+''''+PNodeData(Tree.Selected.Data)^.Code+''''+
    ' Order by SName';
  dsStudent.Close;
  dsStudent.CommandText:=TmpSQL;
  Try
    dsStudent.Open;
  Except
    ShowMessage('读取本地数据文件发生错误!');
    Exit;
  End;
  Grid.ColCount:=3;
  if dsStudent.RecordCount=0 then
    Grid.RowCount:=2  
  else
    Grid.RowCount:=dsStudent.RecordCount+1;
  dsStudent.First;
  Grid.ColWidths[0]:=-1;
  TmpRow:=1;
  While Not dsStudent.Eof Do
  begin
    Grid.Cells[0,TmpRow]:=dsStudent.fieldByName('ID').AsString;
    Grid.Cells[1,TmpRow]:=dsStudent.fieldByName('SName').AsString;
    Grid.Cells[2,TmpRow]:=dsStudent.fieldByName('SNumber').AsString;
//    Grid.AlignCell[2,TmpRow]:=alRight;
    dsStudent.Next;
    TmpRow:=TmpRow+1;
  end;
  Grid.Cells[1,0]:='姓名';
  Grid.Cells[2,0]:='学号';
  Grid.AlignCol[2]:=alRight;
  Grid.AlignCell[1,0]:=alCenter;
  Grid.AlignCell[2,0]:=alCenter;
  Result:=True;
end;

Function TfrmGradeCount.ReadySubj(NeedReLoadList:Boolean=False):Boolean;
var TmpSQL:String;
    TmpRow:Integer;
begin
  Result:=False;
  if Tree.Selected=nil then
  begin
    dsSubject.Close;
    Exit;
  end;
  if Tree.Selected.Level=0 then
  begin
    dsSubject.Close;
    Exit;
  end;
  TmpSQL:='SELECT TClassToSubject.*,TSubject.SubjName from TClassToSubject,TSubject Where'+
    ' TClassToSubject.SubjCode= TSubject.SubjCode'+
    ' And TClassToSubject.TermCode='+PNodeData(Tree.Selected.Parent.Data)^.Code+
    ' And TClassToSubject.ClassCode='+''''+PNodeData(Tree.Selected.Data)^.Code+'''';
  dsSubject.Close;
  dsSubject.CommandText:=TmpSQL;
  Try
    dsSubject.Open;
  Except
    ShowMessage('打开数据文件发生错误!');
    Exit;
  End;
  dsSubject.First;
  Grid.ColCount:=Grid.ColCount+dsSubject.RecordCount+1;
  TmpRow:=3;
  if NeedReLoadList then
  begin
    cmbSubj.Items.Clear;
    ListSubjCode.Items.Clear;
    cmbSubj.Items.Add('全部');
    ListSubjCode.Items.Add('');
  end;
  While Not dsSubject.Eof Do
  begin
    Grid.Cells[TmpRow,0]:=dsSubject.fieldByName('SubjName').AsString;
    if NeedReLoadList then
    begin
      cmbSubj.Items.Add(dsSubject.fieldByName('SubjName').AsString);
      ListSubjCode.Items.Add(dsSubject.fieldByName('SubjCode').AsString);
    end;
    Grid.AlignCell[TmpRow,0]:=alCenter;
    Grid.AlignCol[TmpRow]:=alRight;
    dsSubject.Next;
    TmpRow:=TmpRow+1;
  end;
//  cmbSubj.ItemIndex:=0;
  Grid.Cells[Grid.ColCount-1,0]:='总分';
  Grid.AlignCell[Grid.ColCount-1,0]:=alCenter;
  
  Result:=True;
end;

Function TfrmGradeCount.ReadyGrade():Boolean;
var TmpSQL:String;
    TmpCol,TmpRow:Integer;
begin
  Result:=False;
  if Tree.Selected=nil then
  begin
    dsSubject.Close;
    Exit;
  end;
  if Tree.Selected.Level=0 then
  begin
    dsSubject.Close;
    Exit;
  end;

  TmpSQL:='Select TGrade.*,TSubject.SubjName from TGrade,TSubject Where '+
    ' TGrade.SubjectCode=TSubject.SubjCode  '+
    ' And TGrade.TermCode='+PNodeData(Tree.Selected.Parent.Data)^.Code+
    ' And TGrade.ClassCode='+''''+PNodeData(Tree.Selected.Data)^.Code+'''';
  dsTemp.Close;
  dsTemp.CommandText:=TmpSQL;
  Try
    dsTemp.Open;
  Except
    ShowMessage('读取本地数据文件发生错误!');
    Exit;
  End;
  dsTemp.First;
  While Not dsTemp.Eof Do
  begin
    TmpCol:=GetSubjectCol(dsTemp.fieldByName('SubjName').AsString);
    TmpRow:=GetStudentRow(dsTemp.fieldByName('StudentID').AsString);
    if (TmpRow>=0) And (TmpCol>=0) then
    begin
      Grid.Cells[TmpCol,TmpRow]:=FormatFloat('0.0',dsTemp.fieldByName('Score').AsFloat);
      Grid.AlignCell[TmpCol,TmpRow]:=alRight;
    end;
    dsTemp.Next;
  end;

  dsStd.Close;
  dsStd.CommandText:='Select THonoursStd.*,TSubject.SubjName from THonoursStd,TSubject Where THonoursStd.TermCode='+
    PNodeData(Tree.Selected.Parent.Data)^.Code+' And THonoursStd.ClassCode='+''''+PNodeData(Tree.Selected.Data)^.Code+'''';
  Try
    dsStd.Open;
  Except
    ShowMessage('读取本地数据文件发生错误!');
    Exit;  
  End;
  For TmpRow:=1 to Grid.RowCount-1 Do
  begin
    For TmpCol:=3 to Grid.ColCount-1 Do
    begin
      if Grid.Cells[TmpCol,TmpRow]='' then Grid.Cells[TmpCol,TmpRow]:='0.0';
    end;
  end;
  Result:=True;
end;

Function TfrmGradeCount.GetStudentRow(SelID:String):Integer;
var Tmploop:Integer;
begin
  For Tmploop:=1 to Grid.RowCount-1 Do
  begin
    if Grid.Cells[0,Tmploop]=SelID then
    begin
      Result:=Tmploop;
      Exit;
    end;
  end;
  Result:=-1;
end;

Function TfrmGradeCount.GetSubjectCol(SelSubjName:String):Integer;
var Tmploop:Integer;
begin
  For Tmploop:=3 to Grid.ColCount-1 Do
  begin
    if Grid.Cells[Tmploop,0]=SelSubjName then
    begin
      Result:=Tmploop;
      Exit;
    end;
  end;
  Result:=-1;
end;

Procedure TfrmGradeCount.CalcTotal();
var Tmploop,TmpRow:Integer;
    TmpField,TmpCount:Extended;
    MinRow,MaxRow:Integer;
    CountMax,CountMin:Extended;
begin
  MinRow:=-1;
  MaxRow:=-1;
  CountMax:=0;
  CountMin:=10000;
  if Grid.ColCount>4 then
  begin
    For TmpRow:=1 to Grid.RowCount-1 Do
    begin
      TmpCount:=0;
      Grid.RowFont[TmpRow].Color:=clBlack;
      For Tmploop:=3 to Grid.ColCount-2 Do
      begin
        if Grid.Cells[Tmploop,TmpRow]='' then
          TmpField:=0
        else
          TmpField:=StrToFloat(Grid.Cells[Tmploop,TmpRow]);
        if TmpField<60 then
        begin
          Grid.RowFont[TmpRow].Color:=clBlue;
        end;
        TmpCount:=TmpCount+TmpField;
      end;
      if TmpCOunt<=CountMin then
      begin
        CountMin:=tmpCOunt;
        MinRow:=TmpRow;
      end;
      if TmpCOunt>=CountMax then
      begin
        CountMax:=tmpCOunt;
        MaxRow:=TmpRow;
      end;      
      Grid.Cells[Grid.ColCount-1,TmpRow]:=FormatFloat('0.0',TmpCount);
      Grid.AlignCell[Grid.ColCount-1,TmpRow]:=alRight;
    end;
  end;
  GridB.ColCount:=Grid.ColCount;
  For Tmploop:=0 to GridB.ColCount-1 Do
  begin
    GridB.Cells[Tmploop,0]:=Grid.Cells[Tmploop,0];
    GridB.AlignCell[Tmploop,0]:=alCenter;
    if MinRow>=1 then
    begin
      GridB.Cells[Tmploop,1]:=Grid.Cells[Tmploop,MinRow];
    end;
    if MaxRow>=1 then
    begin
      GridB.Cells[Tmploop,2]:=Grid.Cells[Tmploop,MaxRow];
    end;
  end;
  GridB.Cells[0,0]:='名次';
  GridB.Cells[0,1]:='最差';
  GridB.Cells[0,2]:='最优';
end;

procedure TfrmGradeCount.CheckHonours();
var TmpRow,TmpCol:Integer;
    TmpFloat:Extended;
    IsH:Boolean;
begin
  For TmpRow:=1 to Grid.RowCount-1 Do
  begin
    IsH:=True;
    if Grid.Cells[0,TmpRow]='' then Exit;
    For TmpCol:=3 to Grid.ColCount-2 Do
    begin
      TmpFloat:=GetHScore(ListSubjCode.Items[TmpCol-3+1]);
      if StrToFloat(Grid.Cells[TmpCol,TmpRow])<TmpFloat then
      begin
        IsH:=False;
      end;
    end;
    if IsH then
    begin
      Grid.RowFont[TmpRow].Color:=clRed;
    end;
  end;
end;

Function TfrmGradeCount.GetHScore(SelSubj:String):Extended;
begin
  Result:=0;
  if dsStd.IsEmpty then Exit;
  dsStd.First;
  dsStd.Filter:='SubjectCode='+''''+SelSubj+'''';
  if dsStd.FindFirst then
  begin
    Result:=dsStd.fieldByName('Score').AsFloat;
  end;
end;

Procedure TfrmGradeCount.HideArea();
var TmpMin,TmpMax,TmpCheck:Extended;
    DealCol:Integer;
    TmpRow:Integer;
begin
  if cmbSubj.ItemIndex<=0 then
  begin
    Exit;
    //DealCol:=Grid.ColCount-1;
  end
  else
  begin
    DealCol:=cmbSubj.ItemIndex+2;
  end;
  TmpMin:=StrToFloat(Trim(MaskEdit1.Text));
  TmpMax:=StrToFloat(Trim(MaskEdit2.Text));
  For TmpRow:=1 to Grid.RowCount-1 Do
  begin
    if Grid.Cells[0,TmpRow]='' then Exit;
    TmpCheck:=StrToFloat(Grid.Cells[DealCol,TmpRow]);
    if TmpCheck<TmpMin then
    begin
      Grid.RowHeights[TmpRow]:=-1;
    end;
    if TmpCheck>TmpMax then
    begin
      Grid.RowHeights[TmpRow]:=-1;
    end;
  end;
end;

Procedure TfrmGradeCount.SetJB();
var TmpSQL:String;
    LastTermCode,StudentID:String;
    Tmploop:Integer;
begin
  TmpSQL:='Select Max(TermCode) from TTerm Where TermCode<'+PNodeData(Tree.Selected.Parent.Data)^.Code;
  dsTemp.Close;
  dsTemp.CommandText:=TmpSQL;
  Try
    dsTemp.Open;
  Except
    SHowMessage('读取数据过程中发生错误!');
    Exit;
  End;
  Grid.ColCount:=Grid.ColCount+1;
  Grid.Cells[Grid.ColCount-1,0]:='上学期总分';
  Grid.AlignCell[Grid.ColCount-1,0]:=alcenter;
  LastTermCode:=IntToStr(dsTemp.Fields[0].AsInteger);
  For Tmploop:=1 to Grid.RowCount-1 Do
  begin
    StudentID:=Grid.Cells[0,Tmploop];
    if StudentID='' then Exit;
    TmpSQL:='Select Sum(Score) from Tgrade Where TermCode='+LastTermCode+
      ' And ClassCode='+''''+PNodeData(Tree.Selected.Data)^.Code+''''+
      ' And StudentID='+StudentID;
    dstemp.Close;
    dstemp.CommandText:=TmpSQL;
    Try
      dstemp.Open;
    Except
      SHowMessage('读取数据过程中发生错误!');
      Exit;
    End;
    if Grid.Cells[Grid.ColCount-2,Tmploop]='' then Exit;
    Grid.Cells[Grid.ColCount-1,Tmploop]:=FormatFloat('0.0',dsTemp.Fields[0].AsFloat);
    Grid.AlignCell[Grid.ColCount-1,Tmploop]:=alRight;
    if StrToFloat(Grid.Cells[Grid.ColCount-2,Tmploop])=0 then Continue;
    if StrToFloat(Grid.Cells[Grid.ColCount-1,Tmploop])=0 then Continue;
    if dsTemp.Fields[0].AsFloat<>0 then
    begin
      if StrToFloat(Grid.Cells[Grid.ColCount-1,Tmploop])<StrToFloat(Grid.Cells[Grid.ColCount-2,Tmploop]) then
      begin
        if StrToFloat(Grid.Cells[Grid.ColCount-2,Tmploop])/StrToFloat(Grid.Cells[Grid.ColCount-1,Tmploop])>1.1 then
        begin
          Grid.ColorRow[Tmploop]:=$00C2E9B7; 
        end;
      end;
    end;
  end;
end;

procedure TfrmGradeCount.FormClose(Sender: TObject;
  var Action: TCloseAction);
begin
  Action:=caFree;
end;

procedure TfrmGradeCount.TreeClick(Sender: TObject);
begin
  EmptyGrid(Grid);
  if Not ReadyStudent then Exit;
  if Not ReadySubj(True) then Exit;
  if Not ReadyGrade then Exit;
  CalcTotal;
  CheckHonours;
  SetJB;

end;

procedure TfrmGradeCount.cmdFilterClick(Sender: TObject);
begin
  EmptyGrid(Grid);
  if Not ReadyStudent then Exit;
  if Not ReadySubj then Exit;
  if Not ReadyGrade then Exit;
  CalcTotal;
  CheckHonours;
  SetJB;
  if cmbSubj.ItemIndex>0 then
  begin
    Sort(cmbSubj.ItemIndex-1+3,False,True,Grid);
    HideArea;
  end;
end;

procedure TfrmGradeCount.cmdDetailClick(Sender: TObject);
begin
  if Grid.Cells[0,grid.Row]='' then Exit;
  ShowStudentEdit(StrToInt(Grid.Cells[0,grid.Row]),PNodeData(Tree.Selected.Data)^.Code,
    PNodeData(Tree.Selected.Data)^.Name);
end;

procedure TfrmGradeCount.cmdCloseClick(Sender: TObject);
begin
  Close;
end;

end.

⌨️ 快捷键说明

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