Перейти из форума на сайт.

НовостиФайловые архивы
ПоискАктивные темыТоп лист
ПравилаКто в on-line?
Вход Забыли пароль? Первый раз на этом сайте? Регистрация
Компьютерный форум Ru.Board » Компьютеры » Прикладное программирование » Использование DevExpress (часть 4)

Модерирует : ShIvADeSt

 Версия для печати • ПодписатьсяДобавить в закладки
Страницы: 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 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342

Открыть новую тему     Написать ответ в эту тему

ShIvADeSt



Moderator
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
DevExpress

Обмен опытом, обсуждение нюансов и решение проблем возникающих при использовании библиотеки компонент Developer Express




 
DLL со скинами из библиотеки dxSkins, автор Ziltoid Подробнее... линк обновлен
Продолжение, Первая часть, вторая часть, третья часть

Полезные утилиты:
DxAutoInstaller v2.1.10 Простой и удобный тул для установки девок из исходников
https://mega.nz/#!aJRQzSqI!N7RgfcG1tfF45Z3OgcmBDHT_ZcWlIgJQ5eHHgQ9VupE

Всего записей: 3956 | Зарегистр. 29-07-2003 | Отправлено: 04:48 31-12-2009 | Исправлено: G787, 21:12 29-07-2018
KDPoid



Full Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Вы ходите одновременно отображать и id и лукапное поле для этого id из справочника ?
Так может просто завести в гриде два столбца, отображающих id ?
В одном столбце числом, а в другом лукапно.

Всего записей: 404 | Зарегистр. 08-08-2006 | Отправлено: 16:35 30-04-2016
ivan76

Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору

Цитата:
Вы ходите одновременно отображать и id и лукапное поле для этого id из справочника ?
Так может просто завести в гриде два столбца, отображающих id ?
В одном столбце числом, а в другом лукапно.  

 
Поле id и так присутствует, выбор из списка осуществляется, но в режиме read-only (специфика запроса).
мне нужно при заполнении сетки выполнить что то подобное этому cxGrid1DBTableView1Column1.EditValue := id ,  но не могу понять в каком событии это можно сделать, что то подобное BeforeinsertRecord .

Всего записей: 157 | Зарегистр. 04-12-2003 | Отправлено: 11:14 01-05-2016
reenoip



Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Seattle + DE15.2.2. Кто силён в скинах - подскажите, пожалуйста, почему в dxSkinEditor в превью одна картинка, а в конечном приложении - другая:
 

 

 
???
 
 
 
Скин, естественно, один и тот же. Стоковый, шёл в комплекте, изменения не вносились. Лучше, конечно, если у себя перепроверите этот эффект.

Всего записей: 1768 | Зарегистр. 10-03-2006 | Отправлено: 06:24 05-05-2016
reenoip



Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору

Цитата:
почему в dxSkinEditor в превью одна картинка

Путём практического ковыряния исходников исправил сей досадный визуальный глюк так:
 
\ExpressBars\Sources\dxRibbonFormCaptionHelper.pas:
 
    AIndent := (GetWindowCaptionHeight - AIconSize.cy) div 2;
заменить на:
    AIndent := 0;
 
    Result := cxRectSetTop(GetClientRect, AIndent, AIconSize.cy);
заменить на:
    Result := cxRectSetTop(GetClientRect, AIndent, GetWindowCaptionHeight);
 
      R := cxRectSetRight(R, R.Right, CalculateBorderIconSize(AIcon).cx);
заменить на:
      R := cxRectSetRight(R, R.Right, 46);
 
\ExpressBars\Sources\dxRibbon.pas:
 
          Result := Ribbon.FormCaptionHelper.TextBounds.Left + 4;
заменить на:
          Result := Ribbon.FormCaptionHelper.TextBounds.Left + 2;
 
 
После внесения и сохранения изменений необходима повторная компиляция набора.
 
 
Хотя, конечно, вряд ли здесь кто-то заморачивается такими мелочами кроме меня.

Всего записей: 1768 | Зарегистр. 10-03-2006 | Отправлено: 08:31 05-05-2016 | Исправлено: reenoip, 07:50 12-06-2016
reenoip



Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Ещё вопрос: есть dxToggleSwitch1. Одинарный клик обрабатывает хорошо, но я хочу запретить двойной клик (так нужно), а то он порой жёстко обламывает уже активированное действо:
 
   
 
Есть идеи, как можно сделать это? Куда этот dxToggleSwitch1.OnDblClick(nil) засунуть, чтобы он AV не вызывал...

