![]() |
|
|
|
|
#1
|
||||
|
||||
|
Имеется ADOQuery, DBGrig, в общем стандартный набор.
В базе есть какая-то таблица, с какими-то данными - вообще не суть. На форме есть DBGrid, в котором отображается таблица с данными, И имеется Edit, в котором вписываем текст для поиска. Пытаюсь сделать что по мере набора текста в Edit сразу же идет фильтрация. т.е. на обработчике Edit.KeyUP висит SQL отбор: Код:
with Form1.ADOQuery1 do begin
SQL.Clear;
SQL.Add('SELECT user_name,groups FROM users_list');
SQL.Add('WHERE usr_roles < 5');
SQL.Add('AND (user_name LIKE '+quotedstr('%'+Edit1.text+'%'));
SQL.Add('OR groups LIKE '+quotedstr('%'+Edit1.text+'%')+')');
SQL.Add('ORDER BY user_name');
Open;
End;Вопрос: Как избавиться от "Мерцания"? DoubleBuffering - не помогает. Или может я изначально не правильно делаю фильтрацию? - Тогда подскажите как это делать правильно. |
|
#2
|
||||
|
||||
|
Сначала напишешь тему, опубликуешь, потом прочитал что написал, и появляется идея... Легкое гугление и вуаля:
Код:
if Length(Edit1.Text)>0 then begin
Form1.ADOQuery1.Filter:='user_name LIKE '+quotedstr('%'+Edit1.text+'%')+
' OR groups LIKE '+quotedstr('%'+Edit1.text+'%');
Form1.ADOQuery1.Filtered:=true;
end
else begin
Form1.ADOQuery1.Filter:='';
Form1.ADOQuery1.Filtered:=false;
end;![]() |
|
#3
|
||||
|
||||
|
Ну я бы фильтр применял только в том случае, если разница во времени последнего изменения эдита больше секунды, т.о. пока что-то вколачиваешь в эдит -- грид спокойный, оторвал руки от клавы и грид сразу становится буйным.
|
|
#4
|
||||
|
||||
|
M.A.D.M.A.N. Предлагаешь таймер еще повесить?... вроде как не комильфо, хотя идея интересная.
|
|
#5
|
|||
|
|||
|
поищи в инете, может есть Edit с задержкой вызова OnChange
|
|
#6
|
||||
|
||||
|
Еще неплохо бы ограничивать количество результатов при таком запросе. Скажем 100 первых результатов более чем достаточно. Ну а мерцание должно уйти если включить буферизацию.
|
| Этот пользователь сказал Спасибо Страдалецъ за это полезное сообщение: | ||
gewasop (14.06.2015)
| ||