Ru-Board.club
← Вернуться в раздел «Прикладное программирование»

» Использование DevExpress (часть 4)

Автор: reenoip
Дата сообщения: 14.05.2016 12:34
Ещё вопрос: есть dxToggleSwitch1. Одинарный клик обрабатывает хорошо, но я хочу запретить двойной клик (так нужно), а то он порой жёстко обламывает уже активированное действо:



Есть идеи, как можно сделать это? Куда этот dxToggleSwitch1.OnDblClick(nil) засунуть, чтобы он AV не вызывал...
Автор: reenoip
Дата сообщения: 18.05.2016 11:43

Цитата:
Есть идеи, как можно сделать это?

Пришлось сделать по-старому:


Цитата:
procedure TForm1.ApplicationEventsMessage(var MSG: tagMSG;
var Handled: Boolean);
begin
if MSG.Message=WM_LBUTTONDBLCLK then if MSG.Hwnd=dxToggleSwitch1.Handle then Handled := True;
end;


Однако, в исходниках так и не смог найти скорость анимации переключения самого тумблера. Если кто в курсе этого секрета - поделитесь, пожалуйста. Я было думал, что это оно, но я ошибся:

\ExpressEditors Library\Sources\dxToggleSwitch.pas:

Цитата:
procedure TdxCustomToggleSwitch.StartAnimation;
begin
FTimer := TcxTimer.Create(nil);
FTimer.Interval := 10;
FTimer.OnTimer := TimerHandler;
end;
Автор: vavavol
Дата сообщения: 19.05.2016 16:16
Добрый день! Не подскажете, как изменить строку версии девок при загрузке IDE (заставка)? Скачал у китайцев, все %Str.pas поправил, но при запуске IDE пишет что-то типа "DevExpress VCL 2015.2.2" плюс кракозяблики. Заранее благодарен за ответ

Добавлено:
Да, забыл. Версия IDE XE10.1 Berlin
Автор: Cryogen2003
Дата сообщения: 24.05.2016 19:30
Приветствую. Есть идея у заказчика, но я не совсем понимаю как можно быстро ее решить.

Есть форма, на которой валяется компонент TcxDBFilterControl. К нему привязана табличка (TkbmMemTable), в которой нужные поля находятся, некоторые из них лукап поля (все это начитывается на основе справочников, где в зависимости от отчета подставляются эти поля, их типы, если это лукап поля, то идет селект с справочником для этого лукапа, и т.д.).
Все это написано, уже работает в продакшене, вроде все ок.

У заказчика следующая идея и я пока в думах, не совсем понимаю как это решить.
Идея в том, что бы у любого элемента этого дерева в TcxDBFilterControl можно было проставлять какое-то число в дополнении (то есть рядом со стандартным элементом (типа лукапа, редакторов строки, даты, числа) был бы еще какой-то элемент (пока не решено точно какой) для ввода числа (например от 0 до 100)).
Это бы обозначало "силу" этого элемента фильтра.
Правда пока заказчик до конца еще не придумал как все это считать (ну например если используется две группы в фильтре, но в одной группе эта "сила" больше, чем в другой. И что при этом делать), но думаю от самой идеи он не откажется и выполнять придется
Автор: ChSerg
Дата сообщения: 24.05.2016 23:31
Cryogen2003
Если задан элемент фильтра, то он на все 100 включен в фильтр.
Как можно включить элемент фильтра на 80%, например?
Автор: Dronton2
Дата сообщения: 25.05.2016 10:05
Cryogen2003
Непонятно, что хочет заказчик.
Может быть, он хочет упорядочить вывод в зависимости от веса полей?
Например, ставим полю A вес 100, полю B вес 20 и полю C вес 80.
Тогда В начале списка будут записи, у которых все поля удовлетворяют условию, затем - поля A и C удовлетворяющие условию, и затем - только поля А удовлетворяющие условию. (т.е., упорядочивать по сумме весов: если условие для поля выполнено, то добавлять его вес в общий вес для сортировки).
Я правильно понял? В этом случае, все поля в условии должны быть связаны условием "И", и древовидный фильтр не нужен.
Автор: Cryogen2003
Дата сообщения: 25.05.2016 10:41
Dronton2
ChSerg
Объясню по другому, благо вчера совещание с ним устроил.
Нужен древовидный список со всеми возможными И и ИЛИ, с группами и так далее. Под его условия подойдет только TcxFilterControl или TcxDBFilterControl.
Есть куча условий, количество этих условий может быть очень большим. У каждого из этих условий нужно проставлять "силу" (вес - кому что нравится) этого условия или приоритет (критический, очень важный, важный, не важный и т.д.). Обычно может быть только что-то одно - либо сила, либо приоритет.

