Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Сортировка и GridMode / 25 сообщений из 37, страница 1 из 2
24.10.2018, 16:25
    #39722292
Леонов Юрий
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сортировка и GridMode
Доброго времени суток, уважаемые.

Ситуация такая. Есть cxGrid с TcxGridDBBandedTableView, у которого GridMode := True; Описываю вручную события DataController.OnSortingChanged и DataController.Filter.OnBeforeChange, тут проблем нет, они работают корректно. Кроме этих событий, есть еще реализация события OnFocusedRecordChanged (тут я в зависимости от данных управляю доступностью кнопок на форме).
Так вот сама проблема. При выборе сортировки (если кликнули по колонке), после выполнения всех плановых процедур почему-то еще раз вызывается событие OnFocusedRecordChanged и почему-то передается (AFocusedRecord = nil), хотя строка выделена по итогу. Ну и как результат, все кнопки задизейблены, хотя такого не должно быть (переход на любую запись и возврат опять на первую это подтверждает). Отловить где вызывается еще раз OnFocusedRecordChanged не получилось, но это случается всегда после того как отработало полностью событие DataController.OnSortingChanged. Кто с таким сталкивался, просветите, почему такая ситуация складывается? Заранее благодарен.
...
Рейтинг: 0 / 0
24.10.2018, 20:04
    #39722465
JayDi
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сортировка и GridMode
Потому что события focused и selected будут срабатывать дважды -- при открытии и повторном открытии датасета. Для того, чтобы было все нормально и срабатывало одно -- надо вызывать у грида BeginUpdate/EndUpdate. И вот после EndUpdate и сработают все события (если они были).
...
Рейтинг: 0 / 0
26.10.2018, 09:16
    #39723273
Леонов Юрий
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сортировка и GridMode
JaDiПотому что события focused и selected будут срабатывать дважды -- при открытии и повторном открытии датасета. Для того, чтобы было все нормально и срабатывало одно -- надо вызывать у грида BeginUpdate/EndUpdate. И вот после EndUpdate и сработают все события (если они были).

Это и так понятно. Вопрос не в этом, срабатывает дополнительно еще один раз, после отработки события OnSortingChanged. Или я что-то не так понял?
...
Рейтинг: 0 / 0
26.10.2018, 09:25
    #39723279
DimaBr
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сортировка и GridMode
Обычно на кнопки вешают Action-ы и дизаблят в OnUpdate.
Вы дизаблете в зависимости от данных, грид то тут причём ?
Полагаться на OnFocusedRecordChanged не стоит. Завтра поменяете Грид на другой, а в нём нет такого события (гипотетически)
...
Рейтинг: 0 / 0
26.10.2018, 09:40
    #39723290
JayDi
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сортировка и GridMode
Кстати, focused не всегда срабатывает (т.е. фокус может поменяться, но события не будет -- уже не помню, в каких именно ситуациях). Поэтому везде selected использую, он точно всегда работает.
...
Рейтинг: 0 / 0
26.10.2018, 11:52
    #39723381
Леонов Юрий
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сортировка и GridMode
JaDiКстати, focused не всегда срабатывает (т.е. фокус может поменяться, но события не будет -- уже не помню, в каких именно ситуациях). Поэтому везде selected использую, он точно всегда работает.

На selected в бэндовых гридах при переходе постранично пропадает отрисовка, потому и перешел на focused, с ним у меня проблем не было
...
Рейтинг: 0 / 0
26.10.2018, 12:53
    #39723433
Леонов Юрий
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сортировка и GridMode
DimaBrОбычно на кнопки вешают Action-ы и дизаблят в OnUpdate.
Вы дизаблете в зависимости от данных, грид то тут причём ?
Полагаться на OnFocusedRecordChanged не стоит. Завтра поменяете Грид на другой, а в нём нет такого события (гипотетически)

А кто говорит про грид? Я работаю с DBBandedTableView, событие это есть и переходить на другой не собираюсь. Если чисто гипотетически надо будет перейти на другой грид, то это будет уже совершенно другая проблема и реализация, ежу понятно.
...
Рейтинг: 0 / 0
26.10.2018, 15:57
    #39723604
