• Идеальный подарок на рождество — говорящий попугай, знающий 3 языка: паскаль, вижуал бейсик и ассемблер.

Редактор строки в консоли

Все мы привыкли к интерактивному режиму редактирования текста: мы что-то пишем на клавиатуре — это отражается на экране и затем запоминается в памяти. Кажется, всё просто. На самом же деле даже самый простой ввод текста — довольно сложная задача.

— Что же тут сложного? — скажете вы, — Пишем «TextWindow.Read()» — и всё!
Но если я спрошу: — А как работает функция (метод) TextWindow.Read()? Как он устроен внутри? Что происходит на самом деле при его работе?

В этом примере рассмотрен программный код, который позволяет работать с текстовым полем определённой длины, в котором можно вводить и изменять числовые данные. Поле предназначено только для ввода числовых данных с предварительной проверкой ввода на корректность.

С клавиатуры вводятся только цифры и десятичная точка. Клавиша BaskSpace удаляет крайний символ справа. Клавиша Del — удаляет всё число. После нажатия клавиши Escape программа завершает работу.

Вы можете скопировать указанный ниже код программы в IDE Small Basic и запустить:

' Начальные данные __________________
y = 2 ' координаты строки
x1 = 5 ' начало
x2 = 26 ' конец 

str = 238674 ' начальное значение 

TextWindow.ForegroundColor=0 ' устанавливаем черный цвет текста - чёрный
TextWindow.BackgroundColor=15 ' устанавливаем фон - белый

For i=0 To 9 ' заполняем массив кодов цифровых клавиш
    dk[i][1] = "D" + i
    dk[i][2] = "NumPad" + i
EndFor


Sub Code ' подпрограмма проверки кода на цифру
    dn = "" ' переменная под цифру
    For i=0 To 9 ' ищем цифру по коду
        If K = dk[i][1] Or K = dk[i][2] Then ' если код цифры
            dn = i
        EndIf
    EndFor
    
    If dn = "" And ( K = "Decimal" Or K = "OemQuestion" Or K = "OemPeriod" Or K = "Oemcomma" ) Then ' дестятичная точка
        dn = "."
    EndIf
    
    If dn = "" Then ' не цифра
        dn = "False"
    EndIf
EndSub


LDTextWindow.KeyDown = Keyb ' назначаем функцию-обработчик нажатия клавиатуры

Sub Keyb ' обработчик клавиатуры
    K = LDTextWindow.LastKey ' код последней нажатой клавиши
    Code() ' проверяем на коды цифровых клавиш
    
    If dn <> "False" Then ' цифра
        If dn = "." And Text.IsSubText(str,dn) Then ' если точка уже есть
            dn = "" ' сбрасываем её
        EndIf
        
        If Text.GetLength(str) < 21 Then ' проверяем длину строки
            str = Text.Append(str, dn) ' пишем символ в строку
        Else ' если вышли за пределы
            ' не пишем
        EndIf
        
        TextWindow.CursorTop = y
        For i=x1 To x2 ' заполняем поле пробелами = закрашиваем его фоном
            TextWindow.CursorLeft=i
            TextWindow.Write(" ")
        EndFor
        TextWindow.CursorLeft= x1
        TextWindow.Write(str) ' выводим
        If str = "" Then
            TextWindow.CursorLeft = x1
            TextWindow.Write("0")
        EndIf
        
    Else '  не цифра
        If K = "Delete" Then ' проверяем на BS, Del и Esc
            str = "" ' удаляем всю строку - ""
            ' и выводим
            TextWindow.CursorTop = y
            For i=x1 To x2 ' заполняем поле пробелами = закрашиваем его фоном
                TextWindow.CursorLeft=i
                TextWindow.Write(" ")
            EndFor
            TextWindow.CursorLeft= x1
            TextWindow.Write("0")' выводим
        ElseIf K = "Back" Then ' если нажали BackSpace
            str = Text.GetSubText(str,1,Text.GetLength(str)-1) 'один символ с конца удаляем
            ' и выводим строку :
            TextWindow.CursorTop= y
            For i=x1 To x2 ' заполняем поле пробелами = закрашиваем его фоном
                TextWindow.CursorLeft=i
                TextWindow.Write(" ")
            EndFor
            TextWindow.CursorLeft= x1
            TextWindow.Write(str) ' выводим результат
            If str = "" Then
                TextWindow.CursorLeft = x1
                TextWindow.Write("0")
            EndIf
        ElseIf K = "Escape" Then
            Program.Delay(2000) ' ждем пару секунд и выходим
            Program.End()
        Else ' если что-то другое
            ' ничего не делаем
        EndIf
    EndIf
EndSub



TextWindow.CursorTop=y ' ставим  курсор в строку вывода
For i=x1 To x2 ' заполняем поле пробелами = закрашиваем его фоном
    TextWindow.CursorLeft=i
    TextWindow.Write(" ")
EndFor

TextWindow.CursorTop=y ' ставим  курсор в строку вывода
TextWindow.CursorLeft=x1 ' ставим  курсор в начало строки
TextWindow.Write(str) ' выводим нашу начальную строку

While "True" ' бесколнечный цикл
    Program.Delay(100) ' чтоб процессор не грелся
EndWhile

Поделиться: