Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Delphi Новый топик    Ответить
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
 Сортировка и GridMode  [new]
Леонов Юрий
Member

Откуда: Украина, Харьков
Сообщений: 447
Доброго времени суток, уважаемые.

Ситуация такая. Есть cxGrid с TcxGridDBBandedTableView, у которого GridMode := True; Описываю вручную события DataController.OnSortingChanged и DataController.Filter.OnBeforeChange, тут проблем нет, они работают корректно. Кроме этих событий, есть еще реализация события OnFocusedRecordChanged (тут я в зависимости от данных управляю доступностью кнопок на форме).
Так вот сама проблема. При выборе сортировки (если кликнули по колонке), после выполнения всех плановых процедур почему-то еще раз вызывается событие OnFocusedRecordChanged и почему-то передается (AFocusedRecord = nil), хотя строка выделена по итогу. Ну и как результат, все кнопки задизейблены, хотя такого не должно быть (переход на любую запись и возврат опять на первую это подтверждает). Отловить где вызывается еще раз OnFocusedRecordChanged не получилось, но это случается всегда после того как отработало полностью событие DataController.OnSortingChanged. Кто с таким сталкивался, просветите, почему такая ситуация складывается? Заранее благодарен.
24 окт 18, 16:25    [21713870]     Ответить | Цитировать Сообщить модератору
 Re: Сортировка и GridMode  [new]
JaDi
Member

Откуда: Сызрань, Россия
Сообщений: 3862
Потому что события focused и selected будут срабатывать дважды -- при открытии и повторном открытии датасета. Для того, чтобы было все нормально и срабатывало одно -- надо вызывать у грида BeginUpdate/EndUpdate. И вот после EndUpdate и сработают все события (если они были).
24 окт 18, 20:04    [21714218]     Ответить | Цитировать Сообщить модератору
 Re: Сортировка и GridMode  [new]
Леонов Юрий
Member

Откуда: Украина, Харьков
Сообщений: 447
JaDi
Потому что события focused и selected будут срабатывать дважды -- при открытии и повторном открытии датасета. Для того, чтобы было все нормально и срабатывало одно -- надо вызывать у грида BeginUpdate/EndUpdate. И вот после EndUpdate и сработают все события (если они были).


Это и так понятно. Вопрос не в этом, срабатывает дополнительно еще один раз, после отработки события OnSortingChanged. Или я что-то не так понял?
26 окт 18, 09:16    [21715627]     Ответить | Цитировать Сообщить модератору
 Re: Сортировка и GridMode  [new]
DimaBr
Member

Откуда:
Сообщений: 10756
Обычно на кнопки вешают Action-ы и дизаблят в OnUpdate.
Вы дизаблете в зависимости от данных, грид то тут причём ?
Полагаться на OnFocusedRecordChanged не стоит. Завтра поменяете Грид на другой, а в нём нет такого события (гипотетически)
26 окт 18, 09:25    [21715638]     Ответить | Цитировать Сообщить модератору
 Re: Сортировка и GridMode  [new]
JaDi
Member

Откуда: Сызрань, Россия
Сообщений: 3862
Кстати, focused не всегда срабатывает (т.е. фокус может поменяться, но события не будет -- уже не помню, в каких именно ситуациях). Поэтому везде selected использую, он точно всегда работает.
26 окт 18, 09:40    [21715651]     Ответить | Цитировать Сообщить модератору
 Re: Сортировка и GridMode  [new]
Леонов Юрий
Member

Откуда: Украина, Харьков
Сообщений: 447
JaDi
Кстати, focused не всегда срабатывает (т.е. фокус может поменяться, но события не будет -- уже не помню, в каких именно ситуациях). Поэтому везде selected использую, он точно всегда работает.


На selected в бэндовых гридах при переходе постранично пропадает отрисовка, потому и перешел на focused, с ним у меня проблем не было
26 окт 18, 11:52    [21715832]     Ответить | Цитировать Сообщить модератору
 Re: Сортировка и GridMode  [new]
Леонов Юрий
Member

Откуда: Украина, Харьков
Сообщений: 447
DimaBr
Обычно на кнопки вешают Action-ы и дизаблят в OnUpdate.
Вы дизаблете в зависимости от данных, грид то тут причём ?
Полагаться на OnFocusedRecordChanged не стоит. Завтра поменяете Грид на другой, а в нём нет такого события (гипотетически)


