• 0
krapotkin

TEdit с автозавершением

Вопросы

Вдохновленный статьей Ярослава Бровина про автозавершение, решил воспользоваться ей и сделать для своей программы автозавершение с хождением в интернет.

Delphi XE8.1. Андроид.4.4.2 на телефоне

Мне требуются варианты адресов город/улица/дом по введенному тексту, поэтому создан AddrAutocomplete-style.

Введенная строка передается некоему сервису, он возвращает список релевантных вариантов. Так что я выбросил из исходного текста все сравнения со списком вариантов и т.п.

Также выброшена реакция на сообщение изменения данных модели, т.к. мы и так перехватываем DoChangeTracking, что и приводит к изменению модели. Масло масляное имхо.

Здесь для примера обращения к сервису удалены, оставлен только готовый список FSuggestions

 

И тут я столкнулся с проблемой.

Наберите в edit Ба  - выпадет список 'Бабушкина','Бабушкина 1','Бабушкина 2','Бабушкина 3','Бабушкина 32','Бабушкина 5'

теперь пробел, и оппа - я не могу вводить цифры с клавиатуры!

Причем не генерируется даже событие OnKeyDown!

Недавно сталкивался с неверным поведением нестандартной клавиатуры, поэтому сменил Swipe на стандартную. Не помогло.

На планшете (Анд.4.1.1) тот же эффект.

Если компилировать под Win32 - все нормально.

 

Всю голову сломал. Помогите plz

код

 

apk

 

 

 

 

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


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

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

  • 0

Любопытная ошибка. Попробуйте внести следующие изменения в FMX.Platform.Android.pas так:

 

Найдите метод

function TWindowManager.FindTopWindow: TAndroidWindowHandle;
var
  I: Integer;
begin
  for I := FWindows.Count - 1 downto 0 do
    if FWindows[I].Form.Visible then
      Exit(FWindows[I]);
  Result := nil;
end;

И замените условие IF на следующее:

    if FWindows[I].Form.Visible and not (FWindows[I].Form is TCustomPopupForm) then

По идеи это должно помочь

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


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

Удалил библиотечные DCU, скопировал себе в папку проекта FMX.Platform.Android.pas, внес исправления, включил в проект

Теперь работает. Спасибо! ))

 

Но как это отличает цифры от букв ???

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


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

Ну и до конца чтобы разрешиться...

Нет ли смысла рабочий код вынести из DoChangeTracking в MMDataChanged ?

Допустим, я запущу отдельный поток лазить в интернет.

При возврате он должен вызвать сообщение, что модель изменилась. И механизм сработает опять.

Как это сделать правильно?

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


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

Дело в том, что в андроиде нету нормального ввода текста. Весь ввод идет через IME. А вот цифры идет отдельно, поэтому ввод цифр шел напрямую в всплывающее окно.

  • MM_Data_Changed - это уведомление, когда пользователь меняет значение свойства в Model.Data.
  • DoChangeTracking (Аналог MM_EDIT_TEXT_CHANGING) - это уведомление о том, что текст в TEdit меняется.

Поэтому это две разных по сути сущности

Если вы хотите, чтобы при изменении данных в моделе, модель не уведомляла об этом презентацию, то используйте парные методы модели:

Model.DisableNotify;
try
  // Меняем данные в моделе без уведомлений 
finally
  Model.EnableNotify;
end;

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


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

первое приближение чуть улучшенного TAutocompleteEdit

пример, думаю крайне полезный и может расширить оригинальную статью

можно взять тут (не получается выкладывать на форум)

Dbzb2Rgt.png

буду признателен, если найдете ошибки

если нетрудно, ответьте plz на вопросик, почему на Android клик по выбранному ListBoxItem срабатывает только со второго раза?

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


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

Могу вам предложить использовать TListBox.OnItemClick. Он возвращает в параметры выделенный итем. Из него можно извлечь текст и передать в ApplySelection

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


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

1. ввёл Павловская

2. начал стирать, образовалась подсказка

3. ввёл Палисадная (несколько букв), выбрал

4. начал стирать, осталось подсказка Павловская

 

Сделай чтобы при выборе Item'a менялась подсказка и кликнуть нужно два раза

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

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


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

улучшения:

1.заменил Item.OnClick на List.OnItemClick, стало все с первого раза выбираться

2.подсказка к выбранному тексту перевыводится

3. добавлено сокращение ул. б-р, пр. и т.д.

4. в разряд feature - (ZuBy, п.4) - если стереть введенный текст, остается размытый след от предыдущего текста O_O.

"это не я" )))  Я пытался сделать скриншот, форма перерисовывается и на фотке уже без косяков ))) улик нет...

Это касается только стиля Transparent. После замены его на другой проблемы нет.

 

обновление

 

P.S. вопрос - как заливать сюда файлы ?

мой яндекс диск - не лучшее место для долговременного хранения...

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


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

Еще столкнулся

Если Tedit создавать динамически

e:=TEdit.Create(form);
e.OnPresentationNameChoosing:=ePresentationNameChoosing;

то чтобы eFromPresentationNameChoosing сработало, нужно вызвать какое-то заклинание. Какое именно?

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


Ссылка на сообщение
Поделиться на другие сайты
  • 0
P.S. вопрос - как заливать сюда файлы ?

мой яндекс диск - не лучшее место для долговременного хранения...

расширенная форма -> прикрепить файлы

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


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

хм, получилось

а до этого писало - у вас нет прав загружать файлы этого типа

AutoCompleteExample.7z

AutoCompleteExample.7z

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


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

Раньше нельзя было прикреплять 7z файлы. Я после вашего сообщения добавил эти файлы в список разрешенных к прикреплению.

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


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

большое спасибо!

можно еще вопрос из поста №11 порешать?

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


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

Да, конечно. У TPresentedControl есть методы для этого. Но они к сожалению в протектед секции. Я повышу им область видимости, так как здесь нету причин делать их protected. А пока делаем старым "дедовским способом":

type
  TOpenPresentedControl = class(TPresentedControl);

TOpenPresentedControl(Edit).ReloadPresentation;

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


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

Спасибо!

 

Не знаю, в какой пост нажать "вопрос решен"

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


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

хочу вновь вернуться к теме

на DX10 работавший пример дает ошибку

Ярослав, взгляните, plz

http://shot.qip.ru/00Kawf-6Dbzb2S9s/

First chance exception at $616114DA. Exception class Segmentation fault (11). Process AutoCompleteExample.apk (28514)

AutoCompleteDX10.7z

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


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

В RX нужно изменить создание презентации. Я обновил свою статью недели две назад по этому поводу: Новый подход разработки компонентов FireMonkey “Контрол – Модель – Презентация”. Часть 2. TEdit с автозавершением.

В новой версии можно полностью убрать класс прокси TStyledAutocompleteEditProxy и регистрировать презентацию так:

  TPresentationProxyFactory.Current.Register('Edit-style', TStyledPresentationProxy<TStyledAutoCompleteEdit>);

Или просто заменить код:

{ TStyledAutocompleteEditProxy }
 
function TStyledAutocompleteEditProxy.CreateReceiver: TObject;
begin
  Result := TStyledAutocompleteEdit.Create(nil);
end;

на

{ TStyledAutocompleteEditProxy }
 
function TStyledAutocompleteEditProxy.CreateReceiver: TObject;
begin
  Result := TStyledAutocompleteEdit.Create(nil, Model, PresentedControl);
end;

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


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

krapotkin, как вы сделали такой стиль,

Попробовал открыть проект, а он ругается

---------------------------

bds.exe - Диск отсутствует
---------------------------
В устройстве нет диска. Вставьте диск в устройство D:. 
---------------------------
Отмена   Повторить   Продолжить   
---------------------------
Изменено пользователем Rusland

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


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

Да. Видимо это из-за деплоя из D:\_Krapotkin...

Как сделать стиль как на этой картинке? Dbzb2Rgt.png

 

 

PS. Когда удаляешь все набранные символы, список не пропадает, что было бы логичным.

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

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


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

это стандартный стиль transparent.style

находится в папке %delphi%/Redist/styles/fmx

 

открываете в Seattle ?

 

при переходе от 8 к 10 мне пришлось просто сделать новый проект и добавить туда формы от старого и стиль тоже новый с тем же именем

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


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

Для публикации сообщений создайте учётную запись или авторизуйтесь

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