Всего записей: 1768 | Зарегистр. 10-03-2006 | Отправлено: 12:34 14-05-2016 | Исправлено: reenoip, 13:33 14-05-2016
reenoip



Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору

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

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

Цитата:
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;

Всего записей: 1768 | Зарегистр. 10-03-2006 | Отправлено: 11:43 18-05-2016
vavavol



Junior Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
Добрый день! Не подскажете, как изменить строку версии девок при загрузке IDE (заставка)? Скачал у китайцев, все %Str.pas поправил, но при запуске IDE пишет что-то типа "DevExpress VCL 2015.2.2" плюс кракозяблики. Заранее благодарен за ответ  
 
Добавлено:
Да, забыл. Версия IDE XE10.1 Berlin

Всего записей: 181 | Зарегистр. 25-01-2006 | Отправлено: 16:16 19-05-2016
Cryogen2003



Advanced Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
Приветствую. Есть идея у заказчика, но я не совсем понимаю как можно быстро ее решить.  
 
Есть форма, на которой валяется компонент TcxDBFilterControl. К нему привязана табличка (TkbmMemTable), в которой нужные поля находятся, некоторые из них лукап поля (все это начитывается на основе справочников, где в зависимости от отчета подставляются эти поля, их типы, если это лукап поля, то идет селект с справочником для этого лукапа, и т.д.).
Все это написано, уже работает в продакшене, вроде все ок.
 
У заказчика следующая идея и я пока в думах, не совсем понимаю как это решить.
Идея в том, что бы у любого элемента этого дерева в TcxDBFilterControl можно было проставлять какое-то число в дополнении (то есть рядом со стандартным элементом (типа лукапа, редакторов строки, даты, числа) был бы еще какой-то элемент (пока не решено точно какой) для ввода числа (например от 0 до 100)).
Это бы обозначало "силу" этого элемента фильтра.  
Правда пока заказчик до конца еще не придумал как все это считать (ну например если используется две группы в фильтре, но в одной группе эта "сила" больше, чем в другой. И что при этом делать), но думаю от самой идеи он не откажется и выполнять придется

----------
Холодильники мы

Всего записей: 745 | Зарегистр. 08-12-2004 | Отправлено: 19:30 24-05-2016
ChSerg



Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Cryogen2003
Если задан элемент фильтра, то он на все 100 включен в фильтр.
Как можно включить элемент фильтра на 80%, например?

Всего записей: 936 | Зарегистр. 30-08-2001 | Отправлено: 23:31 24-05-2016
Dronton2

Full Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Cryogen2003
Непонятно, что хочет заказчик.
Может быть, он хочет упорядочить вывод в зависимости от веса полей?
Например, ставим полю A вес 100, полю B вес 20 и полю C вес 80.
Тогда В начале списка будут  записи, у которых все поля удовлетворяют условию, затем - поля A и C удовлетворяющие условию, и затем - только поля А удовлетворяющие условию. (т.е., упорядочивать по сумме весов: если условие для поля выполнено, то добавлять его вес в общий вес для сортировки).
Я правильно понял? В этом случае, все поля в условии должны быть связаны условием "И", и древовидный фильтр не нужен.

Всего записей: 460 | Зарегистр. 27-06-2005 | Отправлено: 10:05 25-05-2016
Cryogen2003



Advanced Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
Dronton2
ChSerg
Объясню по другому, благо вчера совещание с ним устроил.
Нужен древовидный список со всеми возможными И и ИЛИ, с группами и так далее.  Под его условия подойдет только TcxFilterControl или TcxDBFilterControl.
Есть куча условий, количество этих условий может быть очень большим. У каждого из этих условий нужно проставлять "силу" (вес - кому что нравится) этого условия или приоритет (критический, очень важный, важный, не важный и т.д.). Обычно может быть только что-то одно - либо сила, либо приоритет.  
 
В итоге при запуске этого "отчета" - все эти элементы фильтра создают селект и он выполняется в Oracle.  
Потом выполняется анализ "силы" или приоритета для каждой отфильтрованной записи.  
В первом случае это сумма всех элементов по силе (если есть группы, то сумма всех элементов в группе и потом в зависимости от того было "и" или "или") и если эта общая сила отфильтрованной строки больше или равна, чем определенное значение для выполнения конкретно этого отчета, то запись отмечается особым образом и отправляется куда следует (стучится в органы), если же меньше, то на выбор оператора.  
Во втором случае - это так же анализ каждого элемента в фильте или группе (если они есть, хотя думаю они будут всегда). Считается так же сумма (каждый приоритет имеет определенный вес) и выводится все это счастье оператору. Причем наиболее критические записи сразу обрабатываются системой и "стучится" куда надо, менее критические оператор обрабатывает, анализирует и сам решает, нужно ли стучать на эту запись или нет.
 
