Отслеживание изменений в tStringEdit

Вопросы программирования и использования MSEide + MSEgui.

Модератор: Модераторы

Отслеживание изменений в tStringEdit

Сообщение t-ea » 02.08.2013 09:40:14

Когда-то давно задавал вопрос…

На форме есть StringEdit и DBGrid. Значение StringEdit — «живой» фильтр для DBGrid. Ввели в StringEdit '1' и DBGrid обновляется с запросом типа 'WHERE … LIKE '1%'. Ввод в StringEdit обрабатывается в OnTextEdited.

Однако, если в StringEdit выделить введённое значение и ввести что-то новое, то OnTextEdited сработает два раза, сначала для пустой строки, второй раз для введённых данных.
Получается два запроса к базе, причем первый очень большой и долгий, так как никакого 'WHERE' для пустого фильтра нет и таблица выбирается полностью, а затем выбираются данные согласно введённым данным.

Как получить последнее значение, без промежуточных вариантов?
t-ea
новенький
 
Сообщения: 98
Зарегистрирован: 22.09.2006 00:22:34

Re: Отслеживание изменений в tStringEdit

Сообщение SeZuka » 02.08.2013 16:44:40

Обычно для таких вещей использую таймер. При изменении текста заводится таймер на 0.5-1 сек, если за это время что-то еще ввели, то заводится заново, если нет, то уже в обработчике таймера производится фильтрация. Имхо это намного лучше, чем на каждый введенный символ гонять базу промежуточными запросами. Если хотите хотите сразу видеть результат без задержки, то поставьте таймер на 0.1с, и ваше двойное событие отфильтрует и глазу незаметна будет задержка.
SeZuka
постоялец
 
Сообщения: 209
Зарегистрирован: 05.09.2012 14:58:05

Re: Отслеживание изменений в tStringEdit

Сообщение debi12345 » 02.08.2013 22:38:52

Первоисточник:
Hi,
In order get notified of a user value entry use onsetvalue where the user
entered value is not yet stored in the value property and can be modified or
rejected. After "onsetvalue" the value will be stored and "ondataentered" is
called.
"ontextedited" is called by every keystroke. "onchange" is triggered by
changes of the value property.

Martin
Аватара пользователя
debi12345
долгожитель
 
Сообщения: 5752
Зарегистрирован: 10.05.2006 23:41:15
Откуда: Ташкент (Узбекистан)

Re: Отслеживание изменений в tStringEdit

Сообщение t-ea » 07.08.2013 09:56:55

Спасибо SeZuka.
Раньше я почему-то боялся, что с таймером будет большой лаг между вводом и отображением.

to debi12345:
В принципе, мне нужно было знать, есть ли возможность при изменении содержимого строки, получить итоговый результат изменения, пропустив все Set*, Edit*, Change*.
t-ea
новенький
 
Сообщения: 98
Зарегистрирован: 22.09.2006 00:22:34

Re: Отслеживание изменений в tStringEdit

Сообщение debi12345 » 07.08.2013 22:11:10

Там несколько этапных событий (OntextEdited, OnSetValue,OnEntered) - в котрых можно видеть старое и новое значенеи, отменить или модифицировать новое... Для БД-виджетов можно и нужно использоватаь события редактирвания БД-полей - то есть создаавть эти поля в Persistent-варианте, назначть их события и привызываться уже к ним.

Добавлено спустя 3 минуты 46 секунд:
Раньше я почему-то боялся, что с таймером будет большой лаг между вводом и отображением.

И правильно боялся, и надо бояться - потому что это не "a solution but an workaround" :)
Вообще, если нужна какая-то толковая фича - сразу пишите "feature request " к Мартину. Он иногда за один вечер все делает :)
Аватара пользователя
debi12345
долгожитель
 
Сообщения: 5752
Зарегистрирован: 10.05.2006 23:41:15
Откуда: Ташкент (Узбекистан)

Re: Отслеживание изменений в tStringEdit

Сообщение t-ea » 08.08.2013 11:28:37

Так в каких из этих этапных событий мне можно увидеть окончательную версию изменённой строки? Или хотя бы знать что «вот эта версия нового значения временная, дальше будут ещё изменения».
То есть, при замене выделенного в строке, игнорировать первоначальное удаление выделения и реагировать только тогда, когда в строку вместо выделенного будет добавлено новое содержание.

А таймер я и раньше думал добавить, так как при быстром изменении фильтра (быстро стучим по клавиатуре), нет смысла фильтровать каждое нажатие, если в конце всё равно искать "Иванова", а не "Ивано" и не "Иван".
t-ea
новенький
 
Сообщения: 98
Зарегистрирован: 22.09.2006 00:22:34

Re: Отслеживание изменений в tStringEdit

Сообщение mse » 08.08.2013 16:48:27

For all t*edit data widgets user value entry is terminated by pressing <Enter>
key or by focusing another widget.
If one wants to react on typed text without waiting until the user presses
<Enter> one can use a tedit (tab widgets). There are new properties "delay"
and "ontextediteddelayed". Delay is in milliseconds. The delay will be
restarted by every keystroke.
git master aad6f1dbd48a2a77b80f65fc8865ebc8dcc53f47.
http://gitorious.org/mseide-msegui
mse
новенький
 
Сообщения: 68
Зарегистрирован: 08.08.2013 15:40:31

Re: Отслеживание изменений в tStringEdit

Сообщение t-ea » 10.08.2013 11:16:18

Ок.

Только хочу уточнить, как я понял AText в OnTextEditedDelay — это "финальная" строка после всех обработок внутри tEdit?
t-ea
новенький
 
Сообщения: 98
Зарегистрирован: 22.09.2006 00:22:34

Re: Отслеживание изменений в tStringEdit

Сообщение mse » 10.08.2013 12:05:03

The "atext" parameter in "ontextediteddelayed" is the current value of "tedit.text".
If I understand correct, you want to update a DB filter while the user types without to wait until he presses <Enter>?
For that use "tedit" with the new "delay" parameter probably is the right choice.

Normally for value entry one would use "t*edit" (tintegeredit, tstringedit, trealedit...) with "t*edit.value" and "t*edit.onsetvalue". In "onsetvalue" the "avalue" property is the just by <Enter> key terminated user entry, "t*edit.value" holds still the previous data.
In "onsetvalue" the user entry can be modified or rejected.
After the user entry has been stored in *t*edit.value", "ondataentered" will be called.
Do you know the MSEgui lookup components, for example tdbenumeditdb or tdbdropdownlistdb? There is also the very fast tlookupbuffer and descendants. "tmsesqlquery" and "tlocaldataset" also support local indexes with master detail value lookup without dataset scrolling.
mse
новенький
 
Сообщения: 68
Зарегистрирован: 08.08.2013 15:40:31


Вернуться в MSEide + MSEgui

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 1

Рейтинг@Mail.ru