Работа в консоли

В FreeBasic есть определенное кол-во команд для работы в консоли. Консоль в FreeBasic сделана настолько удобной, как ни в одном другом современном языке Basic. Так в любой из статей в примерах достаточно было просто указать оператор ? и за ним значение. Этого было достаточно в системе Windows, для того чтобы вывести это значение в консоль. Для системы Linux все примеры работают точно так же , за исключением примеров с функциями Windows API. Разработчики сохранили легендарные консольные операторы первых диалектов Basic: Print , Input , Cls , Inkey  По сути в первых диалектах все происходило в консоли. Помню время, когда на уроках информатики за популярным в то время советским УКНЦ , я впервые не в рамках уроков, познакомился с первым бейсиковским оператором: ?   Какова же была моя радость, когда в FreeBasic я увидел его. Прелесть консольных операторов в том, что их одинакого можно использовать как в текстовом режиме , так и в графическом. Ведь команда Screen с цифрой больше нуля открывает уже не стандартное окно консоли, вызываемое с помощью CMD.exe , а окно с графическим режимом отображения. Огромное кол-во демосцен и игр написано в графическом режиме консоли. Однако в этой статье мы ограничимся только рассмотрением текстового режима.

 

Запись значений в окно консоли

Для записи значений в окно консоли есть три оператора:

  • Print или ? - обычная запись в окно консоли
  • Print Using - запись с форматированием текста
  • Write - еще одна возможная запись, отличающаяся от Print

Сначала поговорим об операторе Print

Если нужно выводить несколько значений слитно, то достаточно передавать аргументы, разделяя оператором ; 

Пример:

Print 1; "77"
Sleep

Вот так! Ничего не надо преобразовывать, оператор Print все сделает сам и выведет в консоль цифру 177.

Если встанет необходимость выводить аргументы раздельно с табуляцией, то вместо оператора ;  нужно  использовать оператор ,

Пример:

Print 1 , "77"
Sleep


Команда Print на самом деле очень многофункциональная команда. Ее использование далеко не ограничивается в работе с консолью. В других статьях мы это разберем.

Команда Print Using позволяет записывать значения с использованием расширенного форматирования. У этой команды два параметра:

  • любая строка, содержащая символы нужного форматирования
  • список аргументов

Принцип ее таков:

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

  • для работы со строковыми типами аргументов
    • !   - печатает первый символ строки аргумента
    • \\  -  печатает пару символов строки аргумента,  кол-во печатываемых символов может изменяеться кол-вом пробелов между \ \
    • & - печатает всю строку
  • для работы с числовыми типами аргументов
    • #  - резервирование места для одной цифры из аргумента п печать. Кол-во цифр регулируется кол-вом этого символа
    • & - печатает все число
    • .   - ставится точка между # для определения дробных чисел
    • ,   - ставится между символами # для разделения числа в группы по три цифры
    • +   - ставится тандемом с # для вывода знака числа
    • ^^^^   - ставится между символами # и дает возможность записи экспоненциального представления числа. Число при этом округляется.

Если нужно в строке использовать один из выше описанных символов не для форматирования, а просто как часть строки, то перед этими символами нужно ставить знак нижнего подчеркивания _ , пример _!
Если при использовании форматирующих символов, места для всех цифр не хватает, то перед числом выводится знак %

А теперь общий пример для всех используемых форматирующих символов:

Print Using " The value &  seconds  "; 1 , 555588
Print Using " The value &  seconds  "; 1 , "555588"
Print Using " The value & seconds and & millisecond"; 1,"0.555588"
Print Using " The value ### seconds"; 199
Print Using " The value # seconds"; 199
Print Using " The first simvol= !"; "freebasic"
Print Using " The five simvols= \   \"; "freebasic"
Print Using " The value= ###.##"; 667.766
Print Using " The value= #####"; 667.766
Print Using " The value= ####,##"; 667766
Print Using " The value= ###^^^^#"; 667766
Print Using " The value= _#_#_#_#  & "; 667766
Print Using "+###"; 3; -3
Print Using "###+"; 3; -3
Sleep


Оператор Write имеет в себе полезную возможность записывать список значений для вывода в консоль через запятую без табуляции.

Пример:

Write 10,20,30
Print 10,20,30
Sleep

Разница между print и write очевидна. Оператор Write так же не ограничивается консолью и имеет в себе другие возможности и об этом мы тоже поговорим в отдельной статье.

 

Форматирование с помощью SPC

Команда SPC позволяет разделять слова нужным кол-вом пробелов. У нее всего один параметр: число нужных пробелов. Пример:

? "FreeBasic"; Spc(20) ;"on 1 place among Basic"
Sleep

 

Форматирование с помощью TAB

Команда TAB позволяет переносить слова на нужный столбец в консоли. У нее всего один параметр: число нужных отступов. Если на этой же строке есть запись и перенос следующего слова попадает на один из занятых символом мест, то команда TAB перенесет слово на другую строку. Пример:

Print "foo"; Tab(5) ; "bar"
Print "hello" ; Tab(3) ; "world"
Sleep

 

Установка или получение кол-ва столбцов и строк консоли

Данной возможностью обладает одна функция Width. Если ее использовать для получения значений, то она работает без параметров. Ее возвращаемое значение кол-ва строк и столбцов находится в одном 32 битном числе. Они находятся в двух половинках числа, каждое в своих 16 битах.  И чтобы получить их по отдельности, нужно применить дополнительно соответствующие функции Loword для столбцов и Hiword для строк.  Пример:

Dim As Integer w
w = Width
Print "rows: " & Hiword(w)
Print "cols: " & Loword(w)
Sleep


