ВЫВОД СИМВОЛОВ НА ЭКРАН
OVER, CSIZE, USING, USING$(), KEYWORDS, SCRN$(), PLOT, ALTER
Beta Basic, помимо стандартных, использует дополнительные коды управления выводом на экран:
Окно Экран Действие
CHR$ 8 CHR$ 2 курсор влево
CHR$ 9 CHR$ 3 курсор вправо
CHR$ 10 CHR$ 4 курсор вниз
CHR$ 11 CHR$ 5 курсор вверх
- CHR$ 12 удаление символа (Delete)
— CHR$ 15 пробел + возврат каретки
В этой табличке коды, указанные в первой
колонке, управляют курсором в пределах текущего текстового окна (см.
стр.249), не позволяя курсору «выскочить» за границы окна.
Коды из второй колонки игнорируют все ограничения и позволяют курсору
«гулять» по всему экрану.
Приведем пример, иллюстрирующий применение этих кодов:
10 LET L$=CHR$ 8: LET R$=CHR$ 9 20 LET D$=CHR$ 10: LET U$=CHR$ 11
30 LET a$=,,r'+D$+L$+"2345''+U$+L$+"6"+U$+L$+"7"+
L$+L$+L$+"89" 40 PRINT AT 1,0; a$
Строка, выведенная на экран, будет иметь вид:
897 1 6 2345
Обратим Ваше внимание еще на одно необычное
свойство Beta Basic: оператор OVER, кроме привычных 0 и 1, может
использоваться с параметром 2. OVER 2 позволяет выводить на экран
символы, не затирая и не инвертируя экранного изображения — вывод
происходит как бы внакладку.
Beta Basic позволяет устанавливать произвольный размер символов, выводимых на экран. Делается это с помощью оператора
CSIZE <ширина знакоместа>,<высота знакоместа>
После выполнения этого оператора символы при
выводе на экран будут вписываться в знакоместа «нового
покроя», размеры которых (в пикселях) задаются параметрами
<ширина знакоместа> и <вь»с.ота знакоместа>. Устноька
шрифт сохраняется до следующего оператора CSIZE. Однако, этот оператор
может оказывать и временное действие, если его разместить в операторах
PRINT или PLOT подобно INK, PAPER, BRIGHT и FLASH. Проиллюстрировать
работу оператора CSIZE может следующая программка:
100 CSIZE 50,100
150 PRINT AT 0,0;"Q": REM Огромный символ
200 PAUSE 100: PRINT AT 0,0
400 FOR i=0 TO 15: REM Каждая новая строка... 600 CSIZE 4+i,8+i: PRINT "QWERTY": REM ...печатается символами
большего размера 800 NEXT i 900 CSIZE 4,8
Рассматривая полученное на экране изображение,
можно заметить, что Beta Basic использует только два символьных набора:
один — для знакомест шириной до 5 пикселей, другой — для
всех остальных. Размер символов может меняться лишь для второго набора,
но только дискретно (кратно четырем пикселям). Изменение параметров
CSIZE между скачками приводит лишь к изменению расстояний между
символами и строками (рис. 22).
При равенстве высоты и ширины символов
допустимо указывать лишь один параметр, то есть инструкции CSIZE 8 и
CSIZE 8,8 эквивалентны.
После изменения размеров шрифтов операторы позиционирования печати AT и TAB начинают работать в новой сетке знакомест.
Задавая оператором CSIZE сетку из
«знакомест-лилипутов» или
«знакомест-Гулливеров» и при этом активно меняя цвета
выводимых символов, можно ненароком получить на экране вермишель из
«перенедокрашенных» знаков. Нормальную окраску символов
можно установить, лишь задавая параметрам CSIZE значения, кратные
восьми. Следует также учитывать, что при установленных размерах
знакомест меньше 6 пикселей печатаются только правые половины символов
UDG.
Непревзойденной гибкостью в размещении символов на экране обладает оператор
PLOT [список атрибутов; ] < х >, < у > [; < строка символов > ]
PLOT с новым синтаксисом выводит строку
символов, привязывая левый верхний угол первого символа к точке с
координатами <х> и <у>. Перед параметрами, задающими
координаты точки вывода, можно поставить любые ключевые слова,
управляющие атрибутами.
PLOT с опущенной <строкой символов> ничем
не отличается от стандартного синклеровского оператора — он
ставит на экране точку с координатами <х> и <у>.
Интересной особенностью новой модификации
оператора PLOT является то, что при выводе символов в точку с
координатами (0,0) он размещает их ниже 22-й строки экрана, то есть на
служебном экране.
СЗПС «,» CSIZE в, в
C5IZC $/l CSIZE в,в
CSI2C ®'10
CSIZE в,® CSIZE 8.12
CSIZE 8,14 CSIZE 8,16
SSilS CSIZE 8,18
11CSIZE 8,20
Рис. 22. Шрифты различной ширины и высоты.
Параметр <строка символов) может иметь произвольную длину и включать в себя различные управляющие символы*.
При достижении выводимым текстом правой границы
экрана не происходит перехода на следующую строку, вывод продолжается с
начала этой же строки. Если длина текста больше ширины экрана, то конец
его затрет начало. Для корректного размещения текста необходимо
пользоваться управляющими кодами.
Приведем впечатляющий пример применения оператора PLOT: 10 FOR N=0 ТО 255: PLOT N,N/2;"DEMO": NEXT N
Эффект плавно «летящего» по экрану
слова возникает в этой программе оттого, что новая позиция вывода
строки отличается от предыдущей всего на один пиксель по горизонтали и
вертикали. Поскольку изображение большинства символов не плотно
вписывается в знакоместо, а имеет окантовку толщиной в один пиксель, то
при нахлесте строки, выводимой PLOT-методом со смещением на один
пиксель, старый текст затирается новым. К сожалению, этот метод не
может использоваться для перемещения символов, изображение которых
примыкает к самому ki >ю знакомесга (q, у и некоторых других) — при перемещении этим способом они будут оставлять на экране след.
Спектр применения оператора PLOT весьма широк:
это подписи к иллюстрациям, разметка осей графиков, вывод верхних и
нижних индексов в математических и химических формулах и т. д.^
Приведем пример программки, выводящей на экран химическую формулу (рис.
23):
10 LET А$="С~2Н~50Н" 20 CSIZE 8: LET Х=0, Y=170, F=0, А=8 30 FOR N=1 ТО LEN А$
40 IF A$(N)="~" THEN LET Y=Y-3, F=1, A=4: CSIZE
4: NEXT N 50 PLOT X,Y;A$(N): LET X=X+A 60 IF F THEN LET Y=Y+3: CSIZE 8:
LET F=0, A=8 70 NEXT N: CSIZE 4,8
Рис. 23. Пример использования оператора PLOT.
В этом примере управление выводом на экран
осуществляется с помощью знака Он указывает на то, что следующий за ним
символ необходимо печатать как нижний индекс, то есть после встречи
знака ~ в тексте позиция вывода понижается на 3 пикселя и уменьшается
размер символа (строка 40).
В операторе PLOT управляющий символ CHR$ 15 перемещает позицию вывода к началу строки.
Beta Basic позволяет преобразовывать числа в
символьную форму по заданному шаблону. Осуществить эту операцию можно
либо с помощью функции
USING$ (< шаблон >, < числовое выражение>)
- либо вставив ключевое слово USING в строку следом за PRINT:
PRINT USING < шаблон >
<Шаблон> — это символьная строка, состоящая из знаков # и О, задающих позиции для вывода цифр, и точки (,). определяющей положение десятичной запятой. Например:
LET A$=USING$ ("###.#####", 12.3456)
Если количество знаков в целой части числа
меньше количества символов, отведенного для них шаблоном (как в
примере), то функция USING$ вернет строку, в которой недостающие слева
знаки будут заполнены:
• пробелами, если в шаблоне использованы символы #;
• нулями, если в шаблоне использованы символы 0.
При попытке впихнуть в «прокрустово
ложе» шаблона число, у которого целая часть больше, чем позволяет
шаблон, оно будет усечено. При этом первым символом в нем будет стоять
знак процента (%), сигнализируя о некорректном форматировании.
Недостающие символы в дробной части числа
(справа от точки) во всех случаях замещаются нулями. Лишние знаки
отсекаются, а число округляется. Приведем примеры различного
форматирования числа 123.456*:
Представление
123.456
123.4560 00123.4560 123.5 %2..5 123.4.6 123.4%6 format 123.456 123.4%%ormat
Шаблон
###.###
######.####
00000.0000 ####.#
###.#е# format ###.### ### # format
Из примеров видно, что в маску функции USING$
можно включать и другие символы, но так, чтобы они стояли до шаблона.
Только в этом случае гарантируется корректная запись числа. Отметим,
что функция USING$ не работает с экспоненциальным представлением чисел.
Для наглядности пробелы в примерах заменены символом подчеркивания (.).
Beta Basic обладает великолепным инструментом преобразования атрибутов экрана. Оператор
ALTER [<список атрибутов 1>] ТО [<список атрибутов 2>]
ищет на экране знакоместа, атрибуты которых
соответствуют списку, приведенному в первом параметре, и заменяет в
этих знакоместах атрибуты на новые, представленные списком во втором
параметре. ALTER может работать одновременно с любой комбинацией
атрибутов:
ALTER INK 3, BRIGHT 1 ТО PAPER 6, FLASH 1
Приведенный оператор, конечно же, не меняет INK
на PAPER, а BRIGHT на FLASH. В знакоместах, для которых задано
одновременно и INK 3, и BRIGHT 1, он устанавливает PAPER 6 и FLASH 1,
не затрагивая других атрибутов.
Левый список атрибутов в операторе ALTER может быть и пустым:
ALTER ТО PAPER 5, INK 2, BRIGHT 1
В этом случае атрибуты переустанавливаются для
всего экрана. Но в отличие от операторов INK, PAPER, BRIGHT и FLASH,
оператор ALTER задает временные атрибуты. То есть и после выполнения
оператора ALTER вывод информации на экран будет продолжаться с ранее
установленными постоянными атрибутами.
Пользуясь оператором ALTER, можно весьма эффектно уводить экран в затемнение и выходить из него.
Завершая описание операций вывода на экран символьной информации, рассмотрим функцию
SCRN$ (<строка>,<стоп6ец>)
Она возвращает символ, расположенный на экране в позиции (<строка>,<столбец>),
то есть выполняет то же действие, что и функция SCREENS
Spectrum-Бейсика. Но в отличие от прототипа, SCRN$ распознает на экране
не только символы текущего набора, но и символы, определяемые
пользователем (UDG), которые выводятся на экран в режиме KEYWORDS 0.
Как SCREEN$, так и SCRN$ работают только в режиме CSIZE 8.