Страница 1 из 1

RxDBGrid. Хочется странного

СообщениеДобавлено: 10.06.2019 12:27:23
Lucifer
По некоторой логике хочется действительно странного. При скролле в гриде, когда достигнута первая строка, надо "замораживать" курсор именно на ней. Поскольку у самого грида события скролла недоступны, то сделан хак, который многократно уже описан и приводить его тут смысла нет. Но! Он не работает! То есть, мне в прогу событие, что я что-то там проскроллил, не прилетает. Хотя сам скролл при этом работает нормально. Код на всякий:
Код: Выделить всё
  TDBGridFreind = class (TRxDBGrid)
    procedure WMVScroll(var Msg: TLMVScroll); message LM_VSCROLL;
  end;

...

procedure TDBGridFreind.WMVScroll(var Msg: TLMVScroll);
var
  OldRow: Integer;
begin
  inherited WMVScroll(Msg);
  ShowMessage(IntToStr(Msg.ScrollCode));
  case Msg.ScrollCode of
    SB_PAGEUP, SB_TOP:
    begin
      OldRow := TDBGridFreind(Form1.dgMemBig).Row;
      if OldRow = 1 then
      begin
        Form1.fGotoFirst := True;
        Form1.fCellClick := False;
      end;
    end;
  end;
end;



P.S. CodeTyphon 5.7, FPC 3.1.1, Rev. SVN 51797

Re: RxDBGrid. Хочется странного

СообщениеДобавлено: 10.06.2019 14:30:54
Alex2013
Первая мысль: вызов inherited WMVScroll(Msg); "съел" событие (попробуй поставить после своего кода ), а ShowMessage вызывается далеко не из любого места в коде. (и вообще это "плохая практика")

Re: RxDBGrid. Хочется странного

СообщениеДобавлено: 10.06.2019 16:47:30
alexs
Честно говоря - не понял

Re: RxDBGrid. Хочется странного

СообщениеДобавлено: 11.06.2019 11:34:32
Lucifer
Alex2013 писал(а):Первая мысль: вызов inherited WMVScroll(Msg); "съел" событие (попробуй поставить после своего кода ), а ShowMessage вызывается далеко не из любого места в коде. (и вообще это "плохая практика")


Да я его всяко пихал. Не срабатывает. А ShowMessage - это просто попытка выловить тот самый месседж. Да хоть какой-то месседж.

Добавлено спустя 4 минуты 36 секунд:
alexs писал(а):Честно говоря - не понял


Да я тоже с трудом понимаю. :-) Ситуация такая, что надо отлавливать именно клики по скроллеру грида. Долистали до самой верхней видимой строки - заморозили курсор именно в ней. Чтоб всегда была выделена именно первая строка. Для чего: есть список заказов (таксишная прога). Курсор всегда следует за выделенной строкой в зависимости от статуса заказа. То есть, выделен всегда один и тот же заказ. А логику надо поменять так, что если оператор долистает до верха грида (не набора данных! Там может быть совсем иной порядок данных), то всегда будет выделена именно первая строка независимо ни от чего. До тех пор, пока оператор или не уйдет с нее, или не кликнет мышой в гриде. Для кнопок курсора и PgUP я сделал, и оно работает. А вот отловить события скроллера не получается.

Re: RxDBGrid. Хочется странного

СообщениеДобавлено: 13.06.2019 00:54:58
zoltanleo
Lucifer писал(а): если оператор долистает до верха грида (не набора данных! Там может быть совсем иной порядок данных)

ты уверен, что не путаешь понятия набора данных и таблицы БД? Как гласят каноны, грид данных не содержит, но прямо отображает их из подключенного набора данных. Т.о., первая строка грида - это первая запись набора данных.

А события скроллинга легко отлавливать в OnMouseWheel грида, анализируя параметр WheelDelta.

Re: RxDBGrid. Хочется странного

СообщениеДобавлено: 13.06.2019 16:13:41
Lucifer
zoltanleo писал(а):
Lucifer писал(а): если оператор долистает до верха грида (не набора данных! Там может быть совсем иной порядок данных)

ты уверен, что не путаешь понятия набора данных и таблицы БД? Как гласят каноны, грид данных не содержит, но прямо отображает их из подключенного набора данных. Т.о., первая строка грида - это первая запись набора данных.

А события скроллинга легко отлавливать в OnMouseWheel грида, анализируя параметр WheelDelta.


В данном случае не путаю. Потому что нужно событие OnScroll именно. На датасете это не сделать ни разу. Или я просто тупой и не смог. Потому что датасет периодически рефрешится, следовательно у него событие AfterScroll возникает при каждом обновлении. Мне же это не нужно.

OnMouseWheel Я и так обработал. Там как раз все просто и понятно. А вот клик по скроллу - хрен.

P.S. Ладно. Нет - так нет. На чем и закроем тему.

Re: RxDBGrid. Хочется странного

СообщениеДобавлено: 13.06.2019 23:05:53
olegy123
DataSet.RecNo - не подойдет?

OnScroll может не выполнятся если DataSet.DisableControls / DataSet.EnableControls

Добавлено спустя 8 минут 2 секунды:
Lucifer писал(а):Потому что датасет периодически рефрешится, следовательно у него событие AfterScroll возникает при каждом обновлении. Мне же это не нужно.
вообще то нужно смотреть на статусы DataSet.State => TDataSetState = (dsInactive, dsBrowse, dsEdit, dsInsert, dsSetKey,
dsCalcFields, dsFilter, dsNewValue, dsOldValue, dsCurValue, dsBlockRead,
dsInternalCalc, dsOpening, dsRefreshFields);