- Обработка строк
- Строковые данные в BCB и методы их обработки
- Отображение строк в поле метки
- Использование компонента TextBox (VB)
- Использование объекта MaskEdBox (VB)
- Специфика компонента RichTextBox (VB)
- Использование компонент типа TEdit (BCB и Delphi)
- Специфика работы с объектом MaskEdit в средах BCB и Delphi
- Объект TextBox в многострочном режиме
Использование компонента TextBox (VB)
Опубликовано admin в Сб, 01/30/2010 - 20:03
SelStart — номер начальной позиции в строке Text (позиции отсчитываются от 0);
SelLength — длина выделенного фрагмента;
SelText — выделенный текст.
Основное свойство Text можно рассматривать как переменную символьного типа, значение которой отражается в окне компонента TextBox. Как только программа заносит в эту переменную какое-либо сообщение, оно мгновенно появляется в соответствующем окне. Если компонент активизирован, то в окне мерцает вертикальная черточка — курсор, и пользователь может изменить содержимое окна. Например, набрать новый текст или модифицировать прежнее содержимое, используя типичные для текстового редактора приемы — перемещения вдоль текста, выделение фрагмента, удаление или копирование фрагмента, замена символов, обмен с Clipboard и т.п.
Передача фокуса окну ввода с именем Input1 производится путем обращения к методу SetFocus:
Input1.SetFocus()
При запуске приложения фокус передается окну ввода автоматически, если это окно было первым помещено на форму. В остальных случаях программа должна активизировать окно ввода в тот момент, когда ей необходимо обратиться к пользователю. Если приложение находится в режиме ожидания какого-либо события, пользователь с помощью мыши может активизировать то или иное окно ввода.
Как программа может определить, набрал ли пользователь новое сообщение или модифицировал прежнее содержимое окна? Для этой цели необходимо предусмотреть один или несколько обработчиков событий, адресованных окну ввода. Среди многочисленных событий, на которые может реагировать объект TextBox, наиболее полезными являются следующие:
- GotFocus() — событие, возникающее в момент активизации окна;
- LostFocus() — событие, возникающее в момент потери фокуса;
- KeyDown(KeyCode,Shift) — событие, возникающее в момент движения нажимаемой клавиши вниз;
- KeyPress(KeyAscii) — событие, возникающее при удержании нажатой клавиши;
- KeyUp(KeyCode,Shift) — событие, возникающее при отпускании нажатой клавиши;
- Change() — событие, возникающее при изменении, добавлении или удалении очередного символа в поле ввода.
В событиях, связанных с клавиатурой, обработчик получает код ASCII (KeyAscii) или клавиатурный код (KeyCode) нажатой клавиши и числовой код Shift из диапазона [0,7], определяющий сочетание управляющих клавиш <Alt>, <Ctrl> и <Shift>, нажатых одновременно с клавишей. Не все программисты четко разделяют такие понятия как ASCII-код, скан-код и клавиатурный код. Кодировочные таблицы операционных систем, именуемые кодовыми страницами (например, 866-я страница в MS-DOS или 1251-я страница в Windows), включают однобайтовые коды от 0 до 255, соответствующие всем отображаемым символам клавиатуры и некоторым управляющим символам (перевод строки, возврат каретки, табуляторный пропуск и т.п.). Однако в таблицах ASCII вы не найдете коды таких клавиш, как <F1>, <F2>, <Shift>, <Insert> и др. Для работы с полным набором клавиш в программах низкого уровня обычно используются скан-код (scan-code), представляющий собой порядковый номер клавиши на клавиатуре (нумерация клавиш ведется по рядам слева направо и сверху вниз). Таблицы скан кодов были придуманы фирмой IBM давно, когда количество клавиш и их расположение на клавиатуре было несколько иным (функциональные клавиши, например, располагались не в верхнем ряду, а были расположены в две колонки слева, цифровой клавиатуры тоже сначала не было). Поэтому не надо сравнивать последовательность скан-кодов с расположением клавиш на современных клавиатурах, единства среди которых сегодня нет ни по числу клавиш, ни по их расположению. В программах более высокого уровня пришлось отказаться от только однобайтового представления кода, считываемого с клавиатуры. Вы, наверное, помните, что при нажатии некоторых клавиш программы чтения их кодов сначала выдают нулевое значение, и только при повторном обращении к соответствующей процедуре вы получите отличный от нуля код, который не является кодом ASCII. В среде Windows принято использовать так называемые виртуальные коды клавиатуры (Virtual Key — виртуальные клавиши). В системе Visual Basic для обозначения кодов виртуальных клавиш используется мнемонические константы, большая часть которых приведена в табл. 3.1.
Таблица 3.1
| Константы VB | KeyCode | Пояснение |
| VbKeyBack | 8 | Клавиша <Backspace> (забой) |
| VbKeyTab | 9 | Клавиша <Tab> (совпадает с кодом ASCII) |
| VbKeyReturn | 13 | Клавиша <Enter> |
| VbKeyShift | 16 | Клавиша <Shift> |
| VbKeyControl | 17 | Клавиша <Ctrl> |
| VbKeyEscape | 27 | Клавиша <Esc> (совпадает с кодом ASCII) |
| VbKeySpace | 32 | Пробел (совпадает с кодом ASCII) |
| VbKeyPageUp | 33 | Клавиша <Page Up> |
| VbKeyPageDown | 34 | Клавиша <Page Down> |
| VbKeyEnd | 35 | Клавиша <End> |
| VbKeyHome | 36 | Клавиша Home |
| VbKeyLeft | 37 | Стрелка влево (¬) |
| VbKeyUp | 38 | Стрелка вверх () |
| VbKeyRight | 39 | Стрелка вправо (®) |
| VbKeyDown | 40 | Стрелка вниз (¯) |
| VbKeyInsert | 45 | Клавиша <Insert> |
| VbKeyDelete | 46 | Клавиша <Delete> |
| VbKey0 — VbKey9 | 48–57 | Коды цифр совпадают с их ASCII-кодами |
| VbKeyA — VbKeyz | 65–90 | Коды букв совпадают с их ASCII-кодами |
| VbKeyF1 — VbKeyF12 | 112–123 | Коды функциональных клавиш <F1> — <F12> |
Во многих случаях, приходится учитывать не только клавиатурный код нажатой клавиши, но и ситуацию, в которой была нажата клавиша. Для того чтобы различать коды больших и малых букв, клавиша может нажиматься в комбинации с управляющей клавишей регистра (<Shift>). Разобраться в сигналах, поступающих в событиях клавиатуры, вам поможет приводимый ниже пример.
Приложение 3_01 (VB). Анализ кодов клавиатуры.
Для его реализации вы должны поместить на форме четыре метки — Label1, Label2, Label3 и Label4. Установите следующие заголовки в этих метках:
Label1.Caption = Код ASCII
Label2.Caption = Клавиатурный код
Label3.Caption = Комбинация управляющих клавиш
Label4.Caption = Символ
Справа от каждой метки поместите окна Text1, Text2, Text3 и Text4, защищенные от ввода (свойство Locked=True). Форма первого приложения может иметь вид, приведенный на рис. 3.1.

