Перейти к содержанию
Fire Monkey от А до Я
  • 2

vkbdhelper - поднятие компонентов над клавиатурой


Вопрос

  • Модераторы

Привет Всем!

 

vkbdhelper.pas

 

Force focused control visible when Android Virtual Keyboard showed or hiden
How to use:
place vkdbhelper into your project uses section. No more code needed.

 

Давно пользовался vkbdhelper'ом, но он был только для андроида.

руки добрались и до этого, теперь его можно использовать и на IOS

 

изменения

* почистил uses секцию

* убрал зависимость от платформ (кросс-платформенный)

* добавил глобальную переменную VKOffset

 

VKOffset - расстояние между контролом и клавиатурой

                 для тех случаев когда включены подсказки/автозамена

                 и контрол оказывается под доп. панелькой

 

Не все клавиатуры включают доп. панели в свой размер!

Например для IOS нужно всегда прибавлять 30-32 пикселя, панель с кнопкой Done перекрывает контрол

{$IFDEF IOS}
  VKOffset := 31;
{$ELSE}
  VKOffset := 0; // на свой вкус
  // не знаю как определить размер доп. панельки
  // когда она не входит в размер клавиатуры 
  // и определить есть ли панелька вообще...
{$ENDIF}

vkbdhelper.zip

Ссылка на комментарий

Рекомендуемые сообщения

  • 0

Подъем срабатывает только со второго раза. После этого отрабатывает хорошо. Обошёл этот момент, тем что делаю SetFocus невидимому Edit'у при создании формы, ну а потом любое нажатие будет 2-рым и последующим.

 

А вот никак не могу понять:

С ScrollBox'ом не подымает? Объясню: У меня на форме есть ScrollBox (статический), я его заполняю динамическими Edit'ами. Так как Edit'ов много, они все не помещаются и логично что появляется прокрутка. Все работает как надо. И вот когда пытаешься редактировать Edit -> появляется клавиатура и скрывает его. Т.е не подымает над клавиатурой. 

 

Значит когда я присваиваю Parent у Edit'ов sVKBHelperLayout, подъем работает как надо, но! прокрутки списка editov нет! Т.е доступны Только те кто влез на высоту формы.

Подскажите можно ли это как то совместить?

Пытался ScrollBox'у присваивать Parent sVKBHelperLayout, происходит всё как во втором случае -> пропадает прокрутка.   

Ссылка на комментарий
  • 0

vkbdHelper имеет весьма интересный алгоритм - если он находит scrollbox и понимает, что тот в состоянии поднять поле ввода так, чтобы оно было над клавиатурой, то собственный Layout не создается, а прокручивается имеющийся ScrollBox. Но там какой-то алгоритм работы со scrollbox-ом, который отличается от штатной демки.

Не проверял этот момент и не менял его, попробую посмотреть, когда разгребусь с текущими вопросами.

Ссылка на комментарий
  • 0

Вам нужны координаты клавиатуры (пересчитанные из Screen в Client)  и AbsoluteRect поля ввода.

if vkbdRect.IntersectsWith(EditAbsoluteRect) then
  // пересекаются.

Однако, следует обратить внимание на оба issue в комментариях - сообщенный приложению размер клавиатуры не всегда соответствует действительности.

Изменено пользователем kami
Ссылка на комментарий
  • 0

Коллеги, прошу при возможности протестировать очередную модификацию модуля.

К сожалению, Santya видимо покинул форум надолго, так что отработать решение проблемы и возможные недостатки на "первом подопытном" не удалось.

 

Основные изменения: очень многое переписал. По большому счету от исходного модуля осталась идея и два фундаментальных момента.

 

Как обычно, спасибо Rusland за тестирование.    Осталось проверить, как ведет себя модуль с ScrollBox-ами, которые не растянуты на всю форму.

 

vkbdhelper.zip

Ссылка на комментарий
  • 0

Ребят, подскажите, почему убрали VkOffset ?

Я скачал последнюю версию (кстати указывайте версию) с https://github.com/rzaripov1990/vkbdhelper  -  Latest commit f132774 on Oct 10, 2016 и там нету VkOffset.

Как быть с этой доп. панелькой? На одной Java программе (Tasks) эта панелька может подниматься вверх и контрол как бы оказывается между клавиатурой и панелькой (HTC), наверное это решение программиста, а не системное.

Честно говоря удивляет что Embarcadero ничего не придумали на этот счет, ведь эта стандартная функция нужна всем разработчикам.

Изменено пользователем ENRGY
Ссылка на комментарий
  • 1
  • Модераторы
7 часов назад, ENRGY сказал:

Ребят, подскажите, почему убрали VkOffset ?

Я скачал последнюю версию (кстати указывайте версию) с https://github.com/rzaripov1990/vkbdhelper  -  Latest commit f132774 on Oct 10, 2016 и там нету VkOffset.

Как быть с этой доп. панелькой? На одной Java программе (Tasks) эта панелька может подниматься вверх и контрол как бы оказывается между клавиатурой и панелькой (HTC), наверное это решение программиста, а не системное.

Честно говоря удивляет что Embarcadero ничего не придумали на этот счет, ведь эта стандартная функция нужна всем разработчикам.

можно использовать тот модуль который идёт с этим параметром, но опять же никак не узнать высоту панельки (при её наличии)

