Опубликован: 15.11.2010 | Доступ: свободный | Студентов: 643 / 18 | Оценка: 4.00 / 5.00 | Длительность: 17:30:00
Специальности: Программист
Лекция 3:

Прямой ввод-вывод: Часть II

< Лекция 2 || Лекция 3: 12 || Лекция 4 >
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. Запоминание позиции курсора

Иногда возникают ситуации, когда надо прервать вывод текста, перевести курсор в другую позицию, вывести или ввести параметры программы, а затем продолжить вывод текста со "старого" места.

Реализацию этой последовательности действий можно осуществить следующим образом:

  1. Чтением абсолютной позиции курсора;
  2. Запоминанием последней позиции курсора в неконтролируемый программистом буфер, и затем повторной "вставкой на экран" запомненной позиции курсора.

Последнюю реализацию можно осуществить с помощью следующих 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 ()
НАЗНАЧЕНИЕ: Читает позицию курсора на нулевой странице дисплея.
ПАРАМЕТРЫ ФУНКЦИИ: нет
ВОЗВРАЩАЕМЫЕ ЗНАЧЕНИЯ:
  • BH = 0
  • AH = DH = позиция строки курсора;
  • AL = DL = позиция столбца курсора;
  • CH = начальная строка курсора;
  • CL = последняя строка курсора.
Реализация чтения координат в 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.

Подробнее см. [MS-DOS 6.0, Финогентов I]

< Лекция 2 || Лекция 3: 12 || Лекция 4 >
Дмитрий Карпов
Дмитрий Карпов
Россия, Нижний Новгород
Олег Корсак
Олег Корсак
Латвия, Рига