DimaBr
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сортировка и GridMode
Леонов ЮрийА кто говорит про грид? Я работаю с DBBandedTableView, событие это есть и переходить на другой не собираюсь. Если чисто гипотетически надо будет перейти на другой грид, то это будет уже совершенно другая проблема и реализация, ежу понятно.
У вас DBBandedTableView - то есть вы работаете с данными в Dataset, а грид - интрумент для отображения данных. Зачем брать данные с промежуточного элемента ? Работайте напрямую с Dataset
...
Рейтинг: 0 / 0
29.10.2018, 11:40
    #39724368
Леонов Юрий
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сортировка и GridMode
DimaBrУ вас DBBandedTableView - то есть вы работаете с данными в Dataset, а грид - интрумент для отображения данных. Зачем брать данные с промежуточного элемента ? Работайте напрямую с Dataset

Так отрисовка же делается на конечном контейнере, то есть на DBBandedTableView, причем тут Dataset?
...
Рейтинг: 0 / 0
29.10.2018, 12:24
    #39724410
DimaBr
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сортировка и GridMode
Причём здесь отрисовка грида и задизабленные кнопки ? Вы кнопки гасите в зависимости от того где курсор датасета ? Чтобы, например, не давать редактировать какую-то запись.
...
Рейтинг: 0 / 0
31.10.2018, 11:12
    #39725622
Леонов Юрий
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сортировка и GridMode
DimaBrПричём здесь отрисовка грида и задизабленные кнопки ? Вы кнопки гасите в зависимости от того где курсор датасета ? Чтобы, например, не давать редактировать какую-то запись.

Да дело даже не в том, на каком событии вешается доступность кнопок. Я хочу понять почему срабатывает событие OnFocusedRecordChanged без фокуса после выполнения события DataController.OnSortingChange. Где-то есть очередность срабатываний событий у TableView? Вот в чем вопрос был, а не то, что мы обсуждаем...
...
Рейтинг: 0 / 0
31.10.2018, 11:18
    #39725625
Леонов Юрий
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сортировка и GridMode
DimaBrПричём здесь отрисовка грида и задизабленные кнопки ? Вы кнопки гасите в зависимости от того где курсор датасета ? Чтобы, например, не давать редактировать какую-то запись.

Да дело даже не в том, на каком событии вешается доступность кнопок. Я хочу понять почему срабатывает событие OnFocusedRecordChanged без фокуса после выполнения события DataController.OnSortingChange. Где-то есть очередность срабатываний событий у TableView? Вот в чем вопрос был, а не то, что мы обсуждаем...
...
Рейтинг: 0 / 0
31.10.2018, 11:49
    #39725666
JayDi
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сортировка и GridMode
Леонов Юрий,


Обращаю внимание на:
авторПри выборе сортировки (если кликнули по колонке), после выполнения всех плановых процедур почему-то еще раз вызывается событие OnFocusedRecordChanged и почему-то передается

Вот эти "плановые процедуры" и стоит смотреть, что именно в них делается. А то может датасет там переоткрывается. Тогда срабатывание фокуса логично.
...
Рейтинг: 0 / 0
31.10.2018, 12:02
    #39725688
vavan
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сортировка и GridMode
у них там порой бывает необоснованная лишняя а то и двойная работа в некоторых местах, см. например Q515220, Q515958, Q506338, в какой-то мере Q516328
...
Рейтинг: 0 / 0
05.11.2018, 16:42
    #39728140
Леонов Юрий
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сортировка и GridMode
JaDiЛеонов Юрий,


Обращаю внимание на:
авторПри выборе сортировки (если кликнули по колонке), после выполнения всех плановых процедур почему-то еще раз вызывается событие OnFocusedRecordChanged и почему-то передается

Вот эти "плановые процедуры" и стоит смотреть, что именно в них делается. А то может датасет там переоткрывается. Тогда срабатывание фокуса логично.

