powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Сортировка и GridMode
37 сообщений из 37, показаны все 2 страниц
Сортировка и GridMode
    #39722292
Леонов Юрий
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Доброго времени суток, уважаемые.

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

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

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

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

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

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

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


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

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


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

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

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

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

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

Код: 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
Сортировка и GridMode
    #39732604
Леонов Юрий
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
JaDi, сделал я тестовый пример, получилось вот такое:
...
Рейтинг: 0 / 0
Сортировка и GridMode
    #39732610
Леонов Юрий
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
в красной рамке - выполнение события 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
Сортировка и GridMode
    #39732612
Леонов Юрий
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Меня интересует, откуда вызывается OnFocusedRecordChanged после выполнения сортировки?
...
Рейтинг: 0 / 0
Сортировка и GridMode
    #39732653
ma1tus
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Леонов Юрийуправляю доступностью кнопок на форме)s / GridView.OnFocusedRecordChanged / GridView.DataController.DataSource.DataSet.OnAfterScroll / - не?
...
Рейтинг: 0 / 0
Сортировка и GridMode
    #39732681
Фотография JayDi
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Леонов Юрий,

"лишнее" срабатывание OnFocusedRecordChanged идет из-за переоткрытия датасета -- в нем меняется фокус и соответственно девгрид на это реагирует тоже для синхронизации текущего грида с датасетом.
...
Рейтинг: 0 / 0
Сортировка и GridMode
    #39732701
Фотография JayDi
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Хмм... Событие 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
Сортировка и GridMode
    #39732706
Фотография JayDi
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Даже dataset.DisableControls; dataset.EnableControls; приведет к срабатыванию события.
...
Рейтинг: 0 / 0
Сортировка и GridMode
    #39732726
white_nigger
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
JaDiДаже dataset.DisableControls; dataset.EnableControls; приведет к срабатыванию события.Тем более! И именно по вышеописанной причине. Основная причина - обеспечение консистента для грида и данных. Юзер может что угодно сделать при DisableControls или переоткрытии данных. Может висеть логика на эвентах датасета, может стать невалидными букмарки и т.д. Поэтому надо гарантировано отрефрешить все внутренности датаконтроллера и грида.
...
Рейтинг: 0 / 0
Сортировка и GridMode
    #39732739
DimaBr
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Одного не могу понять, зачем делать искусственную сортировку в гриде путём переоткрытия запроса ?
...
Рейтинг: 0 / 0
Сортировка и GridMode
    #39732803
Леонов Юрий
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ma1tusЛеонов Юрийуправляю доступностью кнопок на форме)s / GridView.OnFocusedRecordChanged / GridView.DataController.DataSource.DataSet.OnAfterScroll / - не?
Как бы да, но были моменты, из-за которых отказались. Сейчас не вспомню уже, что конкретно
...
Рейтинг: 0 / 0
Сортировка и GridMode
    #39732805
Леонов Юрий
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
JaDiЛеонов Юрий,

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

Я не случайно выделил красным блок лога. Все, что делается между записями в лог - делается целенаправленно. Меня больше интересует почему после отработки этого блока вызывается еще раз OnFocusedRecordChanged (последняя запись в логе)
...
Рейтинг: 0 / 0
Сортировка и GridMode
    #39732806
Леонов Юрий
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DimaBrОдного не могу понять, зачем делать искусственную сортировку в гриде путём переоткрытия запроса ?
При включенном GridMode TableView не делает сам сортировку, фильтрацию и еще кучу полезных дел. Потому я пересобираю руками запрос и заново открываю его
...
Рейтинг: 0 / 0
Сортировка и GridMode
    #39732807
Леонов Юрий
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
JaDiДаже dataset.DisableControls; dataset.EnableControls; приведет к срабатыванию события.
Dataset.Close очищает данные в TableView, например. Это тоже приводит к изменению фокуса. Был, скажем, AFocusedRecord.Index=1, а станет AFocusedRecord=nil. Вариантов много...
...
Рейтинг: 0 / 0
Сортировка и GridMode
    #39732823
goldmi45
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
столько копий сломано, две темы в несколько страниц. ТС, ваш запрос несколько не по адресу.
Если вы хотите понять, зачем, то нужно обращаться в тех. поддержку DevExpress.
Если вы хотите игнорировать вызов OnFocusedRecordChanged при AFocusedRecord=nil, то может проще написать:
Код: pascal
1.
2.
  if not Assigned(AFocusedRecord) then
    Exit;
...
Рейтинг: 0 / 0
Сортировка и GridMode
    #39732838
DimaBr
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Леонов ЮрийПри включенном GridMode TableView не делает сам сортировку, фильтрацию и еще кучу полезных дел. Потому я пересобираю руками запрос и заново открываю его
То есть вы вручную грузите НЕКОТОРОЕ количество записей и сортируете их ? А что же в FText ?
...
Рейтинг: 0 / 0
Сортировка и GridMode
    #39732846
Леонов Юрий
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DimaBrЛеонов ЮрийПри включенном GridMode TableView не делает сам сортировку, фильтрацию и еще кучу полезных дел. Потому я пересобираю руками запрос и заново открываю его
То есть вы вручную грузите НЕКОТОРОЕ количество записей и сортируете их ? А что же в FText ?
В FText при старте я записал текст исходного запроса (типа select * from view where FKey = 66), чтобы потом можно было уже к этому шаблону добавлять необходимые условия сортировок и фильтраций.
...
Рейтинг: 0 / 0
Сортировка и GridMode
    #39732865
DimaBr
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Если select * from , то какой толк от GridMode ?
Я включил GridMode чтобы грузить ЧАСТЬ записей, но сам гружу все, чтобы потом можно было сортировать.
Это напоминает надевание штанов через голову
...
Рейтинг: 0 / 0
Сортировка и GridMode
    #39733131
vavan
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DimaBrЕсли select * from , то какой толк от GridMode ?"select *" отнюдь не значит что будет сразу же зафетчен весь набор, как обычно зависит от датасета и порой режима его работы
...
Рейтинг: 0 / 0
Сортировка и GridMode
    #39733133
Леонов Юрий
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DimaBrЕсли select * from , то какой толк от GridMode ?
Я включил GridMode чтобы грузить ЧАСТЬ записей, но сам гружу все, чтобы потом можно было сортировать.
Это напоминает надевание штанов через голову
Я выбираю все из вьюхи по условиям (есть статические условия и заданные пользователем фильтры).
Датасет читает все данные, но отдает их по частям по мере надобности пользователя, чтобы долго не грузило в грид.
Если пользователь хочет отсортировать данные, то он же будет сортировать не из видимой части TableView, а по всему набору...

Промежуточное решение найдено. Если AFocusedRecord = nil и APrevFocusedRecord = nil, то прерываю обработку.
Пока работает, посмотрю, что будет дальше
...
Рейтинг: 0 / 0
Сортировка и GridMode
    #39733255
Фэйтл Эра
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Леонов Юрий...Датасет читает все данные, но отдает их по частям... :)
...
Рейтинг: 0 / 0
37 сообщений из 37, показаны все 2 страниц
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Сортировка и GridMode
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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