Рис. 3.1. Форма приложения для анализа кодов клавиатуры
Включите в текст программы обработчики следующих событий:
Private Sub Text1_KeyDown(KeyCode As Integer, Shift As Integer)
Text2.Text = KeyCode
msg$ = ""
If Shift And 1 Then msg$ = "SHIFT+" & msg$
If Shift And 2 Then msg$ = "CTRL+" & msg$
If Shift And 4 Then msg$ = "ALT+" & msg$
If Len(msg$) > 0 Then msg$ = Left(msg$, Len(msg$) - 1)
Text3.Text = msg$
End Sub
Private Sub Text1_KeyPress(KeyAscii As Integer)
Text1.Text = KeyAscii
Text4.Text = Chr$(KeyAscii)
End Sub
Private Sub Text1_KeyUp(KeyCode As Integer, Shift As Integer)
Text1.Text = ""
Text2.Text = ""
Text3.Text = ""
Text4.Text = ""
End Sub
При нажатии любой клавиши первым возникает событие KeyDown. Его обработчик заносит клавиатурный код (значение параметра KeyCode) в окно Text2. О преобразовании числового значения кода в символьную строку (свойство Text имеет тип String) позаботится система. Анализ сочетания управляющих клавиш, нажатых одновременно с исследуемой клавишей, сводится к проверке разрядов логической шкалы состояния клавиатуры, представленной значением параметра Shift. В этой шкале единица в нулевом бите соответствует нажатию клавиши Shift, единица в первом бите — нажатию клавиши <Ctrl>, единица во втором бите — нажатию клавиши <Alt>. По каждому единичному биту к символьной переменной msg$ добавляется наименование соответствующей клавиши. Если значение msg$ оказалось не пустым, то последний символ (лишний знак +) устраняется и сформированная комбинация заносится в окно Text3. Обратите внимание на новую особенность входного языка VB — вместо знака + для обозначения операции конкатенации (сцепления текстов) здесь предпочитают использовать амперсанд (&).
Вторым по очереди генерируется событие KeyPress, обработчику которого передается ASCII-код нажатой клавиши. Обработчик заносит этот код в окно Text1, а соответствующий символ — в окно Text4.
Последнее событие KeyUp, возникающее при возврате клавиши в исходное состояние, используется для сброса содержимого всех окон. Поэтому результат работы программы можно наблюдать только в тот момент, когда исследуемая клавиша удерживается в сочетании с управляющими клавишами.
Приведенный пример демонстрирует, что обработчики событий клавиатуры могут определить, нажал ли пользователь обусловленную клавишу. Например, нажатие клавиши <Enter> с кодом vbKeyReturn=13 может быть воспринято как признак окончания набора очередного сообщения. Воспользуемся таким соглашением для демонстрации техники приема символьного сообщения, набираемого пользователем.
Приложение 3_02 (VB). Прием и подтверждение приема сообщения.
Поместим на форме окно TextBox с нестандартным именем Input1 и компонент Label1, в свойстве которого будет отображаться текст принятого сообщения. Перед тем, как начать набор текста обработчика события KeyDown, не забудьте изменить значение свойства Name (по умолчанию система назначит имя Text1).
Private Sub Input1_KeyDown(KeyCode As Integer, Shift As Integer)
If KeyCode = vbKeyReturn Then ' Нажата ли клавиша Enter?
Label1.Caption= Input1.Text ' Перенос принятого сообщения
Input1.Text="" ' Очистка окна ввода
Input1.SetFocus() ' Передача фокуса окну ввода
End If
End Sub
В экспериментах с описанным приложением каждое нажатие клавиши <Enter> (и не только <Enter> — попробуйте нажать <Esc>) сопровождается звуковым сигналом, который может раздражать пользователя. Выдачей этого сигнала управляет операционная система, однако его можно подавить. Для этой цели надо сделать так, чтобы код клавиши Enter не был передан обработчику события Input1_KeyDown.
Приложение 3_03 (VB). Предварительная цензура сообщений клавиатуры.
Перехват сообщения может осуществить форма, если в ее свойство KeyPreview заслать значение True. Тогда обработчик события клавиатуры, приписанный к форме получит сообщение о нажатии клавиши раньше, чем оно будет передано в процедуру Input1_KeyDown. Таким образом, у формы появляется возможность предварительного анализа сообщений, адресованных другим компонентам. Если обработчик формы по каким-то причинам не пожелает передать поступивший код символа настоящему адресату, то он зашлет в параметр KeyAscii нулевое значение. Для того чтобы избежать отображения символа q, у которого KeyAscii совпадает с кодом клавиши <F2>, в обработчике события KeyPress выполняется присвоение KeyAscii = 0 при нажатии любой клавиши:
Private Sub Form_KeyPress(KeyAscii As Integer)
KeyAscii = 0
End Sub
Private Sub Text1_KeyUp(KeyCode As Integer, Shift As Integer)
If KeyCode = vbKeyF2 Then
Msg$ = "F2."
If Shift And 1 Then Msg$ = "SHIFT+" & Msg$
If Shift And 2 Then Msg$ = "CTRL+" & Msg$
If Shift And 4 Then Msg$ = "ALT+" & Msg$
Text1.Text = "Вы нажали " & Msg$
End If
End Sub
В приведенном ранее обработчике события KeyDown операция, передающая фокус окну ввода после нажатия клавиши <Enter>, является лишней. Дело в том, что на форме находится всего два компонента. Один из них — Label1, — является пассивным и фокус получить не может. Поэтому окно ввода Input1 в данном приложении всегда находится в фокусе. Однако на форме могут находиться и другие объекты, способные стать активными, а такая передача может состояться и по инициативе пользователя. Он мог что-то набрать в одном окне, а затем, не нажимая клавиши <Enter>, мышкой активизировать другое окно. В этом случае наблюдение за событием KeyDown не позволит определить момент завершения операции ввода. Чтобы отследить такой финт со стороны пользователя, в программу нужно включить обработчик события LostFocus, возникающего в момент потери фокуса. Событие GotFocus можно использовать для подготовки окна ввода к приему нового сообщения. Продемонстрируем предлагаемые идеи на примере следующего приложения.
Приложение 3_04 (VB). Прием сообщений в разных окнах.
Разместим на форме два окна ввода с именами Input1 и Input2, а также два выводных окна с именами Output1 и Output2 (рис. 3.2).

