Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Delphi [игнор отключен] [закрыт для гостей] / STFilter без нажатия на Enter / 15 сообщений из 15, страница 1 из 1
26.02.2019, 10:25
    #39779170
aford
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
STFilter без нажатия на Enter
Как сделать, чтобы при вводе символов в фильтр он автоматом применялся?
+ нужно использовать нестрогий поиск, т.е. чтобы в условие автоматом добавлялись %
Поиск по форумам не дал результатов.
...
Рейтинг: 0 / 0
26.02.2019, 10:53
    #39779191
aford
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
STFilter без нажатия на Enter
Использую связку 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
26.02.2019, 12:37
    #39779250
aford
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
STFilter без нажатия на Enter
Вот так даже проще сделать неточный поиск
Код: 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
26.02.2019, 13:40
    #39779281
Близнец1980
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
STFilter без нажатия на Enter
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
26.02.2019, 14:08
    #39779308
aford
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
STFilter без нажатия на Enter
Близнец1980, это немного разные вещи, мне нужно именно через фильтры, не буду же я панель поиска вешать на каждый столбец...
...
Рейтинг: 0 / 0
26.02.2019, 17:22
    #39779462
Близнец1980
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
STFilter без нажатия на Enter
afordБлизнец1980, это немного разные вещи, мне нужно именно через фильтры, не буду же я панель поиска вешать на каждый столбец...
и не надо, gssEntireGridEh – Поиск во всем гриде - чем не устроил?
одна SearchPanel фильтрует сразу весь грид.
FilterOnTyping = true, FilterEnabled = True, SearchScope = gssEntireGridEh.
EhLib 9.3.
...
Рейтинг: 0 / 0
26.02.2019, 17:45
    #39779480
aford
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
STFilter без нажатия на Enter
Близнец1980, а если нужно найти какое-то значение в одном столбце, потом в другом?
...
Рейтинг: 0 / 0
26.02.2019, 19:01
    #39779501
Близнец1980
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
STFilter без нажатия на Enter
afordБлизнец1980, а если нужно найти какое-то значение в одном столбце, потом в другом?
aford не буду же я панель поиска вешать на каждый столбец...
Это "немного" не то, что было в начале
afordКак сделать, чтобы при вводе символов в фильтр он автоматом применялся?
Вы уж определитель что нужно-то
...
Рейтинг: 0 / 0
27.02.2019, 12:27
    #39779717
Arioch
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
STFilter без нажатия на Enter
aford,

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

почему это?

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

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

Код с комментариями
Код: 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
28.02.2019, 10:56
    #39780238
wadman
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
STFilter без нажатия на Enter
aford,

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

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

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

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


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