zilav Posted April 28, 2021 Share Posted April 28, 2021 Уважаемый Шерзод, есть пара вопросов. Я реализовал свои алгоритмы фильтрации в гриде, так как у тех же дат например есть готовые шаблоны типа "прошлый месяц" я убрал автоматическую фильтрацию и оставил включение фильтрации по нажатию Enter. На uniEdit выводится значок очистки, но он он только очищает значение контрола, а Enter приходится нажимать руками. Соответственно первый вопрос, как можно перехватить очистку контрола и сделать помимо очистки еще и принудительное нажатие Enter? Вопрос второй, при наложении фильтра в гриде есть значок сброса фильтра, но он опять же только чистит значение контролов-фильтров, но при этом Enter опять же приходится нажимать самому. Как перехватить нажатие на эту очистку фильтров и тоже сделать нормальную полную автоматическую очистку фильтров? Quote Link to comment Share on other sites More sharing options...
Sherzod Posted April 28, 2021 Share Posted April 28, 2021 Здравствуйте, procedure TMainForm.UniDBGrid1ClearFilters(Sender: TObject); begin // end; ? Quote Link to comment Share on other sites More sharing options...
Tokay Posted May 3, 2021 Share Posted May 3, 2021 Какой у вас интересный фильтр по date range, так стандартные умеют как-то делать? Quote Link to comment Share on other sites More sharing options...
zilav Posted May 5, 2021 Author Share Posted May 5, 2021 Нет, я сам себе написал универсальный хелпер к гриду, он позволяет цеплять вот типа таких фильтров на разные типы полей, там по идее даже смешнее есть фильтры на дату, "вчера", "прошлая неделя", "прошлый месяц" и т.д. Для нумерик полей поддерживается запись диапазонов тоже например "2-7,62" (от 2.00 до 7.62). Для чекбокс полей 2 тоже свой фильтр, позволяет задать значения которые будут отображаться в комбобоксе фильтра для true и false, ну или 0 и 1 (мало ли поле не типа ftBoolean). Quote Link to comment Share on other sites More sharing options...
zilav Posted May 5, 2021 Author Share Posted May 5, 2021 Сейчас вот сижу и думаю как бы на кнопку очистки еще и нажатие кнопки Enter сразу прибить, а то получается что я нажимаю кнопку очистки у контрола, но фильтр по факту не сбрасывается, а только очищается, для сброса приходится ставить курсор в контрол и руками Enter нажимать. Пока по форуму нашел либо вот этот вариант UniEdit1.JSInterface.JSCode(#1'.plugins.forEach(function(p) {if (p.alias[0] == "plugin.clearbutton") {p.clearButtonEl.dom.click()}});'); либо вообще вешаться на триггер и делать уже на сервере, как описано тут Trigger ClearButton - General - uniGUI Discussion Forums но тут посути лишний раз сервер дергаться будет, поэтому первый вариант выполняющийся прямо на сервере предпочтительнее. Quote Link to comment Share on other sites More sharing options...
Sherzod Posted May 5, 2021 Share Posted May 5, 2021 2 minutes ago, zilav said: Сейчас вот сижу и думаю как бы на кнопку очистки еще и нажатие кнопки Enter сразу прибить, а то получается что я нажимаю кнопку очистки у контрола, но фильтр по факту не сбрасывается, а только очищается, для сброса приходится ставить курсор в контрол и руками Enter нажимать. Здравствуйте, Простите, уточните пожалуйста. Quote Link to comment Share on other sites More sharing options...
zilav Posted May 5, 2021 Author Share Posted May 5, 2021 1 minute ago, Sherzod said: Здравствуйте, Простите, уточните пожалуйста. У TUniEdit контролов вставляемых в качестве фильтра я отключит автоматическую фильтрацию, так как пользователи не всегда сходу быстро способны набрать значения фильтров типа "прошлая неделя" или "01.01.2021-01.01.2021", ошибки нажатий и все такое. Именно поэтому автоматическая фильтрация в процессе набора строки фильтра отключена, и включается по четкому нажатию Enter. Но при этом проявляется эффект при котором стандартная кнопка очистки фильтра просто очищает значение контрола, но так как фильтр начинает отрабатывать только после нажатия Enter, то визуально контрол фильтра очищен, но без нажатого Enter не включается. Поэтому и хочется чтобы стандартная кнопка очистки не только очищала контрол но и автоматом нажимала бы Enter для отработки фильтра. Контролы для фильтров у меня создаются автоматом, например вот для даты function TUniDbGridHelper.CreateFilter_Date(ParentPanel: TUniHiddenPanel; FieldName: string): TUniEdit; var col: TUniBaseDbGridColumn; ds: TDataset; begin col:= self.Columns.ColumnFromFieldName(FieldName); ds:= self.DataSource.DataSet; result := TUniEdit.Create(ParentPanel); Result.Name:= 'edtFilter_'+FieldName; result.Parent := ParentPanel; Result.CharEOL:= #13; result.ClearButton := True; col.Filtering.ChangeDelay:= 800; col.Filtering.Editor:= Result; col.Filtering.Enabled:= true; end; Вот этот самый Result.CharEOL:= :13 фактически отключает автофильтр и делает его включение строго на Enter Quote Link to comment Share on other sites More sharing options...
Sherzod Posted May 5, 2021 Share Posted May 5, 2021 Я проанализирую. Quote Link to comment Share on other sites More sharing options...
Sherzod Posted May 5, 2021 Share Posted May 5, 2021 55 minutes ago, zilav said: но без нажатого Enter не включается. Попробуйте такое решение: UniDBGrid -> ClientEvents -> ExtEvents -> function reconfigure(sender, store, columns, oldStore, oldColumns, eOpts) { columns.forEach(function(col) { if (col.fedit && col.fedit.getTriggers() && col.fedit.getTriggers().clear) { col.fedit.getTriggers().clear.el.addListener('click', function(event) { event.keyCode = 13; col.fedit.fireEvent('keydown', col.fedit, event); }) } }); } 1 Quote Link to comment Share on other sites More sharing options...
zilav Posted May 6, 2021 Author Share Posted May 6, 2021 Шерзод, работает, огромное спасибо, пользователи начали лепить вашу скульптуру из папье-маше в натуральную величину Пара доп. вопросов если можно: Работает при задании в дизайн-тайме, перевешивание на добавление в рантайме к сожалению сходу не работает, это вообще возможно технически? Очистка работает на каждой колонке отдельно, но есть еще кнопка полной очистки фильтров, появляющаяся при включенном фильтре, на ней все осталось по-старому, очищаются только сами контролы фильтров, без отработки нажатия Enter, туда встроить нажатие можно? Quote Link to comment Share on other sites More sharing options...
Sherzod Posted May 6, 2021 Share Posted May 6, 2021 5 minutes ago, zilav said: Работает при задании в дизайн-тайме, перевешивание на добавление в рантайме к сожалению сходу не работает, это вообще возможно технически? Должно работать. 5 minutes ago, zilav said: Очистка работает на каждой колонке отдельно, но есть еще кнопка полной очистки фильтров, появляющаяся при включенном фильтре, на ней все осталось по-старому, очищаются только сами контролы фильтров, без отработки нажатия Enter, туда встроить нажатие можно? Я проанализирую. 6 minutes ago, zilav said: пользователи начали лепить вашу скульптуру из папье-маше в натуральную величину 😂 Quote Link to comment Share on other sites More sharing options...
zilav Posted May 6, 2021 Author Share Posted May 6, 2021 3 minutes ago, Sherzod said: 10 minutes ago, zilav said: пользователи начали лепить вашу скульптуру из папье-маше в натуральную величину 😂 Я бы сильно не рассчитывал, меня они тоже начинали так лепить, а сейчас смотрю на столах только мои куклы вуду, утыканные острыми предметами Quote Link to comment Share on other sites More sharing options...
Sherzod Posted May 6, 2021 Share Posted May 6, 2021 10 minutes ago, zilav said: Очистка работает на каждой колонке отдельно, но есть еще кнопка полной очистки фильтров, появляющаяся при включенном фильтре, на ней все осталось по-старому, очищаются только сами контролы фильтров, без отработки нажатия Enter, туда встроить нажатие можно? Вы должны обработать это событие, примерно как в демо: procedure TMainForm.UniDBGrid1ClearFilters(Sender: TObject); var I : Integer; begin if UniMainModule.ADOQuery1.Active then begin for I := 0 to UniMainModule.ADOQuery1.Parameters.Count-1 do UniMainModule.ADOQuery1.Parameters[I].Value:='%%'; UniMainModule.ADOQuery1.Requery; end; end; Quote Link to comment Share on other sites More sharing options...
zilav Posted May 6, 2021 Author Share Posted May 6, 2021 да, reconfigure нормально задал в рантайме, изначально неверно завал. Надо было через AddPair reconfigure:= 'function reconfigure(sender, store, columns, oldStore, oldColumns, eOpts)'+ '{'+ ' columns.forEach(function(col) {'+ ' if (col.fedit && col.fedit.getTriggers() && col.fedit.getTriggers().clear) {'+ ' col.fedit.getTriggers().clear.el.addListener(''click'', function(event) {'+ ' event.keyCode = 13;'+ ' col.fedit.fireEvent(''keydown'', col.fedit, event);'+ ' })'+ ' }'+ ' });'+ '}'; Self.ClientEvents.ExtEvents.AddPair('reconfigure',reconfigure); Quote Link to comment Share on other sites More sharing options...
Sherzod Posted May 6, 2021 Share Posted May 6, 2021 33 minutes ago, zilav said: Я бы сильно не рассчитывал, меня они тоже начинали так лепить, а сейчас смотрю на столах только мои куклы вуду, утыканные острыми предметами Quote Link to comment Share on other sites More sharing options...
Tokay Posted May 6, 2021 Share Posted May 6, 2021 22 hours ago, zilav said: Нет, я сам себе написал универсальный хелпер к гриду, он позволяет цеплять вот типа таких фильтров на разные типы полей, там по идее даже смешнее есть фильтры на дату, "вчера", "прошлая неделя", "прошлый месяц" и т.д. Для нумерик полей поддерживается запись диапазонов тоже например "2-7,62" (от 2.00 до 7.62). Для чекбокс полей 2 тоже свой фильтр, позволяет задать значения которые будут отображаться в комбобоксе фильтра для true и false, ну или 0 и 1 (мало ли поле не типа ftBoolean). какая красота может быть есть возможность/желание оформить паком код на продажу? приобрели бы за какие-то разумные деньги. да и, думаю, было бы интересно многим Quote Link to comment Share on other sites More sharing options...
zilav Posted May 7, 2021 Author Share Posted May 7, 2021 Да ладно, я и так поделюсь, только чур не смеяться, код писался под себя и по качеству ближе всего находится к понятию "гов...код" Доделать под себя никаких проблем нет, я там старался как можно проще в лоб все решать, да и доделал еще только вчера. В общем кину в личку, вроде тут очереди особой нет, а мне по идее все равно стыдно. Там попутно в хелпере еще пара функций для сохранения/восстановления настроек колонок в json. Использовать так, в создание формы пишем grd.InstallFilters; grd.CreateFilter_String(hidden,'fldString'); // просто TUniEdit с поиском вхождения подстроки grd.CreateFilter_Combobox(hidden,'fldCombobox'); // TUniCombobox, заполняется содержимым самого поля grd.CreateFilter_Date(hidden,'fldDateTime'); // TUniEdit с поддержкой диапазона дат и значений: сегодня, вчера, завтра, текущая неделя, прошлая неделя, следующая неделя, прошлый месяц, текущий месяц, следующий месяц, текущий год, прошлый год + дописать любые обработчики типа тех же кварталов никаких проблем нет grd.CreateFilter_Float(hidden,'fldFloat'); // TUniEdit с поддержкой диапазона, т.е можно написать и 2.34 и 2-10.34 grd.CreateFilter_Boolean(hidden,'fldBool','Нет','Да'); // TUniCombobox с 2 значениями для true и false, поле должно быть типа ftBoolean grd.CreateFilter_Boolean(hidden,'fldBoolInt','-','+'); // посути предыдущий фильтр но работает с ftInteger 0/1 Так же гриду добавляется свойство JSON, соответственно чтение/запись настроек колонок На уничтожение формы просто добавляем grd.RemoveFilters; Quote Link to comment Share on other sites More sharing options...
zilav Posted May 7, 2021 Author Share Posted May 7, 2021 Планирую добавить еще пару типов фильтров 1) фильтр TUniCombobox с поддержкой заполнения из другого датасета для работы на лукап полях 2) фильтр для чекбоксов, но чтобы значения анализировались не из текущего поля, а из другого поля датасета, а то у меня есть поля в одном из которых нормально 0/1, а поле которое отображается в самом гриде, представляет собой сформированный html с иконками Quote Link to comment Share on other sites More sharing options...
Tokay Posted May 7, 2021 Share Posted May 7, 2021 Ок, благодарю. Посмотрю что там как. Quote Link to comment Share on other sites More sharing options...
Recommended Posts
Join the conversation
You can post now and register later. If you have an account, sign in now to post with your account.