Russian Belarusian English German Japanese Ukrainian

Rashka.studio - игры и приложения для Android! Заходи, ждём тебя =)

Edit, LabeledEdit и MaskEdit - окна редактирования

CuBook3.295

Внешнее оформление окон редактирования определяется свойством BorderStyle. Во всех рассматриваемых окнах вводимый и выводимый текст содержится в свойстве Text типа AnsiString. Это свойство можно устанавливать в процессе проектирования или задавать программно. Выравнивание текста, как это имело место в метках и панелях, невозможно. Перенос строк тоже невозможен. Текст, не помещающийся по длине в окно, просто сдвигается и пользователь может перемещаться по нему с помощью курсора. Свойство AutoSize в окнах редактирования имеет смысл, отличный от смысла аналогичного свойства меток автоматически подстраивается под размер текста только высота, но не ширина окна.
 
Окна редактирования снабжены многими функциями, свойственными большинству редакторов. Например, в них предусмотрены типичные комбинации «горячих» клавиш: Ctrl+C копирование выделенного текста в буфер обмена Clipboard (команда Copy), Ctrl+X вырезание выделенного текста в буфер Clipboard (команда Cut), Ctrl+V вставка текста из буфера Clipboard в позицию курсора (команда Paste), Ctrl+Z отмена последней команды редактирования. Правда, пользователи часто не догадываются об этих возможностях редактирования. Так что полезно напоминать им об этом соответствующими подсказками.
 
Свойство AutoSelect определяет, будет ли автоматически выделяться весь текст при передаче фокуса в окно редактирования. Его имеет смысл задавать равным true в случаях, когда при переключении в данное окно пользователь вероятнее всего будет заменять текущий текст, а не исправлять его. Имеются также свойства только времени выполнения SelLength, SelStart, SelText, определяющие соответственно длину выделенного текста, позицию перед первым символом выделенного текста и сам выделенный текст.
 
Например, если в окне имеется текст «выделение текста» и в нем пользователь выделил слово «текста», то SelLength = 6, SelStart = 10 и SelText = "текста". Если выделенного текста нет, то свойство SelStart просто определяет текущее положение курсора. Окна редактирования можно использовать и просто как компоненты отображения текста. Для этого надо установить свойство Readonly в true и целесообразно установить AutoSelect в false. В этом случае пользователь не сможет изменять отображаемый текст и окно редактирования становится подобным меткам.
Но имеются и определенные отличия. Окна редактирования оформлены несколько иначе. А главное, окна редактирования могут вмещать текст, превышающий их длину. В этом случае пользователь может прокручивать текст, перемещая курсор в окне. Такими особенностями не обладает ни одна метка.
 
Свойство Text окон редактирования имеет тип строки AnsiString. При присваивании этому типу числовой информации происходит ее автоматическое преобразование в строку. Поэтому вы можете непосредственно осуществлять подобные присваивания. Например:
Edit1->Text = 5./2;
Оператор будет воспринят компилятором нормально и приведет к появлению в окне текста «2,5». Но при вводе из окна числовой информации надо использовать функции StrToFloat преобразование строки в значение с плавающей запятой, и StrToInt преобразование строки в целое значение. Если вводимый текст не соответствует числу, например, содержит недопустимые символы, то функции преобразования генерируют исключение EConvertError. Поэтому в программе необходимо предусмотреть обработку этого исключения. Например:
int А;
...
try
{
А = StrToInt(Edit1->Text);
}
catch (EConvertErrorS)
{
ShowMessage("Вы ввели ошибочное число; повторите ввод");
}
Этот код обеспечивает сообщение пользователю об ошибке ввода и предотвращает ошибочные вычисления. Впрочем, это не лучший вариант предотвратить ошибочный ввод, поскольку пользователь узнает о своей ошибке только после того, как программа пытается использовать введенные данные. Окно Edit можно спроектировать так, что пользователь просто не сможет ввести в него неправильные символы.
 
Свойство MaxLength определяет максимальную длину вводимого текста. Если MaxLength = 0, то длина текста не ограничена. В противном случае значение MaxLength указывает максимальное число символов, которое может ввести пользователь.
Свойство Modified, доступное только во время выполнения, показывает, проводилось ли редактирование текста в окне. Если вы хотите использовать это свойство, то в момент начала работы пользователя с текстом Modified надо установить в false. Тогда при последующем обращении к этому свойству можно по его значению (true или false) установить, было или не было произведено редактирование.
 
Свойство PasswordChar позволяет превращать окно редактирования в окно ввода пароля. По умолчанию значение PasswordChar равно «#0» нулевому символу. В этом случае это обычное окно редактирования. Но если в свойстве указать иной символ (например, символ звездочки "*"), то при вводе пользователем текста в окне будут появляться именно эти символы, а не те, которые вводит пользователь. Тем самым обеспечивается секретность ввода пароля.
 
Окно редактирования LabeledEdit.

В компоненте Edit все ограничивается приведенными специфическими свойствами. А в компоненте LabeledEdit, помимо самого окна редактирования, неотличимого по виду от Edit, имеется метка. Она задается свойством EditLabel объектом класса TBoundLabel. Этот класс имеет все основные свойства, присущие метке Label: Caption, Color, Font, Layout, ShowAccelChar, WordWrap, Canvas. Выделение амперсандом в надписи Caption символа обеспечивает окно редактирования клавишами быстрого доступа.
 
Свойство LabelPosition компонента LabeledEdit указывает, с какой стороны от окна размещается метка: lpAbove - сверху, выровненная по левому краю, lpBelow - снизу, выровненная по левому краю, lpLeft - слева, lpRight - справа.
В целом, компонент LabeledEdit, появившийся в C++Builder 6, очень удобен и, вероятно, может заменить окна Edit в большинстве приложений, поскольку редко требуется окно редактирования без поясняющей его метки.
 
Теперь рассмотрим решение одной часто встречающейся задачи. Нередко в окне редактирования записан длинный текст, который не виден пользователю целиком. В современных приложениях обычно в этих случаях при расположении курсора мыши над окном появляется всплывающий ярлычок, содержащий полный текст окна. Посмотрим, как это можно сделать.
 
Перенесите на форму несколько окон редактирования Edit и LabeledEdit. Установите свойство ShowHint формы в true. Перенесите на форму компонент ApplicationEvents и напишите следующий обработчик его события OnShowHint:
void __fastcall TForml::ApplicationEventslShowHint(AnsiString &HintStr, bool &CanShow, THintlnfo SHintlnfo)
{
if ((HintInfo.HintControl->ClassNameIs("TEdit") ) ||
(Hintlnfo.HintControl->ClassNameIs("TLabeledEdit")))
   if (Canvas->TextWidth(((TEdit *)Hintlnfo.HintControl)->Text) > ((TEdit *)Hintlnfo.HintControl)->ClientWidth)
   {
   HintStr = ((TEdit *)HintInfo.HintControl)->Text;
   ApplicationEvents1->CancelDispatch{};
   }
}
Выполните это приложение, занесите в окна редактирования какие-то тексты и убедитесь, что если длина текста превышает ширину окна редактирования, то при перемещении курсора мыши над таким окном во всплывающем ярлычке появляется полный текст окна.
Указатель на компоненте, над которым задержался курсор мыши, содержится в Hintlnfo->HintControl. Сначала осуществляется проверка класса этого компонента. Если компонент окно редактирования, то с помощью функции TextWidth определяется длина текста окна при его отображении на канву Canvas. Для получения текста используется явное приведение HintInfo->HintControl к типу указателя на объект класса TEdit. Полученная с помощью TextWidth длина текста сравнивается с шириной клиентской области ClientWidth окна редактирования. Правда, функция TextWidth дает длину текста только для компонентов, имеющих канву Canvas, а окна редактирования Edit и LabeledEdit канвы не имеют. Поэтому для проверки длины текста в приведенном коде использована канва формы. Так что код будет правильно работать, только если шрифты формы и окна редактирования заданы одинаковыми. Вместо канвы формы можно было бы использовать канву какой-то метки Label, а для LabeledEdit встроенную в компонент метку.
Если длина текста оказывается больше ширины окна, то текст HintStr, отображаемый в ярлычке, подменяется текстом, содержащимся в окне редактирования.
 
