Каретка в Fire Monkey

Posted by on in Blogs

 В Fire Monkey новой версии XE4, в редакторах TEdit и TMemo появилось новое свойство Caret.

Это наследник TCustomCaret и TPersistent (располагается в FMX.Types) и имеет следующие свойства:

    • Color - цвет каретки. Если Null то используется цвет DefaultColor. Если и DefaultColor имеет значение Null, то используется цвет текста.
    • DefaultColor - умолчательный цвет каретки. Это значение берется из элемента стиля caretcolor. Если этот элемент стиля отсутствует то свойство получает значение Null.
    • Interval - время (мс) в по истечении которого исчезает и появляется Flasher (тот самый мигающий прямоугольничек). Если 0, то используется умолчательное значение 500, если -1, то Flasher не мигает и виден постоянно.
    • Width - ширина Flasher`а. Если 0, то используется умолчательное значение которое получается при помощи специального платформенного сервиса IFMXSystemInformationService (например для Windows это будет 1, для iOS - 5).

Полагаю для большинства случаев этой информации будет достаточно.

Дополнительная информация

В редакторах TEdit и TMemo для создания каретки используется виртуальный метод CreateCaret, который вы можете перекрыть для того, чтобы использовать свой собственный класс кареток. Можно также создать свой собственный Flasher, но это несколько сложнее. Eсли кто-то проявит интерес, то я напишу об этом как-нибудь в другой статье.

Если Вы хотите создать свой собственный контрол использующий каретку но не являющийся наследником (TCustomEdit и TMemo), то для правильной работы он должен поддерживать интерфейс ICaret.

Рассмотрим другие свойства и методы каретки.

    • Owner - владелец каретки. Это свойство получает значение параметра AOwner в конструкторе. Это должен быть редактор которому принадлежит каретка и обязательно поддерживать интерфейс IControl.
    • Control - контрол которому принадлежит каретка. См. Owner.
    • Pos - положение каретки (координаты левого верхнего угла).
    • Size - размеры каретки.
    • Visible - видимость каретки. Установка этого свойства не означает что сразу же в текущем контроле замигает Flasher, это всего лишь установка признака говорящего о том, что в данном контроле он может замигать при подходящих условиях.
    • CanShow - это виртуальный метод в дополнение к Visible, который возвращает True, если контрол виден, доступен, в нем фокус ввода и он располагается на активной форме.
    • Displayed - это свойство говорит о том, что данная каретка находится в фокусном контроле и в него может осуществляться ввод с клавиатуры. Это свойство только для чтения, но оно меняется при выполнении методов Show и Hide.
    • Show - если Visible = True и CanShow возвращает True, то Flasher перемещается в контрол и свойство Displayed принимает значение True. Этот метод вызывается когда контрол получает фокус ввода.
    • Hide - делает Flasher невидимым, и свойство Displayed равным False.
    • UpdateFlasher - обновление всех свойств Flasher`а. Выполняется при изменении свойств. Этот метод запускает виртуальный метод DoUpdateFlasher который вы можете перекрыть. Традиционно если вы хотите временно отменить обновление то можно воспользоваться методами BeginUpdate и EndUpdate.
    • Flasher - мигающий прямоугольничек, ну или синее ведерко если использовать аналогию из автомобилизма. А на самом деле это интерфейс IFlasher, который отвечает за графическое отображение каретки. Сам по себе класс TCustomCaret ни чего не отображает, а только содержит данные которые используются Flasher'ом. Строго говоря, Flasher может представлять из себя что угодно, но по умолчанию используется наследник TRectangle, который объявлен в FMX.Objects (см. TCaretRectangle).

Вы можете обращаться к Flasher для того, например, чтобы узнать реальный цвет, или координаты каретки. Но будьте внимательны, в отличие от проблесковых маячков, существует только один экземпляр этого объекта и располагается на том редакторе, в котором находится фокус ввода. IFlasher имеет свойство Caret которое указывает на каретку контрола в котором располагается Flasher.

Каретка и клавиатура

Надо отметить, что каретка занимается не только перемещением Flasher`а, но и тесным образом связана с виртуальной клавиатурой. Когда меняется фокусный контрол, или свойство Displayed, то должна появиться или исчезнуть виртуальная (экранная) клавиатура. На мобильных устройствах с сенсорным экраном клавиатура обычно (но не всегда) видна, тогда когда отображается каретка. При этом учитываются еще пара свойств:

    • ReadOnly - если это свойство True, то виртуальная клавиатура не показывается, даже если каретка видна.
    • TemporarilyHidden - каретка временно скрывается хотя клавиатура видна и допускается ввод в фокусный контрол, при этом Displayed остаётся равным True.

Виртуальная клавиатура атоматически появляется при подходящих условиях, на платформе iOS, а в Windows Вы можете добиться подобной работы, если установите глобальную отладочную переменную VKAutoShowMode равной vkasAlways.

Чтобы отловить момент появления и сокрытия клавиатуры используйте события формы OnVirtualKeyboardShown и OnVirtualKeyboardHidden это может быть полезно для того, чтобы осуществить смещение рабочей области окна. Более подробно про скроллинг было написано в статье Платформонезависимый скроллинг

См. примеры samples\ScrollableFormDemo и samplesmobile\ScrollableForm. Если на рабочем компьютере нет примеров, то можно посмотреть здесь: ScrollableFormDemo.



Comments

  • Guest
    Alex W. Lulin Monday, 15 April 2013

    Напоминает мне это - TOvcCaret и TOvcCaretPair. От Turbo Power.

  • Guest
    roschinspb Tuesday, 16 April 2013

    Alex W. Lulin, это хорошо, или плохо? :)

  • Please login first in order for you to submit comments
  • Page :
  • 1

Check out more tips and tricks in this development video: