📄 exado.pas
字号:
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 + -