Окно редактирования MaskEdit.

Компонент MaskEdit отличается от Edit и LabeledEdit тем, что в нем можно задать строку маски в свойстве EditMask. Это позволяет обеспечить синтаксически безошибочный ввод пользователем таких данных, как номера телефонов, паспортные данные, адреса, даты, время и т.п. Маска состоит из трех разделов, между которыми ставится точка с запятой ";". В первом разделе шаблоне записываются специальным образом символы, которые можно вводить в каждой позиции, и символы, добавляемые самой маской; во втором разделе записывается 1 или 0 в зависимости от того, надо или нет, чтобы символы, добавляемые маской, включались в свойство Text компонента; в третьем разделе указывается символ, используемый для обозначения позиций, в которых еще не осуществлен ввод. Прочитать результат ввода можно или в свойстве Text, которое в зависимости от вида второго раздела маски включает или не включает в себя символы маски, или в свойстве EditText, содержащем введенный текст вместе с символами маски.
 
Символы шаблона маски:

Символ Описание
! Наличие символа "!" означает, что в EditText недостающие символы представляются пробелами. а отсутствие символа "!" означает, что пробелы размещаются в конце.
> Символ ">" означает, что все последующие за ним символы должны вводиться в верхнем регистре, пока не кончится маска или пока не встретится символ "<".
< Символ "<" означает, что все последующие за ним символы должны вводиться в нижнем регистре, пока не кончится маска или пока не встретится символ ">".
<>  Символы "<>" означают, что анализ регистра не производится.
\ Символ означает, что следующий за ним символ является буквенным, а не специальным, характерным для маски.
L Символ "L" означает, что в данной позиции должна быть буква.
l Символ "l" означает, что в данной позиции может быть только буква или ничего.
A Символ "А" означает, что в данной позиции должна быть буква или цифра.
a Символ "а" означает, что в данной позиции может быть или буква, или цифра, или ничего.
С Символ "С" означает, что в данной позиции должен быть любой символ.
с Символ "с" означает, что в данной позиции может быть любой символ или ничего.
0 Символ "0" означает, что в данной позиции должна быть цифра.
9 Символ "9" означает, что в данной позиции может быть цифра или ничего.
# Символ "#" означает, что в данной позиции может быть цифра, знак "+", знак "-" или ничего.
: Символ ":" используется для разделения часов, минут и секунд.
/ Символ "/" используется для разделения месяцев, дней и годов в датах.
_ Символ "_" означает автоматическую вставку в текст пробела.
Вводить маску можно непосредственно в свойство EditMask. Но удобнее пользоваться специальным редактором масок, вызываемым при нажатии кнопки с многоточием в строке свойства EditMask в Инспекторе Объектов. В редакторе масок окно Sample Masks содержит наименования стандартных масок и примеры ввода с их помощью. В окно Input Mask надо ввести маску. Если вы выбираете одну из стандартных масок, то окно Input Mosk автоматически заполняется и ее можно будет отредактировать.
Окно Character for Blanks определяет символ, используемый для обозначения позиций, в которых еще не осуществлен ввод (третий раздел маски). Индикатор Save Literal Characters определяет второй раздел маски: установлен, если второй раздел равен 1, и не установлен, если второй раздел равен 0.
Кнопка Masks позволяет выбрать и загрузить какой-либо другой файл стандартных масок. К сожалению, среди файлов стандартных масок, поставляемых с C++Builder, отсутствует маска, соответствующая российским стандартам.
Если заметили ошибку, выделите фрагмент текста и нажмите Ctrl+Enter

Добавить комментарий