А кто говорит про грид? Я работаю с DBBandedTableView, событие это есть и переходить на другой не собираюсь. Если чисто гипотетически надо будет перейти на другой грид, то это будет уже совершенно другая проблема и реализация, ежу понятно.
26 окт 18, 12:53    [21715965]     Ответить | Цитировать Сообщить модератору
 Re: Сортировка и GridMode  [new]
DimaBr
Member

Откуда:
Сообщений: 10756
Леонов Юрий
А кто говорит про грид? Я работаю с DBBandedTableView, событие это есть и переходить на другой не собираюсь. Если чисто гипотетически надо будет перейти на другой грид, то это будет уже совершенно другая проблема и реализация, ежу понятно.

У вас DBBandedTableView - то есть вы работаете с данными в Dataset, а грид - интрумент для отображения данных. Зачем брать данные с промежуточного элемента ? Работайте напрямую с Dataset
26 окт 18, 15:57    [21716289]     Ответить | Цитировать Сообщить модератору
 Re: Сортировка и GridMode  [new]
Леонов Юрий
Member

Откуда: Украина, Харьков
Сообщений: 447
DimaBr
У вас DBBandedTableView - то есть вы работаете с данными в Dataset, а грид - интрумент для отображения данных. Зачем брать данные с промежуточного элемента ? Работайте напрямую с Dataset


Так отрисовка же делается на конечном контейнере, то есть на DBBandedTableView, причем тут Dataset?
29 окт 18, 11:40    [21717806]     Ответить | Цитировать Сообщить модератору
 Re: Сортировка и GridMode  [new]
DimaBr
Member

Откуда:
Сообщений: 10756
Причём здесь отрисовка грида и задизабленные кнопки ? Вы кнопки гасите в зависимости от того где курсор датасета ? Чтобы, например, не давать редактировать какую-то запись.
29 окт 18, 12:24    [21717863]     Ответить | Цитировать Сообщить модератору
 Re: Сортировка и GridMode  [new]
Леонов Юрий
Member

Откуда: Украина, Харьков
Сообщений: 447
DimaBr
Причём здесь отрисовка грида и задизабленные кнопки ? Вы кнопки гасите в зависимости от того где курсор датасета ? Чтобы, например, не давать редактировать какую-то запись.


Да дело даже не в том, на каком событии вешается доступность кнопок. Я хочу понять почему срабатывает событие OnFocusedRecordChanged без фокуса после выполнения события DataController.OnSortingChange. Где-то есть очередность срабатываний событий у TableView? Вот в чем вопрос был, а не то, что мы обсуждаем...
31 окт 18, 11:12    [21719986]     Ответить | Цитировать Сообщить модератору
 Re: Сортировка и GridMode  [new]
Леонов Юрий
Member

Откуда: Украина, Харьков
Сообщений: 447
DimaBr
Причём здесь отрисовка грида и задизабленные кнопки ? Вы кнопки гасите в зависимости от того где курсор датасета ? Чтобы, например, не давать редактировать какую-то запись.


Да дело даже не в том, на каком событии вешается доступность кнопок. Я хочу понять почему срабатывает событие OnFocusedRecordChanged без фокуса после выполнения события DataController.OnSortingChange. Где-то есть очередность срабатываний событий у TableView? Вот в чем вопрос был, а не то, что мы обсуждаем...
31 окт 18, 11:18    [21719991]     Ответить | Цитировать Сообщить модератору
 Re: Сортировка и GridMode  [new]
JaDi
Member

Откуда: Сызрань, Россия
Сообщений: 3862
Леонов Юрий,


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


Вот эти "плановые процедуры" и стоит смотреть, что именно в них делается. А то может датасет там переоткрывается. Тогда срабатывание фокуса логично.
31 окт 18, 11:49    [21720051]     Ответить | Цитировать Сообщить модератору
 Re: Сортировка и GridMode  [new]
vavan
Member

Откуда: Казань
Сообщений: 3163
у них там порой бывает необоснованная лишняя а то и двойная работа в некоторых местах, см. например Q515220, Q515958, Q506338, в какой-то мере Q516328
31 окт 18, 12:02    [21720081]     Ответить | Цитировать Сообщить модератору
 Re: Сортировка и GridMode  [new]
Леонов Юрий
Member

Откуда: Украина, Харьков
Сообщений: 447
JaDi
Леонов Юрий,


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


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


