Перейти к содержанию
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 эмодзи.

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

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

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

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