Есть класс отчёта (BReportClass), есть список, содержащий все отчёты. Список может пополняться при старте программы, или при создании нового отчёта. Вот эти процедуры:
- Код: Выделить всё
Procedure GetReports; // загрузка всех отчётов
Begin
With BQueryClass.Build Do
Begin
Get('SELECT * FROM REPORTS_INDEX ORDER BY ID');
While Not(EOF) Do
Begin
ReportsList.Add(BReportClass.Build(Fields.ByNameAsInteger['ID'],
Fields.ByNameAsInteger['GRADE'], Fields.ByNameAsString['CAPTION'],
Fields.ByNameAsString['SUBJECT']));
Next;
End;
Burn;
End;
End;
- Код: Выделить всё
Procedure TAppThread.AddReport(Const aReport: BReportClass);
Var
i: Integer;
Begin
WriteLn('we are here 0.o');
If aReport = nil Then Exit;
If ReportsList.IndexOf(aReport) = -1 Then ReportsList.Add(aReport);
FormMain.StoreGrades.Clear;
For i := 0 To GradesList.Count - 1 Do
FormMain.StoreGrades.AddEntry(BGradeClass(GradesList[i]).JSON);
End;
Вот сам старт программы:
- Код: Выделить всё
GetGrades;
GetReports;
WriteLn(Format('ReportsList.Count: %d', [ReportsList.Count]));
GetPupils;
WriteLn(Format('ReportsList.Count: %d', [ReportsList.Count]));
GetExams;
WriteLn(Format('ReportsList.Count: %d', [ReportsList.Count]));
GetMarks;
WriteLn(Format('ReportsList.Count: %d', [ReportsList.Count]));
В выводе при запуске:
ReportsList.Count: 3
ReportsList.Count: 3
ReportsList.Count: 3
ReportsList.Count: 23
Логично предположить, что лишние записи появляются в процедуре GetMarks:
- Код: Выделить всё
Procedure GetMarks;
Var
aMark: BMarkClass;
aExam: BExamClass;
Begin
aExam := nil;
With BQueryClass.Build Do
Begin
WriteLn(Format('1. ReportsList.Count: %d', [ReportsList.Count]));
Get('SELECT * FROM MARKS_INDEX ORDER BY EXAM, ID');
While Not(EOF) Do
Begin
WriteLn(Format('2. ReportsList.Count: %d', [ReportsList.Count]));
If (aExam = nil) Or Not(aExam.ID=Fields.ByNameAsInteger['EXAM']) Then
aExam := GetExam(Fields.ByNameAsInteger['EXAM']);
WriteLn(Format('3. ReportsList.Count: %d', [ReportsList.Count]));
aMark := BMarkClass.Build(Fields.ByNameAsInteger['ID'], aExam,
GetPupil(Fields.ByNameAsInteger['PUPIL']),
Fields.ByNameAsInteger['BALL']);
WriteLn(Format('4. ReportsList.Count: %d', [ReportsList.Count]));
aExam.Marks.Add(aMark);
WriteLn(Format('5. ReportsList.Count: %d', [ReportsList.Count]));
MarksList.Add(aMark);
WriteLn(Format('6. ReportsList.Count: %d', [ReportsList.Count]));
Next;
WriteLn(Format('7. ReportsList.Count: %d', [ReportsList.Count]));
End;
Burn;
End;
end;
При этом в консоли появляется вообще что-то невообразимое!!!
ReportsList.Count: 3
ReportsList.Count: 3
ReportsList.Count: 3
1. ReportsList.Count: 3
2. ReportsList.Count: 3
3. ReportsList.Count: 3
4. ReportsList.Count: 3
5. ReportsList.Count: 3
6. ReportsList.Count: 4
7. ReportsList.Count: 4
2. ReportsList.Count: 4
3. ReportsList.Count: 4
4. ReportsList.Count: 4
5. ReportsList.Count: 4
6. ReportsList.Count: 5
7. ReportsList.Count: 5
2. ReportsList.Count: 5
3. ReportsList.Count: 5
4. ReportsList.Count: 5
5. ReportsList.Count: 5
6. ReportsList.Count: 6
7. ReportsList.Count: 6
...
Иными словами, лишнее значение в ReportsList появляется на 6 "шаге": MarksList.Add(aMark);
Но MarksList и ReportsList - совсем разные списки!
- Код: Выделить всё
Unit BMarkUnit;
...
Initialization
Begin
MarksList := TList.Create;
End;
- Код: Выделить всё
Unit BReportUnit;
...
Initialization
Begin
ReportsList := TList.Create;
End;
Подскажите, что происходит? ^_^