Для того, чтобы установить нужные кол-ва строк и(или) столбцов консоли, вам просто надо вызвать функцию WIDTH с одним или с двумя параметрами. Оба являются необязательными , первый кол-во столбцов, второй кол-во строк.

Пример:

Width 100,65
Sleep

Или можно так (изменяем только строки):

Width ,65
Sleep

 

Установка рабочей области для вывода текстовой информации

Такую возможность предоставляет функция VIEW PRINT. Она имеет два параметра:

  • первая устанавливаемая вами рабочая строка
  • последняя рабочая строка
View Print 10 To 11
Print 10,20,30,40
Sleep

В данном примере весь текст будет находится только на 10 строке.

 

Получение расположения курсора

Для получения положения курсора в строке можно применить функцию POS
Для получения номера самой строки можно использовать функцию CsrLin

Print "The cursor is on position:"; Pos
Print "The cursor is on row:"; Csrlin
Sleep

 

Установка позиции курсора

Для установки позиции курсора можно использовать функцию Locate. Она имеет три параметра:

  • номер строки
  • номер столбца
  • флаг установки курсора (если 0 , не отображать курсор) .

Пример:

Locate 10,20,0
Print "FreeBasic"
Sleep

 

Получение вводимых значений от пользователя

Данную возможность предоставляет команда Input, имеющая в себе два параметра:

  • Текст подсказка для пользователя, выводимая в консоль
  • Список переменных, разделенных запятой, для присвоения им значения(й), которые вводит пользователь (вводить несколько переменных надо с использованием запятых)

Пример:

Dim As Integer A,B
Input "Input 3 numbers ",A,B
Print A,B
Sleep

Кроме команды Input есть еще две функции. Одна носит тоже название Input(), но имеет другой синтаксис записи и другую возможность. Вторая имеет название Line Input() и возвращает только строковое значение введенной пользователем строки в консоль.
Функция Input() имеет один параметр: кол-во вводимых символов от пользователя. Данная фича может быть полезна, когда нужно определить ограничение ввода. Кроме того функция не ждет от пользователя подтверждения ввода с помощью клавиши ENTER. Как только нужное кол-во будет введено, она завершает свою работу, возвращая введенное значение. При вводе символы не видны.
Функция Line Input() имеет два параметра как у команды Input и ее синтаксис записи ничем не отличается с той лишь разницей, что эта функция может получать только один аргумент. Ее главное назначение ввод строки, содержащей запятые. Ведь у команды Input запятые используются для разделения вводимых аргументов.

Dim As String A
A=Input (1)
Print A
Line Input "Input string: ",A
Print A
Sleep

 

Возвращение нажатой клавиши

Для получения строкового представления нажатой клавиши пользователем есть функция InKey.

Пример: (перед запуском примера не забудьте переключить раскладку на английскую и выключить CAPS LOCK.)

Print "press q to quit"
Do
Loop Until Inkey = "q"

Для получения ASCII кода нажатой клавиши можно использовать функцию GetKey

Print "press q to quit"
Do
    ? Chr(Getkey)
Loop Until Getkey = Asc("q")

 

Очистка экрана консоли

Команда CLS позволяет очищать консоль цветом фона (по умолчанию черный).

Пример:

Print 10
Sleep(2000)
Cls
Sleep


Ниже рассматриваемая функция COLOR может изменять цвет фона

 

Изменение и получение цвета выводимой информации

Для того, чтобы изменить цвет текста и цвет фона в консоли можно использовать функцию COLOR, которая имеет два параметра:

  • Цвет текста
  • Цвет фона текста
Color(1,2)
Print "FreeBasic"
Color(3,4)
Print "FreeBasic"
Sleep

Однако если использовать команду CLS , то можно изменить не только цвет фона текста, но и цвет всего консольного окна

Color(11,1)
Cls
Print "FreeBasic"
Color(12)
Print "FreeBasic"
Sleep


Для того, чтобы получить цвета текста и фона, можно использовать либо эту же функцию COLOR , либо функцию Screen , которую рассмотрим ниже.

Как и в случае с функцией WIDTH , рассмотренной выше, при получения значения цвета с помощью COLOR , данная функция возвращает сразу оба значения в одно 32 битное число. И получить отдельно цвет текста и фона можно так же с помощью функций Loword (цвет текста)  и Hiword (цвет фона)

Пример:

Dim As Integer All
ALL = Color
? Loword(ALL)
? Hiword(ALL)
Sleep

 

Получение символа из консоли

Для получения символа имеющего место в консоли, можно применить функцию Screen,  которая имеет 3 параметра:

  • номер строки
  • номер столбца
  • флаг (если будет 0, то возвращается ASCII код символа, в противном случае функция возвратит значение цвета фона и цвета текста)

Пример:

Print "FreeBasic"
? Chr(Screen(1,5))
Sleep


В данном примере мы не только получили ASCII символ, находящийся в 1 строке и в 5 столбце из консоли, но и преобразовали его сразу функцией CHR. В примере мы не стали использовать третий параметр, поскольку для получения символа он не требуется. Но если использовать данную функцию для получения цвета, то в третьем параметре нужно передать единичку. Я покажу пример получения цвета с помощью Screen, но объяснять его не буду, поскольку в нем приходится использовать битовые операторы для преобразования, которые мы с вами не рассматривали. Понимание их работы не самое простое и изучение их достойно отдельной главы.

Пример:

Color 4, 11
Print "Z"
Dim As Uinteger  col, fg, bg
col = Screen(1, 1, 1)
fg = col And &HF
bg = (col Shr 4)
Print fg,bg
Sleep


Я думаю для текстового режима консоли информации более чем достаточно. На самом деле, в FreeBasic трудно провести грань между текстовым и графическим режимом, особенно это касается системы Linux.

Всего доброго!

содержание | назад | вперед