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

📄 exado.pas

📁 delphi的学习资料
💻 PAS
📖 第 1 页 / 共 2 页
字号:
    iH,iW: Longword;
    nH,nW: word;
    RecN: Longword; //记录数
begin
  iH:=0;  iW:=0;  nH:=0;  nW:=0;
  with dbg.DataSource.DataSet do
  begin
    RecN:=dbg.DataSource.DataSet.RecordCount;
    if RecN=0 then  //无记录,则退出
      Exit;

    if dbg.SelectedField.Index=0 then
      if Trim(dbg.SelectedField.AsString)='' then
        begin
          dbg.DataSource.DataSet.Delete;
          RecN:=RecN-1;
        end;

    //---以下:计算High、Weight的平均数
    first;
    for i:=0 to RecN-1 do
    begin
      if Trim(FieldByName('High').AsString)<>'' then
        begin
          iH:=iH+FieldByName('High').AsInteger;
          nH:=nH+1;
        end;
      if Trim(FieldByName('Weight').AsString)<>'' then
        begin
          iW:=iW+FieldByName('Weight').AsInteger;
          nW:=nW+1;
        end;
      Next;
    end;
  end;

  if nH<>0 then
    LbH.Caption:=FormatFloat('#0.#',iH/nH);
  if nW<>0 then
    LbW.Caption:=FormatFloat('#0.#',iW/nW);

  dbg.Refresh;    // 此句必要吗?
end;

//=============== 成绩计算 =====================================================
procedure TfmExADO.StudyProc(No: string='');
//                       注意缺省参数的用法
var
  sSno: string; //学号
  rSum: Real;   //总分
begin
  ADOqry2.Close;
  with ADOqry1 do
  begin
    SQL.Text:='SELECT * FROM Study';  // WHERE SuMM=0 OR Mean=0';
    if No<>'' then
      SQL.Text:=SQL.Text+' Where sNo='+No;
          // 上句有何实际作用?
    Open;
    while not Eof do
    begin
      sSno:=FieldByName('Sno').AsString;
      rSum:=FieldByName('Sub1').AsFloat+FieldByName('Sub2').AsFloat
            +FieldByName('Sub3').AsFloat;
      ADOqry2.SQL.Text:='Update Study Set SuMM='+FormatFloat('#0.#',rSum)+', Mean='
                     +FormatFloat('#0.#',rSum/3)+' WHERE Sno='+sSno;
      ADOqry2.ExecSQL;
      Next; //qry1的
    end;  //while
    Close;
  end;
end;

//===============  组织查询条件 ================================================
procedure TfmExADO.Condition();
var
  sNo1,sNo2: string;  //学号范围 (不是对应于edtNo1、edtNo2)
  sNoCondit: string;  //查询条件的‘学号’部分
  s: string;          //查询条件的‘性别’部分
begin
  //--- 以下:让 sNo1 < sNo2
  sNo1:=Trim(edtNo1.Text);
  sNo2:=Trim(edtNo2.Text);
  if StrToInt(sNo1)>StrToInt(sNo2) then
    begin
      sNo1:=Trim(edtNo2.Text);
      sNo2:=Trim(edtNo1.Text);
    end;
  sNoCondit:=' Sno>='+sNo1+' AND Sno<='+sNo2;

  if ckbM.Checked and ckbF.Checked then //男女都选
    s:=''
  else
    begin
      if ckbM.Checked then   //只选男
        s:=' AND Sex=''M'' '
      else  //只选女
        s:=' AND Sex=''F'' ';
    end;

  if not(ckbM.Checked or ckbF.Checked) then //男女都不是
    s:=' AND (Sex<>''M'' AND Sex<>''F'') ';
    //s:=' AND Sex=''?'' ';   //跟上句是否等价?
  sCondit:=sNoCondit+s;
end;


//==============================================================================
procedure TfmExADO.btnStudyClick(Sender: TObject);
begin
  pnStudy.Visible:=True;
  try
    dbgCellClick(nil);
  except
  end;
end;

//==============================================================================
procedure TfmExADO.btnCancelClick(Sender: TObject);
begin
  pnStudy.Visible:=False;
end;

//========= 成绩数据进库、界面上更新 ===========================================
procedure TfmExADO.btnOKClick(Sender: TObject);
var tNo: string;
begin
  with ADOTb2 do
  begin
    Close;