В итоге при запуске этого "отчета" - все эти элементы фильтра создают селект и он выполняется в Oracle.
Потом выполняется анализ "силы" или приоритета для каждой отфильтрованной записи.
В первом случае это сумма всех элементов по силе (если есть группы, то сумма всех элементов в группе и потом в зависимости от того было "и" или "или") и если эта общая сила отфильтрованной строки больше или равна, чем определенное значение для выполнения конкретно этого отчета, то запись отмечается особым образом и отправляется куда следует (стучится в органы), если же меньше, то на выбор оператора.
Во втором случае - это так же анализ каждого элемента в фильте или группе (если они есть, хотя думаю они будут всегда). Считается так же сумма (каждый приоритет имеет определенный вес) и выводится все это счастье оператору. Причем наиболее критические записи сразу обрабатываются системой и "стучится" куда надо, менее критические оператор обрабатывает, анализирует и сам решает, нужно ли стучать на эту запись или нет.

Итог:
сделано все, кроме силы (веса) и приоритетов. Не знаю как можно это реализовать быстро и в тоже время удобно для оператора (пользователя). Конечно не очень хотелось бы переделывать компонент от девок, но возможно придется.

Хочется максимально автоматизировать этот процесс, чтобы оператору чутка меньше работы было, да и мне каждый раз переписывать селекты и хранимки на PL/SQL на критичные вещи не хочется. Хочется все правила (фильтры) в нормальном интерфейсе забить для каждого типа отчета и не парится.

Сейчас это выглядит так:



Автор: Dronton2
Дата сообщения: 25.05.2016 13:56
Cryogen2003
Как бы не пришлось свой собственный компонент писать с нуля.