я в своих проектах в последнее время использую метод от ембы.

сделал форму которая содержит код и TVertScrollBox, и когда нужно наследуюсь от нее и больше не пишу код для поднятия контролов

Ссылка на комментарий
  • 0

1. А метод Embarcadero это тот что в примере ScrollableForm?

2. А в этом методе учитывается вторая панель?

 

Цитата

сделал форму которая содержит код и TVertScrollBox, и когда нужно наследуюсь от нее и больше не пишу код для поднятия контролов

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

P.s. А вы не могли бы поделиться этим шаблоном, пожалуйста, если можно - вы очень многим страждущим поможете :) . Я тут порылся на форуме, этот вопрос очень часто всплывает.

Изменено пользователем ENRGY
Ссылка на комментарий
  • 0
  • Модераторы
2 часа назад, ENRGY сказал:

1. А метод Embarcadero это тот что в примере ScrollableForm?

2. А в этом методе учитывается вторая панель?

1) да

2) эта панелька не всегда является частью клавиатуры

2 часа назад, ENRGY сказал:

P.s. А вы не могли бы поделиться этим шаблоном, пожалуйста, если можно - вы очень многим страждущим поможете :) . Я тут порылся на форуме, этот вопрос очень часто всплывает.

там большой шаблон, не одна форма. и куча модулей. пока не готов выложить

рецепт такой:

  • создаете пустую форму (шаблон), кидаете TVertScrollBox
  • вставляете код от ембы
  • сохраняете
  • затем когда нужно, копируете шаблон в папку с проектом
  • добавляете шаблон в проект
  • делаем наследование (File-New-Other-Inheritables Items- выбираем свой шаблон)
  • Готово
Ссылка на комментарий
  • 0

Привет всем!

столкнулся с такой проблемой, пример из Delphi и vkbdhelper  не работают, если на форме, внутри VertScrollBox есть, кпримеру, набор TEdit которые не входят по высоте в форму и изначально содержимое имеет скролл.

Все хорошо, пока выбирается TEdit в видимой области, если же проскроллировать вниз списка и пытаться выбрать элементы из низа списка,

то это сделать невозможно, VertScrollBox перепрыгивает в верхнюю позицию, и выбранный элемент остается нивидимым, под ( или даже ниже) вирт. клавиатуры.

Похоже, в обоих случаях, не учитывается начальное смещение СкроллБокса.

Причем в примере Дельфи, там выравнивание Layout задано как Client , которое изначально "убивает" Scroll, у себя поставил Top, для сохранения высоты Layout, чтобы изначально Scroll появился.

Приложил свой тестовый проект.. с vkbdhelper .

Неужели после стольких лет fmx нет нормального решения из коробки для создания формы с длинным вертикальным списком  Едитов и возможностью внесения информации в конце списка?

все в детских штанах..

TestScroll.7z

Изменено пользователем Сергей Сергеев
Ссылка на комментарий
  • 0

Как это будет выглядеть например на форме авторизации или с нижнем фиксированном полем ввода сообщения в чате?
vkbdhelper в общем то полностью справлялся с задачей, но после перехода на Александрию начал чудить.
Кстати клавиатура не закрывается при старте приложения, если в процессе перейти на другой Edit (если он есть по соседству), то потом всё работает как надо, если его нет, то вообще никак клавиатуру не закрыть.
Еще ранее был конечно баг с появленим скрытой MasterButton Multiview при первом фокусе Edit, но он не сильно напрягал.

Ссылка на комментарий
  • 0

Отладка показала что при первом фокусе при использовании vkbdhelper у Edit IsFocused=False.

Соответственно перестает работать процедура ResetFocus FMX.Controls.

А так как в приложении используется аналитика vkHardwareBack с последующим обнулением Key то фокус на Edit.ResetFocus не сбрасывался.

Пока убрал обнуление Key при активном Edit, все работает как надо.

 

if (Focused<>nil) then if  Focused.GetObject.ClassName = 'TEdit' ...


 

 

 

Ссылка на комментарий
  • 0
В 27/09/2021 в 03:33, IgorK11 сказал:

A depuração mostrou que no primeiro foco ao usar vkbdhelper, Edit IsFocused=False.

Assim, o procedimento ResetFocus FMX.Controls para de funcionar.

E como o aplicativo usa a análise vkHardwareBack com a redefinição subsequente da chave, o foco em Edit.ResetFocus não foi redefinido.

Até agora, removi a redefinição da chave quando a edição está ativa, tudo funciona como deveria.

 


 

 

 

o seu esta funcionando? estou tentando a dias. estou usando o Delphi 11.1. não consegui resolver, o cursor fica parado

Ссылка на комментарий
  • 0
В 27/09/2021 в 03:33, IgorK11 сказал:

A depuração mostrou que no primeiro foco ao usar vkbdhelper, Edit IsFocused=False.

Assim, o procedimento ResetFocus FMX.Controls para de funcionar.

E como o aplicativo usa a análise vkHardwareBack com a redefinição subsequente da chave, o foco em Edit.ResetFocus não foi redefinido.

Até agora, removi a redefinição da chave quando a edição está ativa, tudo funciona como deveria.

 


 

 

 

poderia compartilhar sua Unit com as modificações?

não consegui.

Ссылка на комментарий

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить на вопрос...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...