Создать учетную запись

Зарегистрируйте новую учётную запись в нашем сообществе. Это очень просто!

Регистрация нового пользователя

Войти

Уже есть аккаунт? Войти в систему.

Войти

  • Похожий контент

    • От Barbanel
      Всем привет!
      Недавно столкнулись с особенностью двух разных смартфонов.
      При вводе в TEdit обычного емейл-адреса срабатывает автозамена. После этого, ввод текста ломается.
      Т.е. пользователь ставит курсор на последний символ слова, нажимает внопку "стереть", каретка перескакивает на второй символ в тексте, и стирает именно второй символ. Конец строки таким образом вообще невозможно удалить.
      Есть видео с багом. Утверждается что проблема воспроизводится на более древнем устройстве.
      Вопрос: кто-то сталкивался с таким, как лечили?
      Собсно предполагаемые решения
      1) отключить автозамену для конкретного поля ввода (но я не уверен что это возможно),
      2) дебажить и исправлять TEdit (шоб меня покрасили!!!)
      Всем заранее сенкс!
      TEdit Bug.mp4
    • От Bohdan
      Всем Привет!

      Платформа ios Delphi 10.2.2, хочу при нажатии на label показывать edit (для редактирования label.) Столкнулся с проблемой:
       Как отследить Tap  за пределами Edit чтобы его скрыть, не могу понять как это сделать.
    • От Sashar333
      Delphi 10,1 berlin
      Здравствуйте!
      Подскажите как отключить на android в TEdit появляющиеся кнопки ВСТАВКА КОПИРОВАТЬ и т.д.
      или как запретить вставлять из буфера в приложении?
      Спасибо!
       
    • От Ufomaster
      При использовании на форме TMS FMX WebGMaps и Edit ов, возникает зависание приложения после повторного входа в эдит и удаления там текста. 
    • От Anasazi
      Всем привет. Столкнулся со следующей проблемой после активации tedit при попытке создать любое намерение (для набора номера или открытия ссылки) программа наглухо зависает. И наоборот после создания и выполнения намерения, если перейти к tedit происходит глухое зависание. Тоже самое происходит и с memo.
      Проблема похожа на описанную в этой теме, но решение из нее не помогает
      Чем заменить tedit не знаю, пробовал все возможные варианты. Функции работы с намерениями рабочая и если не активировать tedit то все работает отлично.
      Пробовал на разных устройствах, результат тот же. Правда на всех устройствах был Android 5.
       
      Подскажите пожалуйста, возможно ли под android создать диалоговое окно с вводом текста? Или может быть есть еще какие-нибудь способы ввода текста?
       
    • От Barbanel
      Здравствуйте уважаемые,
      есть форма с множеством TEdit, при этом они не помещаются на один экран и помещена на TScrollBox.
      При скороллинге если скроллить нажимая на подложку (т.е. сам TScrollBox) все работает идеально, если же нажимать на сам TEdit и таким образом скроллить, то выезжает клавиатура, что вобщемто неудобно.
      Вопрос: как настроить приложение/форму/ТСкроллБокс так, чтобы при зажатии и движении пальца вверх/вниз на ТЕдите клавиатура не выезжала?
      На нативных приложениях описанного выше поведения я не замечал.
       
      Заранее спасибо!
       
    • От Euvene
      Добрый день, возникла такая проблемка: при добавлении в ListBoxItem компонента TEdit если поставить ему TControlType::Platform он вылазит за пределы ListBox но при Styled все норм, кто нибудь сталкивался и как с этим бороться?


    • От lala4a
      Доброе время суток .  2 вопроса по Tedit . Помогите , пожалуйста )
      1) Притормаживает ввод текста и выделения .
      2) Внешний вид меню Вставить при длительном тапе по Tedit  отличается от всех других приложений .
       


    • От chaplin.u@gmail.com
      Как реализовать такое-же окно  как на картинке ?
    • От chaplin.u@gmail.com
      при входе в TEdit появляется виртуальная клава. набираю текст. заканчиваю нажатием на Ентер - клава не убирается.
      Как её убрать с передачей текста ?
  • Последние посетители   0 пользователей онлайн

    Ни одного зарегистрированного пользователя не просматривает данную страницу