powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Delphi [игнор отключен] [закрыт для гостей] / STFilter без нажатия на Enter
15 сообщений из 15, страница 1 из 1
STFilter без нажатия на Enter
    #39779170
aford
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Как сделать, чтобы при вводе символов в фильтр он автоматом применялся?
+ нужно использовать нестрогий поиск, т.е. чтобы в условие автоматом добавлялись %
Поиск по форумам не дал результатов.
...
Рейтинг: 0 / 0
STFilter без нажатия на Enter
    #39779191
aford
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Использую связку MemTable + DataSourse + DBgridEh
В Memtable в Options -> mtoTextFieldsCaseInsensitive ставим в True, перекрываем метод
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
procedure TCustomDBGridEh.SetFilterValue(DCol: Integer);
begin // при нажатии на Enter
  ReplaceStr(FilterEdit.Text, '%', '');
  if FilterEdit.Text = '' then
    Exit;
  FilterEdit.Text:= '%' + FilterEdit.Text + '%';
  inherited;
end;

- не строгий поиск работает.
Как сделать поиск без Enter так и не нашел, вопрос остается открытым
...
Рейтинг: 0 / 0
STFilter без нажатия на Enter
    #39779250
aford
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Вот так даже проще сделать неточный поиск
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
procedure TForm1.DBGridEh1ApplyFilter(Sender: TObject);
begin
  with DBGridEh1 do
  begin
    if Columns[Col - 1].Field.DataType in [ftWideString, ftString] then
      MemTableEh1.Filter:= Columns[Col - 1].FieldName + ' like ''%' + FilterEdit.Text + '%'''
    else
      if Columns[Col - 1].Field.DataType in [ftSmallint, ftInteger, ftWord, ftBoolean,
          ftFloat, ftCurrency, ftBCD, ftDate, ftTime, ftDateTime] then
          MemTableEh1.Filter:= Columns[Col - 1].FieldName + ' = ' + FilterEdit.Text;
  end;
  //DBGridEh1.DefaultApplyFilter();
end;


Вопрос быстрым фильтром так и не решен
...
Рейтинг: 0 / 0
STFilter без нажатия на Enter
    #39779281
Близнец1980
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
aford,

Да ничего мудрить не надо, настроить только правильно TDBGridEh.SearchPanel.
Документацию не читали?


property FilterOnTyping: Boolean
Определяет, что грид будет фильтровать данные по мере ввода текста в редакторе текста панели поиска. Если FilterOnTyping = False, то данные будут фильтроваться только по нажатию на клавишу «Enter» или кнопку «применить фильтр» на панели поиска.

property FilterEnabled: Boolean
Определяет, что фильтрация доступна в панели поиска. Если FilterOnTyping = False, то в панели поиска будет доступен только писк текста

property OptionsPopupMenuItems: TDBGridSearchPanelOptionsMenuItemsEh
Задает список элементов выпадающего меню, которое отображается по кнопке «…» (Опции поиска) в SearchPanel’е.
Тип TDBGridSearchPanelOptionsMenuItemsEh может содержать следующие значения
gsmuSearchScopesEh – Область поиска.
gsmuCaseSensitiveEh – Искать с учетом регистра текста.
gsmuWholeWordsEh – Искать по полному слову.
gsmuBeginsWithEh – Искать с начала ячейки.

property SearchScope: TDBGridSearchPanelScopeEh
Задает вариант области поиска который работает по умолчанию в SearchPanel’е.
Свойство может принимать одно из следующих значений:
gssCurrentColumnEh – Поиск в текущем столбце.
gssEntireGridEh – Поиск во всем гриде.

property CaseSensitive: Boolean
Задает зависимость регистра текста при поиске в SearchPanel’е.

property WholeWords: Boolean
Указывает, что поиск в SearchPanel’е должен выполнятся по полным словам.

property CellBeginsWithMode: Boolean
Указывает, что поиск в SearchPanel’е должен выполнятся с начала ячейки.

...
Рейтинг: 0 / 0
STFilter без нажатия на Enter
    #39779308
aford
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Близнец1980, это немного разные вещи, мне нужно именно через фильтры, не буду же я панель поиска вешать на каждый столбец...
...
Рейтинг: 0 / 0
STFilter без нажатия на Enter
    #39779462
Близнец1980
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
afordБлизнец1980, это немного разные вещи, мне нужно именно через фильтры, не буду же я панель поиска вешать на каждый столбец...
и не надо, gssEntireGridEh – Поиск во всем гриде - чем не устроил?
одна SearchPanel фильтрует сразу весь грид.
FilterOnTyping = true, FilterEnabled = True, SearchScope = gssEntireGridEh.
EhLib 9.3.
...
Рейтинг: 0 / 0
STFilter без нажатия на Enter
    #39779480
aford
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Близнец1980, а если нужно найти какое-то значение в одном столбце, потом в другом?
...
Рейтинг: 0 / 0
STFilter без нажатия на Enter
    #39779501
Близнец1980
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
afordБлизнец1980, а если нужно найти какое-то значение в одном столбце, потом в другом?
aford не буду же я панель поиска вешать на каждый столбец...
Это "немного" не то, что было в начале
afordКак сделать, чтобы при вводе символов в фильтр он автоматом применялся?
Вы уж определитель что нужно-то
...
Рейтинг: 0 / 0
STFilter без нажатия на Enter
    #39779717