Цитата:
сделано все, кроме силы (веса) и приоритетов
. Как я понимаю, select не возвращает вес записи? Тогда нужно проходить вручную каждой возвращенной записью по фильтру и вычислять вес.
Не проще будет для работы с таким фильтром использовать DBTreeList?
В первом поле показывать кнопку "Фильтр", "..." и т.п.
Во втором поле - название поля БД или "И" или "ИЛИ", в зависимости от типа данной записи
В третьем поле - операцию (равно, не равно и т.п.)
В четвертом поле - значение (или список значений) в зависимости от операции из третьего поля и типа поля БД из второго поля. (использовать для этого поля OnGetEditProperties)
В пятом поле - указывать вес.
Т.к. фильтр будет храниться в виде записей таблицы БД, то формировать условие для селекта можно, как на клиенте, так и на стороне БД в хранимой процедуре.
А возможно, что и вес можно будет вычислять на стороне БД. и возвращать в результате запроса.
Автор: Cryogen2003
Дата сообщения: 25.05.2016 14:35
Dronton2
Сейчас да, вес записи конечно не возвращает. Можно конечно забить в справочники вес записи, но в том то и смысл, что например "счет клиента" в зависимости от его синтетики может быть разным по весу. И из-за этого хотелось сделать нормальную настройку, чтобы одно из полей было именно значением (без разницы, что это - поле для текстового ввода, поле для выбора даты, поля для выбора в лукапе, а так же что это поле внутри группы или входит в тип in или not in.


Цитата:
Не проще будет для работы с таким фильтром использовать DBTreeList?

нет, не проще.
По моему сейчас работает практически идеально, ну акромя проблемы, что нужно будет как то добавлять поле, о котором сказал
Автор: Dronton2
Дата сообщения: 25.05.2016 15:53
Cryogen2003

Цитата:
сейчас работает практически идеально, ну акромя
акромя того, что не даёт правильного результата, и мы не знаем, как этого результата добиться. У нас с вами разные представления об практической идеальности .

имхо:
Oracle хорошо работает с древовидными структурами. Храня фильтр в таблице, в виде набора записей (одно примитивное условие на запись), фильтр легко отдавать запросом из БД клиенту в любом красивом виде: хоть в виде текста с нужными отступами, хоть в формате HTML или XML, с дальнейшей доработкой.
Если использовать DBTreeList:
- не нужно курочить исходники TcxDBFilterControl, при выходе новой версии DevExpressа не нужно их перекурочивать, и при выходе очередной версии DevExpressа внезапно обнаружить, что теперь проще сделать что-то своё, чем разбираться с самого начала с их компонентом (я с этим уже сталкивался)
- функциональность DBTreeList описана в официальной документации - если будут что-то менять, то должны будут описать, как пользоваться изменениями
- неизвестно, как заказчик захочет доработать эту систему фильтров. С простой древовидной структурой, которой вы можете распоряжаться, как хотите, вы можете делать, что хотите: добавить большое количество полей разного типа и т.п. С существующим TcxDBFilterControl это сделать сложнее: нужно менять вычисления размеров полос прокрутки, отрисовку на канве и т.п.
- алгоритм вычисления веса - это алгоритм обхода дерева фильтра. Если использовать TcxDBFilterControl, то сначала нужно написать парсер текста фильтра, который построит дерево и определит тип полей. Если в БД уже хранится это дерево в удобном виде, то парсер писать не нужно.

В общем, я о том, что используя DBTreeList, уже сейчас можно оценить объём работ для решения задачи. И объём работ для развития этого проекта. Может быть, он будет не так красиво выглядеть, как TcxDBFilterControl, но он будет давать нужный результат.
Используя TcxDBFilterControl, мы в данное время не знаем, что нужно делать, и сколько времени на это уйдёт, и сколько это будет стоить. Дать ответы на эти вопросы можно только после тщательного изучения исходников компонентов фильтра.
Автор: Cryogen2003
Дата сообщения: 25.05.2016 17:01
Dronton2
Я с Вами согласен, но придется тогда придумывать как реализовать группы и вещи типа IN и NOT IN.
То есть в любом случае придется переделывать DBTreeList и по полной, если решу отказаться от FilterControl.
Либо дорабатывать напильником текущую реализацию, что не очень хочется.

В итоге и то, и другое дорабатывать по полной.


Цитата:
Oracle хорошо работает с древовидными структурами.

Не спорю, хорошо умеет работать с ними, можно даже хранить nested table. Но не в моем случае, так как плавали - знаем. Когда записей не слишком много, все отлично работает. Когда в день может быть 4-50 миллионов записей, то работает не так, как хочется. Да и существующую структуру никто не захочет менять.
Или ты имел в виду хранить дерево конкретно только фильтра? Если да, то примерно так и хранит. Но выполняется не дерево, а конкретно уже собранный селект со всеми установленными переменными.

На тему хранения в БД - сейчас хранится в блобе бинарник фильтра компоненты и собранный селект, который собирается пробежкой по компоненте FilterControl.
Автор: Dronton2
Дата сообщения: 26.05.2016 10:34
Cryogen2003

Цитата:
Или ты имел в виду хранить дерево конкретно только фильтра?
Именно это имел ввиду.

Цитата:
как реализовать группы и вещи типа IN и NOT IN
Это несложно реализуется выпадающим окном со списком, который можно редактировать/добавлять/удалять.
А вот что вы будете делать, если заказчик, например, потребует по отдельному строковому полю делать регистронезависимое сравнение, а по другим полям регистрозависимое? В TreeList просто добавляете колонку с настройками. И для разных типов полей пользователь будет выбирать свои настройки: для строк - преобразовывать в upper или нет, для чисел - например округление перед сравнением
Или если потребуется фильтровать поля не по константам. Например, отбирать записи, у которых номер счёта плательщика равен номеру счёта получателя. В TreeList я знаю, как это сделать. В FilterControl - не знаю, но думаю, что переделывать его придётся кардинально.

Да и постоянно копаться в чужом недокументированном коде, который будет обязательно периодически меняться без согласования с вами - "ни дай бог никому"(с)
В любом случае - посмотрите, что содержат исходники FilterControl. Даже если будете писать свой компонент - может быть, возьмёте какие-то их идеи.

Автор: Cryogen2003
Дата сообщения: 26.05.2016 13:02
Dronton2
Вообщем попробую что-то похожее реализовать.
Просто придется еще примерно такой же интерфейс реализовывать, как есть сейчас. К сожалению пользователи это макаки, а часто бывает, что макаки с гранатой. Их сложно переучить
Автор: Marcello_TLT
Дата сообщения: 26.05.2016 17:40
Подскажите, как в TcxPivotGrid определить число включенных флажков у определенного поля? На приведенной картинке 3 флажка, остальные не используются из-за фильтров на других полях.
Автор: vavavol
Дата сообщения: 03.06.2016 13:19
Добрый день! Не подскажете, какое использовать событие при изменении текущей ячейки в cxGrid? Неважно, мышкой или клавой
Автор: reenoip
Дата сообщения: 03.06.2016 15:39
Может, здесь есть у кого-нибудь какие-нибудь соображения по моему вопросу?
Автор: AlexCoRu
Дата сообщения: 03.06.2016 16:23
reenoip
Цитата:
при установке набора компонент недоступен выбор "ExpressRichEdit Control" - он просто неактивен и всё. Так и задумано?
Да, 2015.2.5 не поддерживается Берлин. Куча ошибок при компиляции этого пакета. Остальное компилируется без ошибок.
По остальным пунктам ничего написать не могу, устанавливаю вручную из исходников.
Автор: reenoip
Дата сообщения: 03.06.2016 19:24
Всё понятно. Спасибо за отзыв!

Дождусь тогда лучше 2015.2.6, а то и вовсе 2016-ую ветку.
Автор: ChSerg
Дата сообщения: 03.06.2016 20:40

Цитата:
2015.2.5 не поддерживается Берлин

Неправда. Штатный инсталлятор отлично ставит все под Берлин. И все доступно и работает.
Автор: Dronton2
Дата сообщения: 04.06.2016 09:42
vavavol
В cxGrid нет текущей ячейки. Ячейки есть во View. Да и то не во всех.
В тех View, где есть ячейки - события OnFocusedRecordChanged и OnFocusedItemChanged
Автор: AlexCoRu
Дата сообщения: 04.06.2016 13:42
ChSerg
Вчера поставил v2015 vol 2.6. Официальный релиз под Берлин.
Автор: ChSerg
Дата сообщения: 04.06.2016 17:24
AlexCoRu
Тем не менее и предыдущая версия тоже отлично ставится под Берлин.
Автор: AlexCoRu
Дата сообщения: 04.06.2016 18:39
Неимея официальных установщиков, верю на слово.

Добавлено:
Не имею официальных установщиков, верю на слово
Автор: kii
Дата сообщения: 06.06.2016 08:03
Есть компoнент Map Control какие действия нужно произвести, чтобы он хоть как-то показал карту
OpenStreetMap.
Как ни крутил - все равно экран пустой.
Автор: Cryogen2003
Дата сообщения: 06.06.2016 16:35
приветствую коллеги, добрый вечер.

Возникла проблема на ровном месте, куда копать не пойму.

есть два приложения, одно максимально полное по функционалу, другое сильно порезанное (ну типа лайт версия)
Пользователи сегодня сообщили, что есть проблема, с каких пор началась никто не помнит, но говорят давно.
В лайт версии гриды нормально показывает, а в полной версии при наведении мышки на столбец (или на банд) столбец выделяется как и должен, а если мышку уводишь дальше, то выделение остается. И получается иногда очень странная по виду картина.

Ссылка

Как избавиться от этого глюка? Приложения все одинаковые, на гридах mousemove и подобного ничего не стоит. В 14.x.x такого точно не было, судя по всему началось у меня в 15.2.2. Но при этом это только в одном приложении такое.
Автор: Dronton2
Дата сообщения: 07.06.2016 10:05
Cryogen2003
Может быть, разные параметры проектов? (разные пути, опции компиляции и т.п.)
Попробуйте создать 2 новых одинаковых пустых проекта и перенести в них *.pas и *.dfm из старых проектов. Если проблема останется - значит, она внутри *.pas и *.dfm.
Если эти приложения отличаются только по урезанности функционала, то, возможно, лучше иметь всего один комплект исходников, содержащий $IFDEF и $ELSE секции для ограничения функционала.
Автор: Cryogen2003
Дата сообщения: 07.06.2016 10:58
Dronton2
Полночи провел над поиском, все таки решил проблему. А после решения уже нашел и виновника.

Виновник - включенный стандартный оптимизатор в Дельфях.

Если его убрать, то все работает как надо.
Я пока не решил нужен ли он мне или убрать, но на всякий случай напишу решение для других.

Проблема заключалась в том, что не создавался TcxTimer во второй и последующий разы (в девках оказывается на все MouseMove и MouseLeave над их компонентами вешают таймер из WinApi, который раз в 1/100 секунду запускается и проверяет нужно ли запускать MouseLeave на компоненте).
В девках очень часто в их модулях есть такая интересная вещь: они делают не переменную, а функцию к "f" переменной. А в функции проверяют все что им нужно (обычно это создан класс или нет), если не что-то не выполнено, то все выполняют, а если все выполнено, то просто возвращают переменную "f". И судя по всему во второй и следующие разы, когда создавать ничего не надо, оптимизатору сносит крышу и он бывает такую фигню возвращает и из-за этого в конкретном этом случае Windows.CreateTimer просто тупо возвращает 0.

Итог, решение от меня, помидорами если что, то можно кидать

Код:
исправление работы cxTimer
модуль cxClasses

в initialization добавить
cxTimerWindow := TcxTimerWindow.Create;

в finalization заменить
FreeAndNil(FcxTimerWindow);
на
FreeAndNil(cxTimerWindow);

удалить функцию cxTimerWindow

в переменных заменить
FcxTimerWindow: TcxTimerWindow;
на
cxTimerWindow: TcxTimerWindow;

Смысл во всем избавиться от функции cxTimerWindow и заменить ее на обычную переменную cxTimerWindow
Автор: tanaseduard
Дата сообщения: 07.06.2016 11:19
Cryogen2003
Очень интересно. Спасибо за мануал
Автор: Cryogen2003
Дата сообщения: 07.06.2016 11:41
tanaseduard
Да не за что. Честно говоря не ожидал такую подлянку.

Кстати, что конкретно оптимизатор от дельфей делает? Читал только общее про него, хотелось бы чутка поподробнее про него прочитать, дабы понять почему в этом конкретном случае происходит "пятая точка".
Я в свое время подхватил эту идею от девок, на тему функций к классу в переменной "f".
Хорошо, что не так много мест, где это у себя использовал, за сегодня думаю уберу из своих исходников данный подход ..... ну как бы на всякий случай.
Автор: ChSerg
Дата сообщения: 07.06.2016 12:14
Cryogen2003

Цитата:
Windows.CreateTimer просто тупо возвращает....

Вот смотрю исходник cxTimer. И нету там никакого вызова Windows.CreateTimer ваще...

Страницы: 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211

Предыдущая тема: Помогите пожалуйста с блокировкой клавиатуры и мышки


Форум Ru-Board.club — поднят 15-09-2016 числа. Цель - сохранить наследие старого Ru-Board, истории становления российского интернета. Сделано для людей.