Страница 1 из 1

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

СообщениеДобавлено: 02.08.2013 09:40:14
t-ea
Когда-то давно задавал вопрос…

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

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

Как получить последнее значение, без промежуточных вариантов?

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

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

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

СообщениеДобавлено: 02.08.2013 22:38:52
debi12345
Первоисточник:
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

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

СообщениеДобавлено: 07.08.2013 09:56:55
t-ea
Спасибо SeZuka.
Раньше я почему-то боялся, что с таймером будет большой лаг между вводом и отображением.

to debi12345:
В принципе, мне нужно было знать, есть ли возможность при изменении содержимого строки, получить итоговый результат изменения, пропустив все Set*, Edit*, Change*.

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

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

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

И правильно боялся, и надо бояться - потому что это не "a solution but an workaround" :)
Вообще, если нужна какая-то толковая фича - сразу пишите "feature request " к Мартину. Он иногда за один вечер все делает :)

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

СообщениеДобавлено: 08.08.2013 11:28:37
t-ea
Так в каких из этих этапных событий мне можно увидеть окончательную версию изменённой строки? Или хотя бы знать что «вот эта версия нового значения временная, дальше будут ещё изменения».
То есть, при замене выделенного в строке, игнорировать первоначальное удаление выделения и реагировать только тогда, когда в строку вместо выделенного будет добавлено новое содержание.

А таймер я и раньше думал добавить, так как при быстром изменении фильтра (быстро стучим по клавиатуре), нет смысла фильтровать каждое нажатие, если в конце всё равно искать "Иванова", а не "Ивано" и не "Иван".

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

СообщениеДобавлено: 08.08.2013 16:48:27
mse
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

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

СообщениеДобавлено: 10.08.2013 11:16:18
t-ea
Ок.

Только хочу уточнить, как я понял AText в OnTextEditedDelay — это "финальная" строка после всех обработок внутри tEdit?

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

СообщениеДобавлено: 10.08.2013 12:05:03
mse
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.