Прошелся по всем процедурам, все нормально отработало, но после выхода из процедуры OnSortingChanged срабатывает еще раз OnFocusedRecordChanged, у которого AFocusedRecord=nil. Это что, нажатие на Header столбца запускает событие изменения сортировки, а потом срабатывает отжатие клавиши мыши и типа теряется фокус? Кто-то может четко прояснить почему так происходит или хотя бы ткните в доку...
...
Рейтинг: 0 / 0
05.11.2018, 17:16
    #39728153
JayDi
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сортировка и GridMode
Леонов Юрий,

предлагаю сделать тестовый пример (грид, виртуальный датасет с тестовыми данными и парочка событий) и приложить сюда. Заодно подтвердить, что виновато именно OnSorting, а не что-то другое. Потому что гадать на кофейной гуще становится тяжело.
...
Рейтинг: 0 / 0
05.11.2018, 18:31
    #39728195
JayDi
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сортировка и GridMode
авторПрошелся по всем процедурам, все нормально отработало

Повторяю -- причина "в другом коде". Обращаю внимание на работу событий:

Код: 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.
grid mode: no
DataController.SortingChanged
DataController.FocusedRecordChanged, prev: 3, new: 3
DataController.SortingChanged
DataController.FocusedRecordChanged, prev: 2, new: 2
DataController.SortingChanged
DataController.FocusedRecordChanged, prev: 3, new: 3

DataController.FocusedRecordChanged, prev: null, new: 0
grid mode: yes
DataController.SortingChanged
DataController.SortingChanged
DataController.SortingChanged

DataController.FocusedRecordChanged, prev: null, new: 2
grid mode: no

DataController.FocusedRecordChanged, prev: null, new: 0
grid mode: yes

DataController.FocusedRecordChanged, prev: null, new: 2
grid mode: no

DataController.FocusedRecordChanged, prev: null, new: 0
grid mode: yes



FocusedRecordChanged -- срабатывает каждый раз, когда меняется Grid Mode. Более того, в грид моде FocusedRecordChanged вообще не срабатывает. Т.е. смотреть надо именно "другой код".

...
Рейтинг: 0 / 0
13.11.2018, 17:46
    #39732604
Леонов Юрий
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сортировка и GridMode
JaDi, сделал я тестовый пример, получилось вот такое:
...
Рейтинг: 0 / 0
13.11.2018, 17:51
    #39732610
Леонов Юрий
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сортировка и GridMode
в красной рамке - выполнение события DataController.OnSortingChanged
Код: 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.
...
private
    { Private declarations }
    FGridMode: Boolean;
    FText: string;
    function GetUserOrder: string;
...

procedure TForm1.FormShow(Sender: TObject);
begin
  FGridMode := False;
  btnGridModeClick(Self);
  osSession.Connected := True;
  FText := oqMain.SQL.Text;
  oqMain.Open;
  meLog.Lines.Clear;
end;

procedure TForm1.gdbbtvMainDataControllerSortingChanged(Sender: TObject);
begin
  meLog.Lines.Add('Start sorting...');
  if gdbbtvMain.DataController.DataModeController.GridMode then
  begin
    if gdbbtvMain.SortedItemCount > 0 then
    begin
      try
        gdbbtvMain.BeginUpdate;
        oqMain.Close;
        oqMain.SQL.Clear;
        oqMain.SQL.Add(FText);
        oqMain.SQL.Add(GetUserOrder);
        oqMain.Open;
      finally
        gdbbtvMain.EndUpdate;
        gdbbtvMain.OnFocusedRecordChanged(gdbbtvMain,
          gdbbtvMain.Controller.FocusedRecord,
          gdbbtvMain.Controller.FocusedRecord, True);
      end;
    end
  end;
  meLog.Lines.Add('End sorting!');
end;

function TForm1.GetUserOrder: string;
var
  I, ID: Integer;
  SQLOrderSt: String;