Итог:  
сделано все, кроме силы (веса) и приоритетов. Не знаю как можно это реализовать быстро и в тоже время удобно для оператора (пользователя). Конечно не очень хотелось бы переделывать компонент от девок, но возможно придется.
 
Хочется максимально автоматизировать этот процесс, чтобы оператору чутка меньше работы было, да и мне каждый раз переписывать селекты и хранимки на PL/SQL на критичные вещи не хочется. Хочется все правила (фильтры) в нормальном интерфейсе забить для каждого типа отчета и не парится.  
 
Сейчас это выглядит так:

 


 


----------
Холодильники мы

Всего записей: 745 | Зарегистр. 08-12-2004 | Отправлено: 10:41 25-05-2016 | Исправлено: Cryogen2003, 11:08 25-05-2016
Dronton2

Full Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Cryogen2003
Как бы не пришлось свой собственный компонент писать с нуля.

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

Всего записей: 460 | Зарегистр. 27-06-2005 | Отправлено: 13:56 25-05-2016
Cryogen2003



Advanced Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
Dronton2
Сейчас да, вес записи конечно не возвращает. Можно конечно забить в справочники вес записи, но в том то и смысл, что например "счет клиента" в зависимости от его синтетики может быть разным по весу. И из-за этого хотелось сделать нормальную настройку, чтобы одно из полей было именно значением (без разницы, что это - поле для текстового ввода, поле для выбора даты, поля для выбора в лукапе, а так же что это поле внутри группы или входит в тип in или not in.
 

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

нет, не проще.
По моему сейчас работает практически идеально, ну акромя проблемы, что нужно будет как то добавлять поле, о котором сказал

----------
Холодильники мы

Всего записей: 745 | Зарегистр. 08-12-2004 | Отправлено: 14:35 25-05-2016
Dronton2

Full Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Cryogen2003

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

Всего записей: 460 | Зарегистр. 27-06-2005 | Отправлено: 15:53 25-05-2016 | Исправлено: Dronton2, 15:56 25-05-2016
Cryogen2003



Advanced Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
Dronton2
Я с Вами согласен, но придется тогда придумывать как реализовать группы и вещи типа IN и NOT IN.
То есть в любом случае придется переделывать DBTreeList и по полной, если решу отказаться от FilterControl.  
Либо дорабатывать напильником текущую реализацию, что не очень хочется.
 
В итоге и то, и другое дорабатывать по полной.
 

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

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

----------
Холодильники мы

Всего записей: 745 | Зарегистр. 08-12-2004 | Отправлено: 17:01 25-05-2016
Dronton2

Full Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Cryogen2003

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

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

Всего записей: 460 | Зарегистр. 27-06-2005 | Отправлено: 10:34 26-05-2016
Cryogen2003



Advanced Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
Dronton2
Вообщем попробую что-то похожее реализовать.  
Просто придется еще примерно такой же интерфейс реализовывать, как есть сейчас. К сожалению пользователи это макаки, а часто бывает, что макаки с гранатой. Их сложно переучить

----------
Холодильники мы

Всего записей: 745 | Зарегистр. 08-12-2004 | Отправлено: 13:02 26-05-2016
Marcello_TLT

Newbie
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Подскажите, как в TcxPivotGrid определить число включенных флажков у определенного поля? На приведенной картинке 3 флажка, остальные не используются из-за фильтров на других полях.
 

Всего записей: 18 | Зарегистр. 28-12-2012 | Отправлено: 17:40 26-05-2016 | Исправлено: Marcello_TLT, 19:40 26-05-2016
vavavol



Junior Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
Добрый день! Не подскажете, какое использовать событие при изменении текущей ячейки в cxGrid? Неважно, мышкой или клавой

Всего записей: 181 | Зарегистр. 25-01-2006 | Отправлено: 13:19 03-06-2016
reenoip



Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Может, здесь есть у кого-нибудь какие-нибудь соображения по моему вопросу?

Всего записей: 1768 | Зарегистр. 10-03-2006 | Отправлено: 15:39 03-06-2016
Открыть новую тему     Написать ответ в эту тему

Страницы: 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 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342

Компьютерный форум Ru.Board » Компьютеры » Прикладное программирование » Использование DevExpress (часть 4)


Реклама на форуме Ru.Board.

Powered by Ikonboard "v2.1.7b" © 2000 Ikonboard.com
Modified by Ru.B0ard
© Ru.B0ard 2000-2024

BitCoin: 1NGG1chHtUvrtEqjeerQCKDMUi6S6CG4iC

Рейтинг.ru