Прямой ввод-вывод: Часть II
3.2.1.3. Реализация в Бейсике
Бейсик нумерует строки от 1 до 25, а столбцы - от 1 до 80. Абсолютная позиция строки задаётся оператором LOCATE.
ОПЕРАТОР | LOCATE |
Синтаксис: |
LOCATE строка, столбец где
|
Назначение: | Абсолютное позиционирование строки. |
Пример 3.7.
REM Переместить курсор в центр экрана LOCATE 12, 40
Подробнее см. [Джордейн]
3.2.1.4. Реализация в Perl и Python
Абсолютное позиционирование в Perl и Python не реализовано.
3.2.1.5. Реализация в языке Turbo Prolog
Абсолютное позиционирование в Turbo Prolog осуществляется с помощью специальной функции (см. примеры ниже).
ФУНКЦИЯ: | CURSOR |
СИНТАКСИС: | cursor(Row, Column), где Row - целая переменная, устанавливающая или считывающая значение позиции строки выводимых символов, Column - целая переменная, устанавливающая или считывающая значение столбца на экране, куда выводится символ; |
НАЗНАЧЕНИЕ: | Устанавливает или считывает позицию курсора в окне; |
ОПИСАНИЕ: | Шаблон: (i,i) Перемещает курсор в указанную позицию ( Row,Column ) относительно начальной позиции (0,0) в активном окне. Шаблон: (o,o), связывает Row и Column с текущей позицией курсора. Никогда не даёт неудачного завершения; |
ШАБЛОНЫ: | (i,i) (o,o) ; |
ВОЗВРАЩАЕМОЕ ЗНАЧЕНИЕ: | Никогда не даёт неудачного завершения; |
ОШИБКИ: | * 1001 Недопустимые значения позиции курсора. |
Пример 3.8.
/* Реализация абсолютного позиционирования курсора средствами спец. функции Турбо Prolog. */ … cursor(12, 39), …
3.2.2. Относительное позиционирование курсора
Функции относительного позиционирования курсора выполняются только через escape-последовательности. Они выводятся на экран на ассемблере с помощью функции 9 прерывания 21H. В таблице 2.1 приводится вид escape-последовательностей для разных операций. Такие последовательности интерпретируются оболочкой как команды управления дисплеем, а не вывод символов строки.
Возможны следующие направления перемещения курсора:
- вверх на число строк: esc[числоA ;
- вниз на число строк: esc[числоB ;
- вправо на число позиций: esc[числоC ;
- влево на число позиций: esc[числоD ;
- включение автоматического перевода курсора на следующую строку: esc[=7h;
- выключение автоматического перевода курсора на следующую строку: esc[=7l;
Кроме того, для управления курсором часто используются следующие "пробельные" метасимволы (см. таблицу 2.2).
Подробнее см. [MS-DOS 6.0, Финогентов 1]
3.2.2.1. Реализация на Ассемблере
Для управления относительным перемещением курсора на языке ассемблера необходимо:
- задать константу, содержащую эту управляющую последовательность (с последним знаком: "$" );
- в нужном месте выполнить функцию 9 прерывания 21H.
См. пример 3.5.
3.2.2.2. Реализация на языке Си
Вывод escape - последовательностей осуществляется с использованием функции puts (потоковая функция).
Тексты примеров с использованием escape - последовательностей приведены выше (см. пример 3.3. и др.)
Для переноса вывода в начало новой строки в языке C-- есть функция WRITELN:
ФУНКЦИЯ | WRITELN |
СИНТАКСИС: | WRITELN() ; |
НАЗНАЧЕНИЕ: | Перемещает курсор в начало следующей строки; |
ВХОДНЫЕ ПАРАМЕТРЫ: | нет; |
ФУНКЦИЯ ВОЗВРАЩАЕТ: | * AX = 0xE0A; * BX = 7; |
3.2.2.3. Реализация на Бейсике
В реализации функций относительного позиционирования курсора на Бейсике возможны следующий вариант:
ФУНКЦИЯ | TAB |
СИНТАКСИС: | TAB( число ), где число - целая константа или переменная, определяющая отступ (в знаках) от позиции начала строки вывода. |
НАЗНАЧЕНИЕ: | Функция сдвигает текстовый курсор в указанную позицию вывода на строке. |
ВОЗВРАЩАЕМЫЕ ЗНАЧЕНИЯ: | нет. |
3.2.2.4. Реализация в Perl и Python
В языках Perl и Python относительное позиционирование курсора возможно с помощью "пробельных" управляющих символов.
Пример 3.9.
# Реализация на Perl # отступ на семь позиций влево с использованием горизонтальной позиции табуляции print "\n\tТекст";
Пример 3.10.
# Реализация на Python примера 3.09. # отступ на семь позиций влево с использованием горизонтальной позиции табуляции print "\n\tТекст";
3.2.2.5. Реализация в Turbo Prolog
В языке Turbo Prolog относительное позиционирование курсора возможно с помощью "пробельных" управляющих символов.
Пример 3.11.
/* Реализация на Prolog примера 03.009. */ /* отступ с использованием горизонтальной позиции табуляции */ … nl, write( "\tТекст" ), …
3.2.3. Запоминание позиции курсора
Иногда возникают ситуации, когда надо прервать вывод текста, перевести курсор в другую позицию, вывести или ввести параметры программы, а затем продолжить вывод текста со "старого" места.
Реализацию этой последовательности действий можно осуществить следующим образом:
- Чтением абсолютной позиции курсора;
- Запоминанием последней позиции курсора в неконтролируемый программистом буфер, и затем повторной "вставкой на экран" запомненной позиции курсора.
Последнюю реализацию можно осуществить с помощью следующих escape последовательностей:
- Esc[s - сохранение текущей позиции курсора;
- Esc[u - восстановление сохранённых в буфере координат курсора.
Подробнее см. [MS-DOS 6.0, Финогентов I]
Реализация чтения координат курсора на Ассемблере
Функция 3 прерывания 10H возвращает строку курсора в DH, а столбец - в DL. На входе надо поместить в BH номер страницы.
ФУНКЦИЯ 3 ПРЕРЫВАНИЯ 10H | |
НАЗНАЧЕНИЕ: | Определяет и сохраняет текущую позицию курсора на экране дисплея. |
ПАРАМЕТРЫ: | AH = 3 - номер функции; BH - номер экранной страницы дисплея; |
ВОЗВРАЩАЕМЫЕ ЗНАЧЕНИЯ: | * DH - текущая строка курсора; * DL - текущий столбец курсора. |
Пример 3.12.
; --- В сегменте данных CUR_ROW DB ? ; текущая строка курсора CUR_COL DB ? ; текущий столбец курсора ; --- в сегменте кода ; --- определение позиции курсора MOV AH, 3 ; номер функции MOV BH, 0 ; номер экранной страницы INT 10H ; --- Строка - столбец DH - DL MOV CUR_ROW, DH MOV CUR_COL, DL
Смотрите также [Абель, Джордейн]
Реализация чтения координат в Turbo C++
ФУНКЦИЯ | WHEREX |
ОПИСАНА В: | <conio.h> (содержит прототип) |
СИНТАКСИС: | int wherex( void ); |
НАЗНАЧЕНИЕ: | Возвращает горизонтальную позицию курсора в окне. |
ОПИСАНИЕ: | wherex возвращает координату X текущей позиции курсора (внутри текущего текстового окна). |
ВОЗВРАЩАЕМОЕ ЗНАЧЕНИЕ: | целое число от 1 до 80. |
ПЕРЕНОСИМОСТЬ: | Действительна только для IBM PC и совместимых с ним компьютерах. Аналогичная функция существует в Turbo Pascal. |
ФУНКЦИЯ | WHEREY |
ОПИСАНА В: | <conio.h> (содержит прототип) |
СИНТАКСИС: | int wherey( void); |
НАЗНАЧЕНИЕ: | Возвращает вертикальную позицию курсора в окне. |
ОПИСАНИЕ: | wherey возвращает координату Y текущей позиции курсора (внутри текущего текстового окна). |
ВОЗВРАЩАЕМОЕ ЗНАЧЕНИЕ: | wherey возвращает целое число от 1 до 25, иногда до 43 или 50. |
ПЕРЕНОСИМОСТЬ: | Действительна только для IBM PC и совместимых с ним компьютерах. Аналогичная функция существует в Turbo Pascal. |
Реализация чтения координат курсора на C--
ФУНКЦИЯ | GETXY |
СИНТАКСИС: | word GETXY () |
НАЗНАЧЕНИЕ: | Читает позицию курсора на нулевой странице дисплея. |
ПАРАМЕТРЫ ФУНКЦИИ: | нет |
ВОЗВРАЩАЕМЫЕ ЗНАЧЕНИЯ: |
|
Реализация чтения координат в Turbo Prolog
Функция cursor языка Турбо Пролог 2.0 позволяет как записывать, так и считывать текущее значение курсора (см. пример).
Пример 3.13.
/* ex03013.pro */ /* Реализация абсолютного позиционирования курсора средствами спец. функции Турбо Prolog. */ domains Row, Col = integer clauses … cursor( Row, Col ), …
3.3. Резюме
В данной лекции Вы ознакомились с такими "вспомогательными" возможностями текстового вывода, как очисткой экрана перед выводом информации, и перемещением и установкой курсора на экране дисплея. Эти функции редко используются при написании программ-фильтров, однако они способны "моделировать" графический интерфейс при "консольном вводе-выводе" текста. Именно поэтому автор включил их в данный курс лекций.
Манипулирование положением курсора часто требует установки драйвера: ANSI.SYS в операционной системе. В новейших операционных системах он установлен по-умолчанию, однако в операционных системах, созданных до 2001 года, этот драйвер может быть не установлен. Для его установки пропишите следующую строку в файле:
CONFIG.SYS: DEVICEHIGH=C:\WINDOWS\Commands\ANSI.SYS CONFIG.NT DEVICEHIGH=%SystemRoot%\System32\ANSI.SYS
Примечание: Файл C:\CONFIG.SYS используется в операционных системах Windows 9x/ME, а файл %SystemRoot%\System32\CONFIG.NT - в операционных системах Windows 2000/XP/Vista/7.