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

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


krapotkin

Вопрос

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

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

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

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

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

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

 

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

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

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

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

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

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

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

 

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

код

 

apk

 

 

 

 

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

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

  • 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
  • Администраторы

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

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

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

type
  TOpenPresentedControl = class(TPresentedControl);

TOpenPresentedControl(Edit).ReloadPresentation;
Ссылка на комментарий
  • 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 мне пришлось просто сделать новый проект и добавить туда формы от старого и стиль тоже новый с тем же именем

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

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

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

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

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

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

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

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

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

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