begin
  Result := ' order by ';
  for I := 0 to gdbbtvMain.SortedItemCount - 1 do
  begin
    if I > 0 then
      Result := Result + ', ';
    Result := Result + 't.' + TcxGridDBBandedColumn(gdbbtvMain.SortedItems[I])
      .DataBinding.FieldName;
    if gdbbtvMain.SortedItems[I].SortOrder = soDescending then
      Result := Result + ' desc';
  end;
end;

procedure TForm1.gdbbtvMainFocusedRecordChanged(Sender: TcxCustomGridTableView;
  APrevFocusedRecord, AFocusedRecord: TcxCustomGridRecord;
  ANewItemRecordFocusingChanged: Boolean);
var
  LText: string;
begin
  LText := 'OnFocusedRecordChanged APrevFocusedRecord=';
  if APrevFocusedRecord = nil then
    LText := LText + 'nil, '
  else
    LText := LText + IntToStr(APrevFocusedRecord.Index) + ', ';
  LText := LText + 'AFocusedRecord=';
  if AFocusedRecord = nil then
    LText := LText + 'nil, '
  else
    LText := LText + IntToStr(AFocusedRecord.Index) + '.';
  meLog.Lines.Add(LText);
end;
...
Рейтинг: 0 / 0
13.11.2018, 17:53
    #39732612
Леонов Юрий
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сортировка и GridMode
Меня интересует, откуда вызывается OnFocusedRecordChanged после выполнения сортировки?
...
Рейтинг: 0 / 0
13.11.2018, 18:47
    #39732653
ma1tus
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сортировка и GridMode
Леонов Юрийуправляю доступностью кнопок на форме)s / GridView.OnFocusedRecordChanged / GridView.DataController.DataSource.DataSet.OnAfterScroll / - не?
...
Рейтинг: 0 / 0
13.11.2018, 19:49
    #39732681
JayDi
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сортировка и GridMode
Леонов Юрий,

"лишнее" срабатывание OnFocusedRecordChanged идет из-за переоткрытия датасета -- в нем меняется фокус и соответственно девгрид на это реагирует тоже для синхронизации текущего грида с датасетом.
...
Рейтинг: 0 / 0
13.11.2018, 20:22
    #39732701
JayDi
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сортировка и GridMode
Хмм... Событие OnFocusedRecordChanged вызывается вообще при ЛЮБЫХ изменениях в датасете, даже если по факту ничего не менялось. Например, достаточно тупо вызвать MemData.Edit; MemData.Post, чтобы сработало событие. И это нормальное поведение по словам техподдержки .

авторI am afraid this issue cannot be fixed, because when the Post method is called, DataSet generates a notification of the DataLink.DataSetChanged method.
In the DataLink.DataSetChanged method, we cannot determine what has happened (whether data or a list of records has been changed, or simple data has been posted).
When our component processes the DataLink.DataSetChanged notification, it needs to refresh all records loaded from the dataset.
In this case, we cannot determine whether or not the focused record has been changed and need to raise the FocusedRecordChanged event.

Короче, надо смириться и просто обрабатывать эти ситуации -- например, ввести переменную IsFreezeFocusRecordEvent, включать ее в начале обновления и отключать после всех обновлений, а в самом событии уже ее проверять и всё игнорить в нужных случаях (более правильный аналог выключения обработчика через OnFocusedRecordChanged = nil).
...
Рейтинг: 0 / 0
13.11.2018, 20:26
    #39732706
JayDi
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сортировка и GridMode
Даже dataset.DisableControls; dataset.EnableControls; приведет к срабатыванию события.
...
Рейтинг: 0 / 0
13.11.2018, 22:16
    #39732726
white_nigger
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сортировка и GridMode
JaDiДаже dataset.DisableControls; dataset.EnableControls; приведет к срабатыванию события.Тем более! И именно по вышеописанной причине. Основная причина - обеспечение консистента для грида и данных. Юзер может что угодно сделать при DisableControls или переоткрытии данных. Может висеть логика на эвентах датасета, может стать невалидными букмарки и т.д. Поэтому надо гарантировано отрефрешить все внутренности датаконтроллера и грида.
...
Рейтинг: 0 / 0
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Сортировка и GridMode / 25 сообщений из 37, страница 1 из 2
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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