Общее описание

  IATimeTableDisp = dispinterface
    ['{46EAA99A-1D90-4F6D-A4B0-7B087014DC23}']
// собственно базовый объект
    property LessonCount: Integer dispid 1; // количество уроков 1..18
    property DayCount: Integer dispid 2;    // Количество дней в неделе 5 или 6
    property WeekCount: Integer dispid 3;   // Количество недель В школьной версии 1, в колледже 1 или 2
    procedure LoadFromFile(const Dir: WideString); dispid 4;  // считать базу из файла
    property ClsCount: Integer readonly dispid 6;             // количество классов
    property GetCls[Index: Integer]: IACls readonly dispid 7; // Получить класс по индексу (0.. ClsCount-1)
    property FindSubject[const Name: WideString]: IASubject readonly dispid 9;  // Найти предмет по наименованию. Если не найден, то nil
    property SubjectCount: Integer readonly dispid 10; // количество предметов
    property GetSubject[Index: Integer]: IASubject readonly dispid 11; // получить предмет по индексу
    property FindCabinet[const Name: WideString]: IACabinet readonly dispid 12; // поиск кабинета по наименованию. Если не найден, то nil
    property CabinetCount: Smallint readonly dispid 13; //  количество кабинетов
    property GetCabinet[Index: Integer]: IACabinet readonly dispid 14; // получить кабинет по индексу
    property FindTeacher[const Name: WideString]: IATeacher readonly dispid 15;  // поиск преподавателя по наименованию. Если не найден, то nil
    property TeacherCount: Integer readonly dispid 16; // количество преподавателей
    property GetTeacher[Index: Integer]: IATeacher readonly dispid 17; // Получить преподавателя по индексу
    property GetLang[Index: Integer]: IALang readonly dispid 18; // получить иностранный язык по индексу
    property LangCount: Integer readonly dispid 19; // количество иностранных языков
    property FindClsGrp[Key: Integer]: IAClsGrp readonly dispid 20; // поиск классогруппы по ключу. Если не найден, то nil
    property ClsGrpCount: Integer readonly dispid 21; // количество классогрупп
    property GetClsGrp[Index: Integer]: IAClsGrp readonly dispid 22; // получить классогруппу по индексу
    property SchoolName: WideString dispid 8; // название школы. Пример "251"
    property SchoolDirector: WideString dispid 23; // ФИО директори
    property SchoolAddress: WideString dispid 25; // Адрес школы
    property SchoolPhone: WideString dispid 26; // Телефон школы
    property TeachYear: WideString dispid 27; // учебный год. Пример "2002/03"
    property HalfYear: Integer dispid 28; // Полугодие. 1 или 2.
    property WorkingSat: Smallint dispid 30; // Рабочая суббота или нет. Справочная информация.
    property LessonTimeCount: Integer dispid 24; // Количество звонков
    property LessonBeginTime[Lesson: Integer]: TDateTime dispid 31; // время начала уроков
    property LessonEndTime[Lesson: Integer]: TDateTime dispid 32; // время конца уроков
    property IdentGroupBase: IAKeyBase readonly dispid 33; // база по идентичным группам
    property PotokLessonBase: IAKeyBase readonly dispid 34; // База по поточным группам. Используются только группы в базе. Часть, отвечающая за идентичность, пуста.
    procedure DeleteSubject(const Name: WideString); dispid 37; // удаляет предмет
    procedure DeleteClsGrp(Key: Integer); dispid 39; // Удаляет классогруппу
    property AddTeacher[const Name: WideString]: IATeacher readonly dispid 40; // Добавляет преподавателя. 
    procedure DeleteTeacher(const Name: WideString); dispid 41; Удаляет преподавателя
    property AddCabinet[const Name: WideString; Floor: Integer; Capacity: Integer]: IACabinet readonly dispid 42; // Добавляет кабинет
    procedure DeleteCabinet(const Name: WideString); dispid 43; // удаляет кабинет
    property ParallelCount: Integer readonly dispid 44; // Количество параллелей
    property AddParallel[Number: Integer]: IAParallel readonly dispid 45;        // добавляет параллель
    procedure DeleteParallel(Number: Integer); dispid 46; // удаляет параллель
    property FindParallel[Number: Integer]: IAParallel readonly dispid 47; //ищет параллель по номеру
    property GetParallel[Index: Integer]: IAParallel readonly dispid 49; // получить параллель по индексу
    property FindCls[const ClsName: WideString]: IACls readonly dispid 5; // найти класс по наименованию
    property AddSubject[const Name: WideString; const ShortName: WideString; IsLang: Smallint]: IASubject readonly dispid 35; // добавить предмет
    property AddClsGrp[Key: Integer]: IAClsGrp readonly dispid 38; // добавить классогруппу с нужным ключем. Ключи должны быть уникальными. Если key=-1, то ключ подбирается самой базой.
    procedure SaveToFile(const Directory: WideString); dispid 36; // записать в файл
    procedure LoadFromFileUsingOpenDialog; dispid 48; // Открыть open диалог и если пользователь выберет файл, то загрузить его.
    procedure SaveToFileUsingSaveDialog; dispid 50; //  Открыть save диалог и если пользователь выберет файл, то записать базу в него.
    property SmenCount: Integer dispid 52; // количество смен. Справочная информация.
    property RunOpenDialog: WideString readonly dispid 53; // Открыть open dialog. Если в нем пользователь нажал cancel, то генерится исключение.
    property RunSaveDialog: WideString readonly dispid 54; // Открыть save dialog. Если в нем пользователь нажал cancel, то генерится исключение.
    property GetClsUseClsOrder[Index: Integer]: IACls readonly dispid 55; // получить класс по индексу, но при этом используется сортировка по параллелям.
    property FindTeacherUseTag[Tag: Integer]: IATeacher readonly dispid 56; // найти преподавателя по полю tag.
    procedure AssignSpecialClassesAutomatically; dispid 57; // расставить поля SpCls во всех ACls, чтобы учебный план был корректным.
    property AddLang[const Name: WideString; const ShortName: WideString]: IALang read Get_AddLang; // добавляет иностранный язык.
    property FindLang[const Name: WideString]: IALang read Get_FindLang; // возвращает иностранный язык по названию
    procedure DeleteLang(Index: Integer); safecall; // удаляет иностранны язык
  end;


  IAClsDisp = dispinterface