//    Filtered:=True;    Filter:='sNo='...;
    Open;
    Edit;         // ***
    tNo:=Trim(sg2.Cells[0,1]);
    FieldByName('sNo').AsString:=sg2.Cells[0,1];
    FieldByName('Sub1').AsString:=sg2.Cells[1,1];
    FieldByName('Sub2').AsString:=sg2.Cells[2,1];
    FieldByName('Sub3').AsString:=sg2.Cells[3,1];
    Post;
    Close;
  end;

  StudyProc(tNo);
  sgRenew();
end;

//========= 取得鼠标右键按下时的鼠标坐标  ======================================
procedure TfmExADO.pnStudyMouseDown(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
begin
  if ssLeft in Shift then
    begin
      x0:=x;  y0:=y;
    end;
end;

//========= 鼠标右键按住,移动后,pnStudy移动 ==================================
procedure TfmExADO.pnStudyMouseMove(Sender:TObject; Shift:TShiftState; X,Y:Integer);
begin
  if ssLeft in Shift then
    begin
      pnStudy.Left:=pnStudy.Left+(x-x0);
      pnStudy.Top :=pnStudy.Top+(y-y0);
    end;
end;

//==============================================================================
procedure TfmExADO.dbgCellClick(Column: TColumn);
var
  sel: word;      // 选中的记录
  tNo: String[4]; // 选中的记录的sNo
  i: word;
begin
  //--以下: 找到dbg中点击的行的sNo
  with dbg.DataSource.DataSet do
  begin
    if RecordCount=0 then
      Exit;

    if RecNo<0 then       //******
      Exit;               //******

    Sel:=RecNo;
    First;
    MoveBy(Sel-1);
    tNo:=FieldByName('sNo').AsString;
  end;

  if pnStudy.Visible then
    begin
      with ADOTb2 do
      begin
        Close;
        Filtered:=True;
        Filter:='sNo='''+tNo+'''';
        Open;
      end;

      for i:=0 to 3 do
        sg2.Cells[i,1]:=ADOTb2.Fields[i].AsString;
    end;

  sgHighLight(tNo);   //找到sg中与dbg对应的行,并高亮显示

  dbg.DataSource.DataSet.RecNo:=Sel;  // 无此句, 有何影响 ??? !!!
end;


//========= 找到sg中与dbg对应的行,并高亮显示 ==================================
procedure TfmExADO.sgHighLight(No: string);
var  i: byte;
begin
  for i:=1 to sg.RowCount do
    if Trim(sg.Cells[0,i])=No then
      begin
        sg.Row:=i;
        break;    // ??????
      end;
end;

//==============================================================================
//此过程的实际作用 ???    用dbgKeyDown事件是否同样可行 ???
procedure TfmExADO.dbgKeyUp(Sender: TObject; var Key: Word;
  Shift: TShiftState);
begin
  if key in [37..40] then   // 是方向键(箭头键) (4种)
    dbgCellClick(nil);
end;


//==============================================================================
procedure TfmExADO.sgClick(Sender: TObject);
var
  tNo: string;
  i: word;
begin
  //  补充一段, 使得sg选中行后, dbg中与之对应的行高亮显示
  tNo:=Trim(sg.Cells[0,sg.Row]);
//  dbg.DataSource.DataSet.Locate('sNo',tNo,[loCaseInsensitive]);
//  上句  可以顶替下面整段
  with dbg.DataSource.DataSet do
  begin
    First;
    for i:=0 to RecordCount-1 do
      if Trim(FieldByName('sNo').AsString)=tNo then
        break
      else
        Next;
  end;
end;

//==============================================================================
procedure TfmExADO.sgKeyUp(Sender: TObject; var Key: Word;
  Shift: TShiftState);
var  tNo: string;
begin
  //  补充一段, 使得sg选中行后, dbg中与之对应的行高亮显示
  if key in [37..40] then   // 是方向键(箭头键) (4种)
    begin
      tNo:=Trim(sg.Cells[0,sg.Row]);
      dbg.DataSource.DataSet.Locate('sNo',tNo,[loCaseInsensitive]);
    end;  
end;

end.

⌨️ 快捷键说明

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