Прошелся по всем процедурам, все нормально отработало, но после выхода из процедуры OnSortingChanged срабатывает еще раз OnFocusedRecordChanged, у которого AFocusedRecord=nil. Это что, нажатие на Header столбца запускает событие изменения сортировки, а потом срабатывает отжатие клавиши мыши и типа теряется фокус? Кто-то может четко прояснить почему так происходит или хотя бы ткните в доку...
5 ноя 18, 16:42    [21724332]     Ответить | Цитировать Сообщить модератору
 Re: Сортировка и GridMode  [new]
JaDi
Member

Откуда: Сызрань, Россия
Сообщений: 3862
Леонов Юрий,

предлагаю сделать тестовый пример (грид, виртуальный датасет с тестовыми данными и парочка событий) и приложить сюда. Заодно подтвердить, что виновато именно OnSorting, а не что-то другое. Потому что гадать на кофейной гуще становится тяжело.
5 ноя 18, 17:16    [21724366]     Ответить | Цитировать Сообщить модератору
 Re: Сортировка и GridMode  [new]
JaDi
Member

Откуда: Сызрань, Россия
Сообщений: 3862
автор
Прошелся по всем процедурам, все нормально отработало


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

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 вообще не срабатывает. Т.е. смотреть надо именно "другой код".

Картинка с другого сайта.
5 ноя 18, 18:31    [21724451]     Ответить | Цитировать Сообщить модератору
 Re: Сортировка и GridMode  [new]
Леонов Юрий
Member

Откуда: Украина, Харьков
Сообщений: 447
JaDi, сделал я тестовый пример, получилось вот такое:

К сообщению приложен файл. Размер - 49Kb
13 ноя 18, 17:46    [21733342]     Ответить | Цитировать Сообщить модератору
 Re: Сортировка и GridMode  [new]
Леонов Юрий
Member

Откуда: Украина, Харьков
Сообщений: 447
в красной рамке - выполнение события DataController.OnSortingChanged
...
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;
13 ноя 18, 17:51    [21733358]     Ответить | Цитировать Сообщить модератору
 Re: Сортировка и GridMode  [new]
Леонов Юрий
Member

Откуда: Украина, Харьков
Сообщений: 447
Меня интересует, откуда вызывается OnFocusedRecordChanged после выполнения сортировки?
13 ноя 18, 17:53    [21733361]     Ответить | Цитировать Сообщить модератору
 Re: Сортировка и GridMode  [new]
ma1tus
Member

Откуда:
Сообщений: 581
Леонов Юрий
управляю доступностью кнопок на форме)
s / GridView.OnFocusedRecordChanged / GridView.DataController.DataSource.DataSet.OnAfterScroll / - не?
13 ноя 18, 18:47    [21733454]     Ответить | Цитировать Сообщить модератору
 Re: Сортировка и GridMode  [new]
JaDi
Member

Откуда: Сызрань, Россия
Сообщений: 3862
Леонов Юрий,

"лишнее" срабатывание OnFocusedRecordChanged идет из-за переоткрытия датасета -- в нем меняется фокус и соответственно девгрид на это реагирует тоже для синхронизации текущего грида с датасетом.

К сообщению приложен файл. Размер - 20Kb
13 ноя 18, 19:49    [21733529]     Ответить | Цитировать Сообщить модератору
 Re: Сортировка и GridMode  [new]
JaDi
Member

Откуда: Сызрань, Россия
Сообщений: 3862
Хмм... Событие 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).
13 ноя 18, 20:22    [21733562]     Ответить | Цитировать Сообщить модератору
 Re: Сортировка и GridMode  [new]
JaDi
Member

Откуда: Сызрань, Россия
Сообщений: 3862
Даже dataset.DisableControls; dataset.EnableControls; приведет к срабатыванию события.
13 ноя 18, 20:26    [21733571]     Ответить | Цитировать Сообщить модератору
 Re: Сортировка и GridMode  [new]
white_nigger
Member

Откуда: Тула
Сообщений: 1933
JaDi
Даже dataset.DisableControls; dataset.EnableControls; приведет к срабатыванию события.
Тем более! И именно по вышеописанной причине. Основная причина - обеспечение консистента для грида и данных. Юзер может что угодно сделать при DisableControls или переоткрытии данных. Может висеть логика на эвентах датасета, может стать невалидными букмарки и т.д. Поэтому надо гарантировано отрефрешить все внутренности датаконтроллера и грида.
13 ноя 18, 22:16    [21733619]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
Все форумы / Delphi Ответить