// информация о классе.
    ['{315F5716-59AD-4FAC-B36D-B7E88E60EE1D}']
    property Name: WideString dispid 1; // наименование. Пример "5а"
    property Parallel: IAParallel readonly dispid 4; // Параллель, в которой находится класс
    property FullName: WideString dispid 5; // полное название класса. Используется только в колледж версии.
    property Man: SYSINT dispid 6; // количество мальчиков в классе
    property Woman: SYSINT dispid 7; // количество девочек
    property SpCls: Smallint dispid 8; // Является ли класс спецклассом. У спецкласса нагрузка в учебном плане может отличаться от всех остальных (неспециальных) классов
    property Smena: Smallint dispid 9; // Смена, в которой занимается класс. 1..ATimeTable.SmenCount.
    property AllDayCount: Integer readonly dispid 10; // возвращает DayCount*Weekcount
    property WorkingSat: Smallint dispid 11; // Является ли суббота рабочей. Справочная информация.
    property ClsRuk: IATeacher readonly dispid 12; // Классное руководство. Если классного руковдителя у класса нет, то nil.
    property Amount: Integer readonly dispid 13; // Численность класса =Man+Woman
    property ClsGrpCount: SYSINT readonly dispid 15; // Количество классогрупп класса.
    property SubjClsCount: SYSINT readonly dispid 18; // Количество SubjCls. Каждому предмету, который ведется в классе, соответствует SubjCls.
    property GetSubjCls[Index: Integer]: IASubjCls readonly dispid 19; //Получить subjCls по индексу
    procedure ClearSubjClss; dispid 20; // Удалить все SubjCls.
    property GetClsGrp[Index: Integer]: IAClsGrp readonly dispid 2; // Получить классогруппу по индексу.
    property Tag: Integer dispid 3; // данное поле можно использовать по своему усмотрению.
    property GetLesson[Day: Integer; Lesson: Integer; Week: Integer]: IAClsLesson readonly dispid 14; // получить нужный ClsLesson.
  end;

  IACabinetDisp = dispinterface
// Информация о кабинете.

    ['{7AD3BCA4-4255-46BC-B355-7C84D6AFF705}']
    property Floor: Integer dispid 1; // этаж
    property Subjects[Index: Integer]: IASubject readonly dispid 2; // Получить предмет по индексу. Имеется ввиду предметная ориентация кабинетов.
    property SubjectCount: Integer readonly dispid 3; // Получить количество предметов. Имеется ввиду предметная ориентация кабинетов.
    property Name: WideString dispid 4; // Наименование кадинета. Пример "Спортзал", "15"
    property Capacity: Integer dispid 5; // вместимость кабинета
    procedure ResortSubjects; dispid 7; // Пересортировать предметы кабинета в соответствии с их порядком в общей базе.
    property Tag: Integer dispid 6; // данное поле можно использовать по своему усмотрению.
    property GetLesson[Day: Integer; Lesson: Integer; Week: Integer]: IACabinetLesson readonly dispid 9;  получить нужный CabinetLesson.
  end;

  IATeacherDisp = dispinterface
// Информация о преподавателе.
    ['{8FB7EC4D-5E3E-4B07-8194-838435EEFE95}']
    property Name: WideString readonly dispid 1; // ФИО преподавателя. Пример "Иванова А.А."
    property Smens: Smallint dispid 2; // Смены, в которые преподаватель работает. Побитово, к примеру 0b00000010 - только во вторую смену.
    property Sovm: Smallint dispid 3; // Является ли преподаватель совместителем.
    property GetSmens: WideString readonly dispid 4; // получить смены, в которые преподаватель работает в текстовом виде. Пример "I, II"
    property GetSubjects: WideString readonly dispid 5; // Получить список предметов, которые ведет преподаватель. 
    procedure AddLang(const Lang: IALang); dispid 6; // Добавить иностранный язык, который может быть проведен преподавателем.
    procedure DeleteLang(const Lang: IALang); dispid 7; // удалить иностранный язык преподавателя.
    property GetLang[Index: Integer]: IALang readonly dispid 8; // Получить ин.яз. по индексу.
    property LangCount: Integer readonly dispid 9; // Получить количество ин.яз'ов, которые преподаватель может преподавать.
    property SubjTeacherCount: Integer readonly dispid 10; // Получить количество SubjTeacher'ов. Каждому предмету, который может быть проведен данным преподавателем, соответствует SubjTeacher.
    property GetSubjTeacher[Index: Integer]: IASubjTeacher readonly dispid 11; // получить SubjTeacher по индексу.
    property MyCls: IACls dispid 12; // получить класс. Имеется ввиду классное руководство. Если преподаватель не является классным руководителем, то nil
    procedure SetSmens(Smena1: Smallint; Smena2: Smallint; Smena3: Smallint); dispid 13; // Установить рабочие смены. Аналогично Smens, но удобнее.
    property Cabinet: IACabinet dispid 14; // Закрепленный за преподавателем предмет. Если не назначен, то nil
    property CabinetName: WideString readonly dispid 15; // Получить название закрепленного кабинета. Если не назначен, то "".
    property GetClsGrp[Index: Integer]: IAClsGrp readonly dispid 16; // Получить классогруппу по индексу.
    property GetClsGrpIndex[Key: Integer]: Integer readonly dispid 17; // получить индекс классогруппы с заданным ключем. Если ключа нет, то генерируется исключение.
    procedure ClearClsGrpLessons(ClsGrpIndex: Integer); dispid 18; // Очистить все занятия преподавателя
    property ClsGrpCount: Integer readonly dispid 19; // Получить количество классогрупп.
    procedure ClearSubjTeachers; dispid 21; // Удалить все SubjTeacher'ы. 
    procedure ResortSubjTeachers; dispid 22; // Пересортировать SubjTeacher'ы в соответствии с общим порядком предметов.
    property Tag: Integer dispid 20; //данное поле можно использовать по своему усмотрению. Возможен поиск преподавателя с заданным tag. см. aTImeTable.FindTeacherUseTag
    procedure SetMyClsN(const ClsName: WideString); dispid 23; // Установить классное руководство, используя название класса. Пустая строка отменяет классное руководство.
    property GetLesson[Day: Integer; Lesson: Integer; Week: Integer]: IATeacherLesson readonly dispid 25; // получить нужный TeacherLesson.
  end;

  IASubjectDisp = dispinterface
