Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > Базы данных
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 09.06.2015, 16:22
Аватар для SCrat.ORS
SCrat.ORS SCrat.ORS вне форума
Активный
 
Регистрация: 20.02.2007
Адрес: Мой адрес не дом и не улица, мой адрес 0x7С00
Сообщения: 208
Версия Delphi: 2006
Репутация: 884
Вопрос Поиск по таблице

Имеется 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;
И всё хорошо фильтруется и отсеивается, но DBGrig при каждом нажатии "Мерцает", - оно понятно, что он данные обновляет и поэтому "мерцает".
Вопрос: Как избавиться от "Мерцания"? DoubleBuffering - не помогает.
Или может я изначально не правильно делаю фильтрацию? - Тогда подскажите как это делать правильно.
__________________
Програмистами не рождаются, ими становятся!
Ответить с цитированием
  #2  
Старый 09.06.2015, 16:46
Аватар для SCrat.ORS
SCrat.ORS SCrat.ORS вне форума
Активный
 
Регистрация: 20.02.2007
Адрес: Мой адрес не дом и не улица, мой адрес 0x7С00
Сообщения: 208
Версия Delphi: 2006
Репутация: 884
По умолчанию

Сначала напишешь тему, опубликуешь, потом прочитал что написал, и появляется идея... Легкое гугление и вуаля:
Код:
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;
Так "мерцания" нет. А также нет надобности переименовывать columns после фильтрации. Единственное при закрытии формы (если она второстепенная, например для выбора чего-то) нужно очищать и выключать Filtered.
__________________
Програмистами не рождаются, ими становятся!
Ответить с цитированием
  #3  
Старый 09.06.2015, 18:39
Аватар для M.A.D.M.A.N.
M.A.D.M.A.N. M.A.D.M.A.N. вне форума
Sir Richard Abramson
 
Регистрация: 05.04.2008
Сообщения: 5,505
Версия Delphi: XE10
Репутация: выкл
По умолчанию

Ну я бы фильтр применял только в том случае, если разница во времени последнего изменения эдита больше секунды, т.о. пока что-то вколачиваешь в эдит -- грид спокойный, оторвал руки от клавы и грид сразу становится буйным.
__________________
— Как тебя понимать?
— Понимать меня не обязательно. Обязательно меня любить и кормить вовремя.


На Delphi, увы, больше не программирую.
Рекомендуемая литература по программированию
Ответить с цитированием
  #4  
Старый 09.06.2015, 19:01
Аватар для SCrat.ORS
SCrat.ORS SCrat.ORS вне форума
Активный
 
Регистрация: 20.02.2007
Адрес: Мой адрес не дом и не улица, мой адрес 0x7С00
Сообщения: 208
Версия Delphi: 2006
Репутация: 884
По умолчанию

M.A.D.M.A.N. Предлагаешь таймер еще повесить?... вроде как не комильфо, хотя идея интересная.
__________________
Програмистами не рождаются, ими становятся!
Ответить с цитированием
  #5  
Старый 09.06.2015, 19:47
lmikle lmikle вне форума
Модератор
 
Регистрация: 17.04.2008
Сообщения: 8,003
Версия Delphi: 7, XE3, 10.2
Репутация: 49089
По умолчанию

поищи в инете, может есть Edit с задержкой вызова OnChange
Ответить с цитированием
  #6  
Старый 09.06.2015, 19:49
Аватар для Страдалецъ
Страдалецъ Страдалецъ вне форума
Гуру
 
Регистрация: 09.03.2009
Адрес: На курорте, из окна вижу теплое Баренцево море. Бррр.
Сообщения: 4,721
Репутация: 52347
По умолчанию

Еще неплохо бы ограничивать количество результатов при таком запросе. Скажем 100 первых результатов более чем достаточно. Ну а мерцание должно уйти если включить буферизацию.
__________________
Жизнь такова какова она есть и больше никакова.
Помогаю за спасибо.
Ответить с цитированием
Этот пользователь сказал Спасибо Страдалецъ за это полезное сообщение:
gewasop (14.06.2015)
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

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

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 14:50.


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2023

ВКонтакте   Facebook   Twitter