• 0
kami

Нестандартная клавиатура для своего приложения

Вопрос

Доброго времени суток!

Есть необходимость для некоторых TEdit вызывать "собственную" клавиатуру (конкретизирую - исключительно с цифрами, кнопкой Backspase, знаком "-" и Enter. Приложение будет для iPad, а там (к сожалению) клавиатура Numbers&Punctuation не отличается от NumbersOnly).

 

Самостоятельно я "докопался" до того, что подобное в теории возможно при использовании TEdit.ControlType = Platform, тогда в Edit.PresentationProxy.NativeObject будет лежать UITextField и можно ему присвоить "левый" UIView. Тогда, судя по документации Apple https://developer.apple.com/library/ios/documentation/UIKit/Reference/UITextField_Class/index.html#//apple_ref/occ/instp/UITextField/inputView этот "левый" UIView будет вызываться вместо стандартной клавиатуры.

 

К сожалению, для Edit.ControlType = Styled нативный контрол не создается, что сводит на нет все мои поиски, т.к. нужны именно стилизованные компоненты :(

 

Вторая потенциальная возможность, которую я рассматривал - узнать, где и как "глобально" вызывается клавиатура и подменить параметры вызова на свои. Но... во внутренностях всяких вызовов при получении элементом фокуса ввода я, если честно, запутался. Там много всего фигурирует, начиная от TCustomEditModel, заканчивая TFMXViewBase в TTextServiceCocoa.EnterControl. И непонятно, где же собственно вызов самой клавиатуры :)

 

Есть ли возможность (хотя бы направление) заменить стандартную клавиатуру на собственную, желательно - с сохранением при этом событий OnKeyboardShow / Hide и с использованием стилизованных компонентов ?

 

Конфигурация: Delphi XE7 upd1, iPad, iOS 8.2

Изменено пользователем kami

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

7 ответов на этот вопрос

  • 0

так нарисуйте свою, можно аж даже с помощью Trectable нарисовать и использовать где надо!

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
  • 0

Что вы подразумеваете под "нарисуйте свою"? Создать фрейм с кнопками? Да, это несложно.

А как сделать так, чтобы при получении Edit-ом фокуса ввода показывалась не системная клавиатура (которая идет поверх всего приложения), а именно эта? И чтобы код, который скроллит контекст формы так, чтобы элемент с фокусом ввода не скрывался клавиатурой, а оставался видимым отрабатывал одинаково и для системной клавиатуры и для своей? И чтобы символы вставлялись/удалялись именно в положение курсора, который пользователь может переместить в любое место?

 

Да, можно сделать Edit1.ReadOnly:=True, это позволит показать курсор и не вызовет клавиатуру. Да, на OnEnter/OnExit каждого из нужных Edit-ов можно повесить показ/скрытие своей клавиатуры. Да, можно в код формы, отвечающий за "оставание на экране" элемента с фокусом внести изменения по этой клавиатуре (правда, для этого фрейм клавиатуры придется делать глобальной переменной). Можно и закостылироваться со вставкой нужного символа в нужное положение. Но что-то слишком много получается "да, можно" и при этом решение будет не универсальным и зависящим от человеческого фактора. Кто поручится, что завтра не понадобится обрабатывать OnKeyDown/OnKeyUp и иже с ними? Или я забуду выставить ReadOnly для TEdit? И я уверен, что это не все вопросы, которые надо будет решить - при реализации вот такого велосипеда появится еще куча... Ну и- код по работе с клавиатурой получается размазанным по разным модулям, а это уже очень плохо. Да и приложение все же не будет считать этот велосипед за клавиатуру, а так - будет "закрывать глаза" на все несоответствия.

 

Все-таки, мне кажется, должно быть какое-то "общее" решение, которое позволит обойти озвученные вопросы изящно и непринужденно :)

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
  • 0

У нативного TEdit (ControlType = Platform) под iOS есть прозрачный стиль. Стиль без фона и рамки. Для его использования нужно прописать ручками стиль:

Edit1.StyleLookup = TransparentEditStyle

После этого, нативный эдит будет прозрачный. А значит вы можете под него сделать стилизованную подложку, чтобы ваш нативный эдит не выбивался из стилистики.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
  • 0

Господа, спасибо за участие в обсуждении!

 

Принимая во внимание кучу параметров, я "заморочился" на написание собственной клавиатуры. Проанализировав и продебажив кучу кода FMX, удалось подменить стандартную клавиатуру собственной.

 

На текущий момент концепт готов и работает, но обладает одним недостатком - из-за особенностей работы процедуры RegisterShowVKProc стандартный вызов клавиатуры теряется без возможности восстановления.

Посему - я буду реализовывать нужные мне виды + повторять стандартные Ru и Eng, возможно - с некоторыми изменениями.

 

Концепт предназначен для работы только под iOS.

 

Использование: подключаете к проекту модуль из архива... и всё. Кастомная клавиатура теперь будет показываться вместо стандартной во всех контролах, в которых вообще показывается клавиатура.

 

Известные недостатки:

1. Нет анимации появления/скрытия.

2. Не реализовано нажатие кнопки Return (пока не думал, как это делается)

3. Не реагирует на флаги TVirtualKeyboardStates

4. Не уверен в корректном удалении фрейма при завершении приложения.

5. Нет тулбара (не уверен, правда, что он нужен в собственной клавиатуре)

 

Если необходимо - готов дать пояснения по коду.

Ввиду того, что я только начинаю работать с FMX, любая критика приветствуется!

iOSCustomKeyboard.zip

Изменено пользователем kami
Rusland и rareMax понравилось это

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
  • 0

kami, как сделать чтобы на разные Edit открывались разные клавиатуры?

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
  • 0

Раз уж пошла такая пьянка - выложу сюда то, что по виртуальной клавиатуре есть у меня на текущий момент (в телеграме уже выложил).

Поддерживаются операционные системы: iOS, Windows. Оттестировано на 10.1 (Berlin)

Итак: архив распаковать куда угодно, в проект в uses подключить модули uCommonCustomKeyboard (отвечает за подмену "штатной виртуальной клавиатуры" на свою) и ufrCustomNumpad (отвечает за отображение цифровой клавиатуры).

Алфавитную, e-mail-овскую и тому подобные виды клавиатур оставляю на ваше усмотрение. Они делаются на основе ufrCustomNumpad, там больше заморочек с красивым размещением кнопок, чем с кодом.

CustomKeyboards.7z

Изменено пользователем kami
Rusland, Andrey Efimov и enatechno понравилось это

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
  • 0
В 05.12.2016 в 17:54, Rusland сказал:

как сделать чтобы на разные Edit открывались разные клавиатуры

Слегка запоздалый ответ, но... Выставляешь нужные keyboardtype полям ввода ... и всё. Если нужно анализировать какие-то другие поля - в моей клаве есть метод GetKeyboardTypeForObject, в котором можно провести нужные (не предусмотренные штатным механизмом) манипуляции

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Создайте аккаунт или войдите для комментирования

Вы должны быть пользователем, чтобы оставить комментарий

Создать аккаунт

Зарегистрируйтесь для получения аккаунта. Это просто!


Зарегистрировать аккаунт

Войти

Уже зарегистрированы? Войдите здесь.


Войти сейчас

  • Сейчас на странице   0 пользователей

    Нет пользователей, просматривающих эту страницу