// Информация о предмете.
// Для каждого преподавателя, который ведет предмет, создается SubjTeacher.
// Для каждого класса, в котором проводится предмет, создается SubjCls.
    ['{C31C06D8-6504-4BBF-956D-1B9237271BC3}']
    property Name: WideString dispid 1; // Название предмета. Пример "Русский язык", "Иностранный язык", "Математика".
    property ShortName: WideString dispid 2; // Короткое название предмета
    property Difficalty: Integer dispid 3; // сложность 1<=Difficalty<=4 (см. методические рекомендации по составлению расеписания в школе)
    property Mass: Integer dispid 4; // вес 1<=Mass<=8 (см. методические рекомендации по составлению расеписания в школе)
    property SubjIsLang: Smallint readonly dispid 5; // Авляется ля предмет иностранным языком. Реально просто проверка на Lang<>nil
    property CabinetCount: Integer readonly dispid 6; // количество предметно ориентированных кабинетов.
    property GetCabinet[Index: Integer]: IACabinet readonly dispid 7; // получить предметно ориентированный кабинет по индексу
    procedure AddCabinet(const Cabinet: IACabinet); dispid 8; // добавить предметно ориентированный кабинет.
    procedure DeleteCabinet(const Cabinet: IACabinet); dispid 9; // Удалить предметно ориентированный кабинет
    procedure AddCabinetN(const CabName: WideString); dispid 11; // Добавляет предметную ориентацию кабинета.
    property GetCabinetIndex[const Cabinet: IACabinet]: Integer readonly dispid 10; // получить индекс кабинета. Если кабинет не задак, как ориентированный по данному предмету, то -1

    property GetSubjTeacherI[Index: Integer]: IASubjTeacher readonly dispid 12;  // Получить subjTeacher по индексу
    property GetSubjTeacherT[const Teacher: IATeacher]: IASubjTeacher readonly dispid 13; // Получить SubjTeacher по имени преподавателя. Если SubjTeacher не существует, генерируется исключение.
    property SubjTeacherCount: Integer readonly dispid 14; // Количество SubjTeacher'ов.
    property AddSubjTeacher[const Teacher: IATeacher]: IASubjTeacher readonly dispid 15; // Создать SubjTeacher.
    property AddSubjTeacherN[const TeacherName: WideString]: IASubjTeacher readonly dispid 24; // Создать SubjTeacher.
    procedure DeleteSubjTeacher(const Teacher: IATeacher); dispid 16; // Удалить SubjTeacher
    property GetSubjTeacherIndex[const Teacher: IATeacher]: Integer readonly dispid 17; // Порлучить индекс SubjTeacher. Если SubjTeacher не существует, то -1.
    property GetSubjTeacherN[const TeacherName: WideString]: IASubjTeacher readonly dispid 28; // Получить SubjTeacher по названию преподавателя. Если такого SubjTeacher не существует, то генерируется исключение.

// работа с SubjTeacher и SubjCls полностью идентична.

    property GetSubjClsI[Index: Integer]: IASubjCls readonly dispid 18;
    property GetsubjClsC[const Cls: IACls]: IASubjCls readonly dispid 19;
    property SubjClsCount: Integer readonly dispid 20;
    property AddSubjCls[const Cls: IACls]: IASubjCls readonly dispid 21;
    procedure DeleteSubjCls(const Cls: IACls); dispid 22;
    property GetSubjClsIndex[const Cls: IACls]: Integer readonly dispid 23;
    property AddSubjClsN[const ClsName: WideString]: IASubjCls readonly dispid 25;
    property GetSubjClsN[const ClsName: WideString]: IASubjCls readonly dispid 27;

    property Tag: Integer dispid 29; // данное поле можно использовать по своему усмотрению.
  end;

  IALangDisp = dispinterface
// Инофрмация об иностранном языке
    ['{CB66DFEF-FD87-45C3-9DFC-67D38FC52660}']
    property Name: WideString dispid 1; //Название. Пример "Английский язык"
    property ShortName: WideString dispid 2; // Короткое название
    property ClsGrpCount: Integer readonly dispid 4; // Количество классогрупп, в которых ведется данный иностранный язык.
    property TeacherCount: Integer readonly dispid 5; // Количество преподавателей, ведущих данны иностранный язык.
    property GetClsGrp[Index: Integer]: IAClsGrp readonly dispid 6; // Получить классогруппу, в которой ведется данный иностранный язык, по индексу
    property GetTeacher[Index: Integer]: IATeacher readonly dispid 7; // Получить преподавателя, ведущего данный иностранный язык по индексу
    property IsTeacher[const Teacher: IATeacher]: Smallint readonly dispid 8; // проверяет, есть ведет ли преподаватель данный иностранный язык.
    property Tag: Integer dispid 3; // данное поле можно использовать по своему усмотрению.
  end;

  IAClsGrpDisp = dispinterface
