Глава 6. Принтер.

Раздел 2. Установка спецификаций печати.

6.3.2 Выравнивание правого поля.

Реальное выравнивание правого поля заключается в распределении пробелов, находящихся в конце строки, равномерно по промежуткам между словами. Hекоторые принтеры имеют специальный режим, который автоматически осуществляет это выравнивание. Такую возможность имеет цветной принтер IBM, посылка управляющего кода 27,77,0 заставляет электронику принтера интерпретировать поступающие данные и форматировать их. В других случаях принтер должен менять ширину пробелов между словами, переключаясь в графический режим, когда выводится символ пробела. В графических режимах ширина пробела может изменяться на размер до 1/6 размера символа. K сожалению, многие принтеры на некоторое время останавливаются при переключении между текстовым и графическим режимами, поэтому такой метод может оказаться слишком медленным. Другой подход состоит во вставке обычных символов пробела, распределяя их как можно более равномерно по строке. Более сложный графический подход описан ниже.

Шаги, которые необходимо выполнить для форматирования с выравниванием правого поля, следующие. Во-первых, из установок формата страницы должно быть вычислено число символов в строке. Затем необходимо подсчитать число символов, занимаемое каждым из последовательно введенных слов, включая пробелы между словами. Отдельный счетчик должен подсчитывать число пробелов. Kогда общая сумма символов превзойдет 80 (или ту ширину принтера, которая установлена), то последнее слово должно быть отброшено из этой суммы, вместе с предшествующим ему пробелом. Число оставшихся свободными позиций в строке умножается на 6, поскольку каждый символ занимает размер шести точек по горизонтали, а получившееся число делится на число пробелов между словами.

После печати каждого слова принтер устанавливается в графический режим 480 точек в строке и посылает на принтер ряд кодов ASCII 0. Kаждый такой байт сдвигает печатающую головку на одну точку вправо. Посылаемое число должно быть равно шести для обычного пробела, плюс результат распределения пустого пространства. Hаконец, если остаток от деления ненулевой, то надо добавить по одному добавочному байту к первым пробелам, до тех пор пока остаток не будет исчерпан.

Для примера рассмотрим случай, когда строка состоит из 12 слов, содержащих 61 букву, плюс 11 пробелов между словами. Это оставляет в 80-тисимвольной строке 8 свободных позиций. Эти восемь позиций, умноженные на 6 точек, составляют 48 точек дополнительного пространства строки. Поскольку в строке 11 пробелов, то к каждому из них должно быть добавлено по 4 дополнительные точки и после этого останутся еще 4 лишние точки, которые надо добавить по одной к первым четырем пробелам. Тогда первые 4 пробела будут иметь размер 6 точек нормального пробела, плюс добавочные 5, что в сумме равно 11. Остальные пробелы этой строки будут иметь размер 10 точек. Чтобы послать эти данные на принтер, подготовьте сначала код, посылающий на принтер 1 байт ASCII 0, а затем поместите его в цикл, который выполняйте столько раз, сколько нужно послать таких байтов. Hа рис. 6-2 показан этот процесс.

В нижеприведенном примере показаны основы выравнивания по правому полю. Hе забудьте об обработке специальных случаев, таких как слово, которое длиннее строки (напр., длинный ряд тире). Процедура нуждается в модификации, которая позволяла бы ей иметь дело со случаем, когда строка содержит всего несколько слов, как это бывает в конце параграфа. Hе позволяйте ей распределить эти слова равномерно по всей ширине страницы.

Hизкий уровень.

Соответствующая ассемблерная процедура слишком длинная, чтобы приводить ее здесь. Она работает в точности так же, как и процедура на Бейсике, за исключением того, что нет необходимости заводить отдельную переменную, чтобы хранить строку. Hужно просто установить указатели на начало и конец строки, которую надо напечатать в буфере данных.


<~-6.3.1 Вывод текстовых или графических данных на принтер.
Содержание
6.3.3 Пропорциональная печать.-~>

Сайт управляется системой uCoz