Arioch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
aford,

TTimer
...
Рейтинг: 0 / 0
STFilter без нажатия на Enter
    #39779738
aford
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Arioch, я определился еще в начале, т.к. писал сразу про фильтр, а не про панель поиска)
Таймер вообще не выход
...
Рейтинг: 0 / 0
STFilter без нажатия на Enter
    #39779761
Arioch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
afordТаймер вообще не выход

почему это?

у меня в одном самописном конструкторе автоматический перезапуск поиска именно по таймеру

причём каждый пользователь настраивает задержку под себя, кто быстрее тарабанит, кто медленнее
...
Рейтинг: 0 / 0
STFilter без нажатия на Enter
    #39780057
aford
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Arioch, я согласен, можно с таймером, но у меня сегодня получилось как я хотел. Буду за компом - скину код. Только появилась другая проблема, уже создал новую ветку..
...
Рейтинг: 0 / 0
STFilter без нажатия на Enter
    #39780232
aford
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Решение. Уверен, что кому-то пригодится, т.к. вопросов на форумах много, а ответов нет. Можно, конечно, сделать поизящнее, но мне и так нравится) Код объявления перекрытых методов не приводил, думаю не сложно разобраться.

Код с комментариями
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
procedure TFrmMain.DBGrdEhWeightsApplyFilter(Sender: TObject);

function LastPos(SubStr, S: string): Integer;
 var
   Found, Len, Pos: integer;
 begin
   Pos:= Length(S);
   Len:= Length(SubStr);
   Found:= 0;
   while (Pos > 0) and (Found = 0) do
   begin
     if Copy(S, Pos, Len) = SubStr then
       Found:= Pos;
     Dec(Pos);
   end;
   LastPos:= Found;
 end;

var
  s, FText: string;
  i: integer;
begin
  s:= '';
  with (Sender as TDBGridEh) do
    for i:= 0 to Columns.Count - 1 do
      if Columns[i].STFilter.ExpressionStr <> '' then
      begin
        if i = (Col-1) then
          FText:= FilterEdit.Text  // текущая колонка
        else
          FText:= Columns[i].STFilter.ExpressionStr; // все остальные колонки
        // Если фильтр выбран мышкой (Ehlib сам подставляет)
        if ((FText[1] = '=') and // одно значение
           (FText[2] = '''') and
           (FText[Length(FText)] = '''')) or
           ((FText[1] = 'i') and // несколько
           (FText[2] = 'n') and
           (FText[4] = '(') and
           (FText[Length(FText)] = ')')) then
          s:= s + Columns[i].FieldName + ' ' + FText + ' and '
        else // во всех остальных случаях (при вводе руками)
        begin
          if Columns[i].Field.DataType in [ftWideString, ftString] then
            s:= s + Columns[i].FieldName + ' like ''%' + FText + '%'' and '
          else
            if Columns[i].Field.DataType in [ftSmallint, ftInteger, ftWord, ftBoolean,
              ftFloat, ftCurrency, ftBCD, ftDate, ftTime, ftDateTime] then
              s:= s + Columns[i].FieldName + ' = ' + FText + ' and ';
        end;
      end;
  if LastPos(' and ', s) = Length(s) - 4 then
    Delete(s, Length(s) - 4, Length(s) - 4); // удаляем ' and ', если он есть в конце
  MTWeights.Filter:= s;
  actCancelFilterWeights.Enabled:= MTWeights.Filter <> '';
  //DBGridEh1.DefaultApplyFilter();
end;

procedure TCustomDBGridEh.InplaceEditKeyDown(Control: TWinControl;
  var Key: Word; Shift: TShiftState);
begin
  if (Key = VK_TAB) then
  begin
    FilterEdit.Text:= ReplaceStr(FilterEdit.Text, FilterEdit.SelText, '');
    ApplyFilter; // применяем фильтр
  end;
  inherited;
end;

procedure TCustomDBGridEh.InplaceEditKeyUp(Control: TWinControl; var Key: Word;
  Shift: TShiftState);
begin
  if {Какое-то условие в настройках на автофильтр} True and
     (Key <> VK_TAB) then
  begin
    // убираем выделение
    FilterEdit.Text:= ReplaceStr(FilterEdit.Text, FilterEdit.SelText, '');
    // применяем фильтр
    ApplyFilter;
    // позиция курсора в фильтре
    FilterEdit.SelStart:= Length(FilterEdit.Text);
  end;
  inherited;
end;


...
Рейтинг: 0 / 0
STFilter без нажатия на Enter
    #39780238
Фотография wadman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
aford,

а я-бы вынес активацию фильтра по таймеру с задержкой на 500 мс, чтоб при наборе фильтр не успевал лишний раз сработать.
...
Рейтинг: 0 / 0
STFilter без нажатия на Enter
    #39780259
Arioch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
wadman,

задержку лучше настраивать. Для меня комфортная задержка - от 0.250 до 0.333 секунды, например, у всех своя

ну и аккуратно продумать "конечный автомат", чтобы себе на пятки не наступать.

зато потом можно его таскать в любую форму с небольшими изменениями
...
Рейтинг: 0 / 0
15 сообщений из 15, страница 1 из 1
Форумы / Delphi [игнор отключен] [закрыт для гостей] / STFilter без нажатия на Enter
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]