// Классогруппа - это множество учеников одного класса, которые занимаются одним предметом. Чаще всего классогруппа - это 
// представляет из себя класс. Если по какому-то предмету производится деление на группы, то по этому предмету будет
// более одной классогруппы.

    ['{DAAB1375-C6CB-4D7F-9943-9ECD2DDBD2C4}']
    property Group: Integer dispid 2; // номер группы. Если классогруппа представляет из себя целый класс, то 0. Если нет, то 1..<количество групп>
    property Pairs: Smallint dispid 3; // Занятия в данной классогруппе проводятся парами
    property RaspNagrEqualsNagr: Integer readonly dispid 4; // Если распределенная нагрузка меньше нагрузки, которую необходимо распределить, то 0. Если они равны, то <>0
    property TimeTableSubject: WideString readonly dispid 5; // название предмета в расписании. Если Lang<>nil, то это название Lang.Name, иначе Subject.Name
    property TimeTableShortSubject: WideString readonly dispid 6; // Короткое название предмета. Аналогично TimeTableSubject.
    property Subject: IASubject readonly dispid 7; // Предмет классогруппы. Реально - SubjCls.Subject
    property Lang: IALang dispid 8; // Если классогруппа по иностранному языку, то это ссылка на иностранный язык, если нет, то nil.
    property Nagr: Integer dispid 9; // Нагрузка, которую необходимо распределить.
    property AmountGr: Integer dispid 10; // Количество учеников в классогруппе.
    property Key: Integer dispid 11; // Ключ классогруппы. Ключи должны быть уникальными.
    property Teacher: IATeacher readonly dispid 13; // Преподаватель ведущий в классогруппе. Реально SubjTeacher.Teacher.
    property Cls: IACls readonly dispid 14; // Класс. Реально - SubjCls.Cls
    property ClsName: WideString readonly dispid 15; //Наименование класса. Реально Cls.Name. Если SubjCls не задан, то ""
    property TeacherName: WideString readonly dispid 16; // ФИО преподавателя. Teacher.Name. Если SubjTeacher не задан, то ""
    property SubjTeacher: IASubjTeacher dispid 17; // SubjTeacher данной классогруппы.
    property SubjCls: IASubjCls dispid 18; // SubjCls данной классогруппы.
    property RaspNagr: Integer readonly dispid 19; // Рапределенная нагрузка
    procedure ClearAllLessons; dispid 20; // Очищает все занятия классогруппы.
    procedure SetSubjectTeacherCls(const Subject: WideString; const Teacher: WideString; 
                                   const Cls: WideString); dispid 1; // Устанавливает SubjTeacher и SubjCls по наимаенованиям.
    property Tag: Integer dispid 12; //  данное поле можно использовать по своему усмотрению.
    property GetLesson[Day: Integer; Lesson: Integer; Week: Integer]: IAClsGrpLesson readonly dispid 21;// Получить ClsGrpLesson.
  end;

  IASubjClsDisp = dispinterface // предназначен для хранения нагрузки из уч. плана по какому-то предмету у какого-то класса
  				// также хранится список классо-групп этого класса по этому предмету
    ['{D4668C3F-999F-4379-A93E-1EF86A03A121}']
    property ClsGrpCount: Integer readonly dispid 3;  //получить кол-во классо-групп по этими классом и предметом
    property GetClsGrp[Index: Integer]: IAClsGrp readonly dispid 4; //получить классо-группу по индексу
    property Cls: IACls readonly dispid 5; // класс, которому соответствует данный объект
    property Subject: IASubject readonly dispid 6; // предмет, которому соответствует данный объект
    property Nagr: Integer dispid 1; // нагрузка по уч. плану
    property Tag: Integer dispid 2; // данное поле можно использовать по своему усмотрению 
  end;

  IASubjTeacherDisp = dispinterface  // предназначен для хранения предметов препода (для каждого предмета каждого преподавателя существует такой объект)
  				     // также хранится список классо-групп в которых ведет этот преподаватель
    ['{A4D9F49F-6DCB-41D8-9E0C-B997D264A835}']
    property ClsGrpCount: Integer readonly dispid 1; //получить кол-во классо-групп в которых ведет этот преподаватель
    property GetClsGrp[Index: Integer]: IAClsGrp readonly dispid 2; //получить классо-группу по индексу
    property Teacher: IATeacher readonly dispid 3; // преподаватель, которому соответсвует этот объект
    property Subject: IASubject readonly dispid 4; // предмет, которому соответствует данный объект
    property Tag: Integer dispid 5; // данное поле можно использовать по своему усмотрению 
  end;

  IAKeyArrayDisp = dispinterface // интерфейс к массиву для хранения integer`ов
    ['{70723371-7A2F-42D9-939B-85256EF42E5F}']
    property KeyCount: Integer readonly dispid 1; // количество элементов в массиве
    property Key[Index: Integer]: Integer readonly dispid 2; // получить элемент по индексу
    property KeyIndex[Key: Integer]: Integer readonly dispid 3; // получить индекс элемента по значению
    procedure AddKey(Key: Integer); dispid 4; // добавить элемент в массив
    procedure DeleteKey(Index: Integer); dispid 5; // удалить элемент с заданным индексом из массива
  end;


  // объект IAKeyBase предназначен для хранения идентичных групп (IATimeTable.IdentGroupBase) и поточных занятий (IATimeTable.PotokLessonBase)

  // При хранении идентичных групп создаются группы ключей (функции для работы - GroupCount и GetGroupUseIndex).
  // В этих группах хранятся ключи классо-групп одного класса по одному предмету.
  // Терминология следующая: идентичные классо-группы - те, которые совпадают по списочному составу
  //			     дополнительные классо-группы - принадлежащие одному классу, но с непересекающимся списочным составом
  // ВНИМАНИЕ! При создании новой классо-группы, которая является частью класса (IAClsGrp.Group<>0) ее надо обязательно добавлять
  // в базу идентичных групп, даже если нет классо-групп, идентичных ей

  // При хранении поточных занятий те же самые группы используются по другому - в них хранятся ключи классо-групп,
  // занимающихся в потоке (вместе на одном занятии)

  
  IAKeyBaseDisp = dispinterface  // интерфейс к объектам, отвечающим за хранение информации об идентичных группах и поточных занятиях
    ['{BD862A64-141F-4E5A-BEF5-BD13C787B37E}']
    property GetIdenticals[Key: Integer]: IAKeyArray readonly dispid 1; // получить список ключей классо-групп, идентичных классо-группе с ключем Key (кроме самой классо-группы с ключом Key)
    property GetCrossesForKeyArray[const Keys: IAKeyArray]: IAKeyArray readonly dispid 2; // получить список ключей классо-групп, дополнительных к любой классо-группе с ключем, входящим в Keys (т.е. если классо группа не дополнительна хотя бы к одной из классо-групп из Keys, тогда ее не будет в полученном списке)
    property GetCrosses[Key: Integer]: IAKeyArray readonly dispid 3; // получить список ключей классо-групп, дополнительных к классо-группе с ключем Key
    property GetGroup[Key: Integer]: IAKeyArray readonly dispid 4; // получить все ключи из группы, в которую входит Key, включая его самого
    property IsSameGroup[Key1: Integer; Key2: Integer]: Smallint readonly dispid 5; // 0 - если ключи из разных групп, <>0 - если ключи из одной группы
    property IsIdentical[Key1: Integer; Key2: Integer]: Smallint readonly dispid 6; // <>0, если классо-группы с ключами Key1 и Key2 идентичны, 0 - если нет
    property IsCross[Key1: Integer; Key2: Integer]: Smallint readonly dispid 8; //<>0, если классо-группы с ключами Key1 и Key2 дополнительны, 0 - если нет
    procedure AddKeyToGroup(AnyKeyInGroup: Integer; AnyIdent: Integer; Key: Integer); dispid 9; // Добавить ключ Key в группу. Группа определяется по AnyKeyInGroup (любой ключ, из уже существующей группы). Если AnyKeyInGroup<0, тогда создается новая группа. Если AnyIdent>=0, тогда добавленная классо-группа становится идентичной классо-группе с ключом AnyIdent
    procedure DeleteKey(Key: Integer); dispid 10; // удалить ключ Key из базы
    procedure SetIdent(Key: Integer; AnyIdent: Integer); dispid 11; // сделать классо-группу с ключом Key идентичной классо-группе с ключом AnyIdent
    procedure Clear; dispid 12; // удалить все ключи из базы
    property KeyCount: Integer readonly dispid 13; // количество ключей, добавленных в базу
    property GetKey[Index: Integer]: Integer readonly dispid 14; // получить ключ по индексу
    property IsKeyInBase[Key: Integer]: Smallint readonly dispid 15; // 0 - если ключа нет в базе, <>0 - если ключ есть в базе
    property IdentGroupCount: Integer readonly dispid 16; // количество групп ключей, хранящих информацию об идентичных ключах
    property GetIdentGroup[Index: Integer]: IAKeyArray readonly dispid 17; // получить группу ключей, хранящую информацию об идентичных ключах, по индексу
    property GetIdentGroupIndex[Key: Integer]: Integer readonly dispid 18; // получить индекс группы, хранящей информацию об идентичных ключах, по любому ключу из этой группы
    property FindKeyIndex[Key: Integer]: Integer readonly dispid 19; // получить индекс ключа в базе
    property GroupCount: Integer readonly dispid 20; // количество групп ключей
    property GetGroupUseIndex[Index: Integer]: IAKeyArray readonly dispid 21;  // получить группу ключей по индексу
  end;

  IAParallelDisp = dispinterface //параллель, содержащая список классов в ней
    ['{041A9F24-F0EB-408E-B092-8CDF26435776}']
    property Number: Integer dispid 1; // номер параллели
    property Name: WideString dispid 2; // наименование параллели (можно не задавать)
    property ClassPrefix: WideString dispid 3; // номер параллели в строковом виде
    property ClsCount: Integer readonly dispid 4; // количество классов в параллели
    property GetCls[Index: Integer]: IACls readonly dispid 5; // получить класс по индексу
    property GetClsIndex[const Cls: WideString]: Integer readonly dispid 7; // получить индекс класса по его имени
    property AddCls[const Name: WideString]: IACls readonly dispid 8; // добавить в параллель класс с указанным именем
    property Tag: Integer dispid 6; // данное поле можно использовать по своему усмотрению
  end;

  IAClsGrpLessonDisp = dispinterface // информация о конкретном уроке классо-группы
    ['{AAFC894D-ABD0-4951-9A05-D3DD41E71005}']
    property LessonPresent: Smallint dispid 1; // Занимается ли классо-группа на этом уроке (0 - не занимается, <>0 - занимается)
    property ClsGrp: IAClsGrp readonly dispid 2; // классо-группа, которой принадлежит это занятие
    property ClsLesson: IAClsLesson readonly dispid 3; // занятие класса, соответствующее этому занятию классо-группы
    property TeacherLesson: IATeacherLesson readonly dispid 4; // занятие преподавателя, соответствующее этому занятию классо-группы (nil, если LessonPresent=0)
  end;

  IAClsLessonDisp = dispinterface //информация о классе на каком-то конкретном уроке
    ['{2AD13F28-61CE-4147-AEA3-D7C7F8E1C25D}']
    property Busy: Smallint dispid 1; // признак графика работы класса: 2 - не может заниматься на этом уроке; 0 - может заниматься
    property Cls: IACls readonly dispid 2; // класс, которому принадлежит это занятие
    property ClsGrpLessonCount: Integer readonly dispid 3; // Количество занятий классо-групп этого класса, занимающихся на этом уроке
    property ClsGrpLesson[Index: Integer]: IAClsGrpLesson readonly dispid 4; // получить по индексу занятие классо-группы этого класса, занимающейся на этом уроке
    property AllAmount: Integer readonly dispid 5; // суммарная численность классо-групп класса, занимающихся на это уроке
  end;

  IATeacherLessonDisp = dispinterface // информация о преподавателе на каком-то конкретном уроке
    ['{94152875-C778-4DAF-B4EC-A5D8E6E69726}']
    property Teacher: IATeacher readonly dispid 1; // преподаватель, которому принадлежит это занятие
    property Busy: Smallint dispid 2; // признак графика работы преподавателя: 2 - не может работать на этом занятии; 1 - может работать, но нежелательно; 0 - работает без ограничений
    property AmountGr: Integer readonly dispid 4; // сумма численностей всех классо-групп, занимающихся у этого преподавателя на этом занятии
    property ClsGrpLessonCount: Integer readonly dispid 5; //Количество занятий классо-групп, занимающихся у этого преподавателя на этом уроке
    property ClsGrpLesson[Index: Integer]: IAClsGrpLesson readonly dispid 6; // получить по индексу занятие классо-группы
    property CabinetLesson: IACabinetLesson dispid 7; // занятие кабинета, в котором проходит это занятие преподавателя (если кабинет не назначен, тогда = nil)
    property CabinetName: WideString dispid 8; // название кабинета, в котором проходит это занятие преподавателя (если кабинет не назначен, тогда = "");
  end;

  IACabinetLessonDisp = dispinterface // информация о кабинете на каком-то конкретном уроке
    ['{02F05EB0-F957-4DE4-B831-A2155CA47545}']
    property Cabinet: IACabinet readonly dispid 1; // кабинет, которому принадлежит это занятие
    property AllAmount: Integer readonly dispid 2; // суммарная численность групп, занимающихся в этом кабинете на этом занятии
    property TeacherLessonCount: Integer readonly dispid 3; // кол-во занятий преподавателей, которые занимаются на этом занятии в этом кабинете
    property TeacherLesson[Index: Integer]: IATeacherLesson readonly dispid 4; //получить по индексу занятие преподавателя, который находится в этом кабинете на этом занятии
    property Busy: Smallint dispid 5; // признак предварительной занятости кабинета: 2 - не может быть использован на этом занятии; 0 - может быть использован без ограничений
  end;
