strSQL:=strSQL+'(SELECT StudentID FROM Student Where ClassID='''+TreeList[SelectNode.Parent.AbsoluteIndex]+''')';
strSQL:=strSQL+' Order By StudentID';
ADODataSetAchievement.CommandText := strSQL;
ADODataSetAchievement.Open;
// 删除不存在的学生成绩(前面输入不及格但这次已及格的学生)
while Not ADODataSetAchievement.Eof do begin
if Not ADODataSetStudent.Locate('StudentID',ADODataSetAchievement.FieldValues['StudentID'], []) then
ADODataSetAchievement.Delete
else
ADODataSetAchievement.Next;
end;
ScrollBox.Hide; // 因动态创建大量的TEdit对象,避免界面有明显的晃动
ADODataSetStudent.First; // 根据每个学生的实际情况动态创建TEdit对象
while Not ADODataSetStudent.Eof do begin
iPos := 1; // 动态创建TEdit输入对象,每个学生AchievementCount个
for j := 0 to AchievementCount-1 do begin
EditAchievement[iCount][j] := TEdit.Create(Self); // 创建
EditAchievement[iCount][j].Parent := ScrollBox;
// 创建在ScrollBox对象中
// 按HeaderControl中各节宽度分别设置对应TEdit输入对象的宽度
EditAchievement[iCount][j].Width := HeaderControl.Sections.Items[j].Width;
EditAchievement[iCount][j].Left := iPos;
//计算下一个TEdit输入对象的左边位置
iPos := iPos + EditAchievement[iCount][j].Width;
EditAchievement[iCount][j].Top := HeaderControl.Height+2+iCount*(Edit1.Height+2);
// 设置对象的行列标记,一个学生一行按顺序排列(个位表示是同一行的第几个TEdit输入对象)
EditAchievement[iCount][j].Tag := iCount*10 + j;
if (j In [2..4]) then // 动态设置同行求总分的OnChange事件
EditAchievement[iCount][j].OnChange := EditAchievementChange;
// 中间的三个TEdit对象可以输入
EditAchievement[iCount][j].Enabled := (j In [2..4]);
end;
|