С учетом этих замечаний изменим основную процедуру группы InitTask следующим образом:
>procedure InitTask(num: integer);
>begin
>case num of
>1..2: UseTask('Begin', num);
>3: MakerDemo3;
>4: MakerDemo4;
>5: MakerDemo5;
>6: MakerDemo6;
>7: MakerDemo7;
>8: if CurrentLanguage and lgWithPointers <> 0 then
>MakerDemo8
>else
>MakerDemo8Obj;
>9: MakerDemo8Obj;
>end;
>end;
В этой процедуре используется функция CurrentLanguage, позволяющая определить текущий язык программирования, используемый задачником. Если текущий язык относится к категории языков, поддерживающих указатели (в том числе PascalABC.NET), то в качестве задания номер 8 вызывается процедура MakerDemo8, в которой задание формулируется в терминах указателей. В противном случае вызывается вариант задания, использующий объектную терминологию. При использовании языка PascalABC.NET число заданий в группе будет равно 9; при этом дополнительное задание номер 9 будет представлять собой объектный" вариант задания номер 8.
Функцию CurrentLanguage потребуется использовать и в начале процедуры inittaskgroup для того, чтобы правильно определить количество заданий в группе для разных языков программирования. Приведем фрагмент, на который надо заменить вызов процедуры CreateGroup и предшествующее ему ключевое слово begin (обратите внимание на то, что теперь в качестве предпоследнего параметра процедуры CreateGroup используется переменная n):
>var
>n: integer;
>begin
>n := 7;
>if CurrentLanguage = lgPascalABCNET then
>n := 9
>else
>if CurrentLanguage and (lgWithPointers or lgWithObjects) <> 0 then
>n := 8;
>CreateGroup('MakerDemo', 'Примеры различных задач',
>'М. Э. Абрамян, 2013', 'qwqfsdf13dfttd', n, InitTask);
Приведенный набор условий будет правильно определять количество заданий и в случае, если состав языков, поддерживаемых задачником, будет расширен. Это обеспечивается тем, что в условиях используются не константы для конкретных языков (за исключением константы lgPascalABCNET), а битовые маски lgWithPointers и lgWithObjects. Первая из этих масок включает все языки, для которых в задачнике можно использовать варианты заданий на динамические структуры, основанные на указателях, а вторая -- все языки, позволяющие использовать варианты аналогичных заданий в объектной терминологии.
В среде PascalABC.NET можно протестировать оба варианта реализованного задания. Приведем вид окна задачника для этого задания (первый рисунок соответствует варианту задания, использующему указатели, второй -- варианту, использующему объекты). Обратите внимание на кнопки, расположенные справа от формулировки задания и обеспечивающие ее прокрутку.
Завершая оформление модуля PT4MakerDemo, добавим комментарии к новым подгруппам заданий (указанные операторы следует поместить в конец процедуры inittaskgroup):
>Subgroup('Двумерные массивы (матрицы): вывод элементов');
>CommentText('Данное задание дублирует задание Matrix7.');
>Subgroup('Символьные и строковые файлы');
>CommentText('Данное задание дублирует задание File63.');
>CommentText('Оно демонстрирует особенности, связанные с двоичными');
>CommentText('\Iстроковыми\i файлами.');