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

НовостиФайловые архивы
ПоискАктивные темыТоп лист
ПравилаКто в 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
bolega

Silver Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Понадобилось сделать в гриде мульт-селект ячеек в несмежных строках через ctrl-mouse-клик. Оказалось, что такого функционала нет. На сайте разработчика где-то встретил подобный вопрос и ответ, что мол, к сожалению, это не предусмотрено и не планируется. Был сильно удивлен такой казалось бы пустяшной засаде. При том, что мультиселект несмежных строк запросто выполняется программно, а вот мышой - никак.  Покопался в исходниках, сделал такое небольшое исправление:  
 
function TcxGridTableController.SupportsRecordSelectionToggling: Boolean;
begin
  // было:  
  // Result := not CellMultiSelect;
  Result := true
end;
 
После этого мультиселект через Ctrl заработал. Граблей пока никаких не выплыло.

Всего записей: 4431 | Зарегистр. 09-09-2002 | Отправлено: 22:41 28-06-2013
reenoip



Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Мой вопрос относительно фильтрации в колонке по дате без учёта времени решился-таки (впрочем, как и всегда) методом тыка: cxGrid1DBTableView1 > DataController > DataModeController > SmartRefresh:=True

Всего записей: 1768 | Зарегистр. 10-03-2006 | Отправлено: 10:02 29-06-2013
exteris

Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
bolega
Спасибо.
Интересно, в предке стоит -  
function TcxCustomGridTableController.SupportsRecordSelectionToggling: Boolean;
begin
  Result := True;
end;

Всего записей: 382 | Зарегистр. 14-04-2003 | Отправлено: 11:26 29-06-2013
mdid

Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
или я туплю под конец дня или хз. В общем делал я все свои проекты с флагом ColumnAutoWidth. Заказчик захотел, что бы ширина колонки выставлялась по максимальному значению. Убрав эту галку, я результат не получил, и ничего похожего в свойствах не нашел(или плохо искал) Подскажите плиз свойство, которое решит мою проблему

Всего записей: 1298 | Зарегистр. 13-02-2006 | Отправлено: 20:38 03-07-2013
Darl

Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
mdid
 
По памяти, кажись было, Column->Width= то ли -1, то ли -2.

Всего записей: 140 | Зарегистр. 10-07-2002 | Отправлено: 21:02 03-07-2013
mdid

Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Darl
неа(( не реагирует ни на -2,-1 ни на 0.
ПС
нашел ApplyBestFit

Всего записей: 1298 | Зарегистр. 13-02-2006 | Отправлено: 21:20 03-07-2013 | Исправлено: mdid, 21:32 03-07-2013
AlexCoRu

BANNED
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Что за беда с cxGrid?
Есть два TClientDataSet cdsMaster и cdsDetail.
У cxGrid две вюхи MasterTableView и DetailTableView, связаные с соответсвующими источниками. Присвоены MasterTableView.DataController.KeyFieldNames и DetailTableView.DataController.KeyFieldNames. Всё работает кроме каскадного удаления записи из cdsDetail при удалении из cdsMaster.
cdsMaster.BeforeDelete
Код:
procedure TForm1.cdsMasterBeforeDelete(DataSet: TDataSet);
var
  MasterID: Variant;
begin
  MasterID := cdsMaster.FieldValues['ID'];
  if cdsDetail.Locate('MASTER_ID', MasterID, []) then
  begin
    cdsDetail.DisableControls;
    repeat
      cdsDetail.Delete;
    until not VarSameValue(cdsDetail.FieldValues['MASTER_ID'], MasterID);
    cdsDetail.EnableControls;
  end;
end;

Получается, что после выхода текущая запись в cdsMaster перемещается и удаляются нужные записи из cdsDetail и не та запись из cdsMaster.
Если не присваивать DetailTableView.DataController.KeyFieldNames, то удаляется всё нормально, но и редактировать DetailTableView нельзя.
Как это побороть?
 
Сделал так:
Код:
procedure TForm1.cdsMasterBeforeDelete(DataSet: TDataSet);
var
  MasterID: Variant;
begin
  MasterID := cdsMaster.FieldValues['ID'];
  if cdsDetail.Locate('MASTER_ID', MasterID, []) then
  begin
    cdsDetail.DisableControls;
    repeat
      cdsDetail.Delete;
    until not VarSameValue(cdsDetail.FieldValues['MASTER_ID'], MasterID);
    cdsDetail.EnableControls;
    cdsMaster.Locate('ID', MasterID, []);
  end;
end;
Но это как-то нехорошо.

Всего записей: 911 | Зарегистр. 04-09-2003 | Отправлено: 16:50 04-07-2013 | Исправлено: AlexCoRu, 17:28 04-07-2013
Deeptown12

Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Добрый день, помогите разобратся с CxGrid
Проблема в следующем, есть два уровня Level - основной и подчиненный, подчиненный связан с основным, там все нормально
Grid-ы в режиме GridMode - False
DetailInSQL - выключен
т.е классический случай основная и подчинные выборки открыти полностью и CxGrid сам подчиненные записи показывает в подчиненном Level своими средствами
Сама проблема
иногда при вставке записи в подчиненную таблицу, cxGrid отображает вставляему подчиненную запись не там (не у того родителя), см. рисунок
т.е вставляем запись для индикаторов, а грид почему то нарисует ее для курвиметров, хотя после переоткрытия датасетов все отобразится правильно, запись будет в индикаторах (т.е в БД ложатся с ключами записи правильно).
Т.е глюк самого cxGrid, кто нибудь сталкивался с этим и можно ли побороть
 
 

Всего записей: 246 | Зарегистр. 22-03-2004 | Отправлено: 09:48 09-07-2013
reenoip



Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
cxGrid с двумя десятками колонок. Нужен моментальный поиск/фильтрация по всем колонкам. Пытаюсь для этих целей прикрутить обычный Edit, привязав фильтрацию к нажатию клавиш:
 

Код:
procedure TForm1.Edit1KeyUp(Sender: TObject; var Key: Word; Shift: TShiftState);
var
i: integer;
s: string;
begin
cxGrid1DBTableView1.DataController.Filter.Active:=false;
with cxGrid1DBTableView1.DataController.Filter.Root do
begin
Clear;
BoolOperatorKind:=fboOr;
s:='%' + Edit1.Text + '%';
for i:=0 to cxGrid1DBTableView1.ColumnCount -1 do
AddItem(cxGrid1DBTableView1.Columns[i], foLike, s, s);
end;
cxGrid1DBTableView1.DataController.Filter.Active:=true;
end;

Сам поиск работает отлично, претензий нет, ищет именно так, как пользователь и ожидает. Когда количество записей в пределах нескольких тысяч - поиск работает быстро, НО:
 
Когда записей несколько десятков тысяч - поиск ощутимо тормозит.
Когда записей несколько сотен тысяч - пользоваться поиском практически невозможно. Добавить кнопку "Найти!", привязать к нажатию Enter и повесить на всё это хозяйство функцию фильтрации - не предлагать, т.к. пользователю нужна мгновенная фильтрация именно по нажатию клавиш на клавиатуре. Т.е. он сидит и жмёт на клавиши, и тут же видит результат в таблице.
 
Какие будут предложения и способен ли вообще cxGrid на подобный подвиг?

Всего записей: 1768 | Зарегистр. 10-03-2006 | Отправлено: 13:04 09-07-2013
X11



Silver Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
а где beginUpdate/endUpdate ?

----------
/не мы такие, жизнь такая/

Всего записей: 3253 | Зарегистр. 24-11-2005 | Отправлено: 13:26 09-07-2013
reenoip



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

Всего записей: 1768 | Зарегистр. 10-03-2006 | Отправлено: 13:28 09-07-2013
X11



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

Цитата:
Какие будут предложения и способен ли вообще cxGrid на подобный подвиг?

способен и миллионами ворочать
Пусть пользователь поставит SSD, значительно больше памяти, и проц типа Core i7 или выше
 
Добавлено:
До начала операции и после окончания операции
 
Добавлено:
Deeptown12, отобрази индикаторы.
 ты уверен, что правильно заполнены поля типа KeyFields/MasterFields/DetailKey? Непосредственно у самих НД есть ли ключевые поля? Правильно ли они выбираются из базы?

----------
/не мы такие, жизнь такая/

Всего записей: 3253 | Зарегистр. 24-11-2005 | Отправлено: 13:31 09-07-2013
reenoip



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

Код:
procedure TForm1.Edit1KeyUp(Sender: TObject; var Key: Word; Shift: TShiftState);  
var  
i: integer;  
s: string;  
begin  
cxGrid1DBTableView1.BeginUpdate();
cxGrid1DBTableView1.DataController.Filter.Active:=false;  
with cxGrid1DBTableView1.DataController.Filter.Root do  
begin  
Clear;  
BoolOperatorKind:=fboOr;  
s:='%' + Edit1.Text + '%';  
for i:=0 to cxGrid1DBTableView1.ColumnCount -1 do  
AddItem(cxGrid1DBTableView1.Columns[i], foLike, s, s);  
end;  
cxGrid1DBTableView1.DataController.Filter.Active:=true;
cxGrid1DBTableView1.EndUpdate;  
end;

 
потом так:

Код:
procedure TForm1.Edit1KeyUp(Sender: TObject; var Key: Word; Shift: TShiftState);  
var  
i: integer;  
s: string;  
begin  
cxGrid1DBTableView1.DataController.Filter.Active:=false;  
with cxGrid1DBTableView1.DataController.Filter.Root do  
begin  
cxGrid1DBTableView1.BeginUpdate();
Clear;  
BoolOperatorKind:=fboOr;  
s:='%' + Edit1.Text + '%';  
for i:=0 to cxGrid1DBTableView1.ColumnCount -1 do  
AddItem(cxGrid1DBTableView1.Columns[i], foLike, s, s);  
end;  
cxGrid1DBTableView1.DataController.Filter.Active:=true;
cxGrid1DBTableView1.EndUpdate;  
end;

 
но совсем уж такого wow-эффекта нет. Что я сделал не так?

Всего записей: 1768 | Зарегистр. 10-03-2006 | Отправлено: 13:47 09-07-2013
Deeptown12

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

Цитата:
X11 Deeptown12, отобрази индикаторы.

Отобразил, стало более понятно поведение, но все равно неясн
1.До вставки
   
2.Вставка
   
После
   
 
Код вставки, SyncMode - True
 
_FIBDs.Append;
_FIBDs.FN('SI_GROUP_ID').AsInteger := _FIBDs_Level_Master.FN('ID').AsInteger; // ключ мастера
_FIBDs.FN('MARKA').asString :=  TfrSIEdit(FrameEditing).MARKA.Text; // данные
_FIBDs.FN('TIP').asString   :=  TfrSIEdit(FrameEditing).TIP.Text;
_FIBDs.FN('NUMBER_REESTR').asString   :=  TfrSIEdit(FrameEditing).NUMBER_REESTR.Text;
_FIBDs.Post;
 
после переоткрытия датасета видим что все нормально
   
 
Понятно что беда возникает т.к. курсор у подчиненной таблице стоит не в той группе, хотя курсор мастера стоит верно, вообщем как сделать так что при вставке в пустой подчиненный level запись попадала именно туда, а не туда где стоит курсор (в другой группе)
 
Ключи и поля выставлены верно, индексы у всех есть
 
 
Т.е. проблема появляется при вставке подчиненной записи  при раскрытом подчиненном Level-е у которого нет данных, т.к. курсор был в другой группе (видно на  рисунке что текущий курсор стоит на идикаторах в группе индикаторов) , а запись добавляется в группу метрштоки (мастер курсор на ней), у которой нет данных, соотв. курсор не может стоять на записи подчиненной этой группе при Sync-true
то при добавлении cxgrid почему то считает текущей группу не метрштоки , а индикаторы и относит запись туда. При переоткрытии все нормализуется.  Как побороть, как принудительно появившуюся запись отнести к view-e метрштоков
 
 
 

Всего записей: 246 | Зарегистр. 22-03-2004 | Отправлено: 13:56 09-07-2013 | Исправлено: Deeptown12, 14:04 09-07-2013
X11



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

Цитата:
но совсем уж такого wow-эффекта нет. Что я сделал не так?

тебе уже написали:
Цитата:
Пусть пользователь поставит SSD, значительно больше памяти, и проц типа Core i7 или выше

а ещё можно попробовать использовать последнюю версию DevExpress, там новый алгоритм сортировки и группировки, возможно и фильтрации.
 
Вообще-то на клиента из  базы не принято тащить десятки тысяч и, тем паче, сотни тысяч записей.
 
Добавлено:
При чём SSD и системную плату с поддержкой SATA III - 6Gbit/sec

----------
/не мы такие, жизнь такая/

Всего записей: 3253 | Зарегистр. 24-11-2005 | Отправлено: 14:02 09-07-2013
reenoip



Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Т.е. тот алгоритм, который я привёл - имеет наибольший КПД из всех возможных? Я просто хотел убедиться, что использую максимально эффективный способ, и при возможности ускорить его. Но раз алгоритм наиболее оптимальный, и уже упирается в железо - то вопросов больше нет.
 
Спасибо!

Всего записей: 1768 | Зарегистр. 10-03-2006 | Отправлено: 14:08 09-07-2013
X11



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

Цитата:
Нужен моментальный поиск/фильтрация по всем колонкам.

 
Ты путаешь поиск и фильтрацию. В данном случае у тебя только фильтрация. Поиска, как такового нет.

----------
/не мы такие, жизнь такая/

Всего записей: 3253 | Зарегистр. 24-11-2005 | Отправлено: 14:26 09-07-2013
Deeptown12

Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Проблема решена другим путем
 
выставил DetaiInSQLMode - True в мастере
в подчиненной таблице в обработчике DetailFirst прописал код выборки с БД
 

Код:
 
procedure TfrSVOD.DBTDataControllerDataModeControllerDetailFirst(
  Sender: TcxDBDataModeController; ADataSet: TDataSet;
  const AMasterDetailKeyFieldNames: string;
  const AMasterDetailKeyValues: Variant; var AReopened: Boolean);
begin
  with (ADataSet as TpFIBDataSet) do
  begin
    if ParamByName('SI_GROUP_ID').Value = AMasterDetailKeyValues then
    begin
      First;
      Exit;
    end;
    DisableControls;
    try
      Active := False;
      ParamByName(AMasterDetailKeyFieldNames).Value := AMasterDetailKeyValues;
      Active := True;
    finally
      EnableControls;
    end;
    AReopened := True;
  end;
end;
 

 
стало все работать
 
плюcы такого подхода еще и в том что не надо тянуть всю БД Level2, соответвенно снимается нагрузка при открытии выборок
 

Всего записей: 246 | Зарегистр. 22-03-2004 | Отправлено: 08:14 10-07-2013 | Исправлено: Deeptown12, 08:56 10-07-2013
Deeptown12

Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Вопрос?
 
Как принудительно заставить cxGrid перечитать значения полей. В БД есть cal-поля, нужно что бы cxGrid после пересчета их обновил у себя в сетке. Поля пересчитываются, в обычном Grid сразу новые значения показываются, а как принудительно перерисовать их в cxGrid не пойму.
Советы с LayoutChanged не подошел.
Переоткрывать DataSet что бы грид подхватил изменения не хочется
 
ps
 
нашел, вопрос закрыт
 
DataController.UpdateItems

Всего записей: 246 | Зарегистр. 22-03-2004 | Отправлено: 15:24 10-07-2013 | Исправлено: Deeptown12, 15:29 10-07-2013
AlexCoRu

BANNED
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Подскажите, как
в обработчике события TcxDBGridColumn.OnGetDataText переместиться к некоторой записи в DataSet и вернуться обратно к текущей.
Вот так не идёт:

Код:
MasterKey := TableView.DataController.GetRecordId(ARecordIndex);
RecID := TableView.DataController.GetRecordId(TableView.DataController.GetFocusedRecordIndex);
TableView.DataController.Locate('ID', AMasterKey, []);
TableView.DataController.LocateByKey(RecID);
Со всякими BeginUpdate...EndUpdate, BeginLocate...EndLocate тоже не идёт.

Всего записей: 911 | Зарегистр. 04-09-2003 | Отправлено: 10:22 11-07-2013 | Исправлено: AlexCoRu, 11:15 11-07-2013
Открыть новую тему     Написать ответ в эту тему

Страницы: 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