Рис. 3.2. Прием сообщений в разных окнах
Пусть схема работы приложения представляет собой бесконечный цикл, в котором:
1. пользователь набирает очередное сообщение в активном окне ввода;
2. по нажатию клавиши Enter или в случае потери фокуса принятое сообщение отображается в соответствующем окне вывода;
3. активизируется альтернативное окно ввода и все повторяется с п.1.
Для выхода из бесконечного цикла можно использовать стандартные средства — кнопку с крестиком на форме или соответствующую команду системного меню. Первая половина программы приведенного ниже приложения снабжена подробным комментарием.
Private Sub Input1_GotFocus()
' Реакция на получение фокуса окном Input1
Input1.Text = "" 'Сброс содержимого поля ввода
End Sub
Private Sub Input1_KeyPress(KeyAscii As Integer)
' Дополнительная реакция на код нажатой клавиши в окне Inpit1
If KeyAscii = vbKeyReturn Then ' Если нажата клавиша Enter
' Перенос текста в заголовок метки Output1
Output1.Caption = Input1.Text
Input2.SetFocus ' Передача фокуса окну Input2
End If
End Sub
Private Sub Input1_LostFocus()
' Реакция на потерю фокуса окном Input1
' Перенос текста в заголовок метки Output1
Output1.Caption = Input1.Text
Input2.SetFocus ' Передача фокуса окну Input2
End Sub
Private Sub Input2_GotFocus()
Input2.Text = ""
End Sub
Private Sub Input2_KeyDown(KeyCode As Integer, Shift As Integer)
If KeyCode = vbKeyReturn Then
Output2.Caption = Input2.Text
Input1.SetFocus
KeyCode = 0
End If
End Sub
Private Sub Input2_LostFocus()
Output2.Caption = Input2.Text
Input1.SetFocus
End Sub
К числу достаточно востребованных свойств окна ввода относится работа с выделенным фрагментом текста. Возможность такого выделения по инициативе пользователя вам, наверное, знакома по работе с текстовыми редакторами. Пользователь может прибегнуть либо к услугам клавиатуры (управление курсором при зажатой клавише <Shift>), либо воспользоваться мышкой. Информация о выделенном фрагменте поступает в следующие свойства компонента:
Используя перечисленные свойства объекта TextEdit, программа тоже имеет возможность произвести выделение любого фрагмента в окне. К таким выделениям обычно прибегают для того, чтобы удалить часть сообщения или заменить какой-либо фрагмент на что-то другое. Если окно теряет фокус, то обычно выделение сбрасывается. Но если вы зададите HideSelection = False, то фрагмент останется выделенный и после потери фокуса.
Возможно, что объект TextEdit предназначается только для вывода сообщений из программы подобно метке Label. Чтобы запретить пользователю доступ к содержимому окна, необходимо изменить значение свойства Locked:
Text1.Locked=True
Естественно, что размеры окна ввода ограничены шириной компонента, установленной вами при создании приложения (свойство Width). Однако длина вводимого текста может оказаться существенно больше. При этом в поле будет видна только часть текста, и для просмотра начала или конца сообщения придется двигать курсор влево или вправо. Вообще говоря, длину вводимого текста можно ограничить, изменив его свойство MaxLength:
Text1.MaxLength = 20
В этом случае система будет пресекать любую попытку ввести больше, чем 20 символов. На каждое нажатие сверх установленной нормы последует мелодичный звук. По умолчанию свойству MaxLength присвоено нулевое значение, которое не запрещает ввод совсем, а лишь ограничивает его длину 32767 символами. Может быть, вам потребуется вводить или выводить более длинные строки. Измените свойство MaxLength:
Text1.MaxLength = 50000
Максимальная длина текста не должна превышать 64 Кбайт. Очевидно, что рассматривать строки такой длины — удовольствие не из приятных. Поэтому компонент TextEdit из строки может превратиться в страницу, для чего достаточно воспользоваться свойством MultiLine:
Text1.Multiline = True
В этом случае вы можете при наборе текста нажимать клавишу Enter, что приведет к продолжению набора с начала следующей строки. Автоматический перенос текста в начало следующей строки происходит при достижении правой границы поля ввода, если вы запретили использовать линейки прокрутки (ScrollBars=None). Конечно, это — не Word, не допускающий разрыва слов или делающий переносы по всем правилам.
В процессе работы приложения программным путем можно изменить шрифт (свойство NameFont) и установить такие его характеристики как высота заглавных символов в пунктах (свойство FontSize), ширина символов (свойство Font.Width), утолщение контуров букв (свойство FontBold) и их наклон (свойство FontItalic), режим подчеркивания (свойство FontStrikeThrough) или перечеркивания символов (свойство FontUnderline). Например:
Text1.FontName = ”Times New Roman”
Text1.FontSize = 12
Text1.FontItalic = True
При создании приложения щелчок по свойству Font приводит к появлению знакомого окна выбора параметров шрифта.
