Все мы привыкли к интерактивному режиму редактирования текста: мы что-то пишем на клавиатуре — это отражается на экране и затем запоминается в памяти. Кажется, всё просто. На самом же деле даже самый простой ввод текста — довольно сложная задача.
— Что же тут сложного? — скажете вы, — Пишем «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
Поделиться: