Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Как отловить момент, когда в DBGrid-е перешли на другую запись?


Bless ©   (2006-07-03 12:58:00) 

Очевидный ответ - написать обработчик события ADODataSet1.AfterScroll.

Но тут имеется один неприятный момент:
если мы находясь посредине грида (не обязательно посредине, лишь бы не на первой(последней) записи), нажимая стрелочки (именно стрелочки, а не home, end), попали на первую (последнюю) запись, то последующее нажатие клавиши вверх (вниз) сгенерирует еще одно событие AfterScroll, хотя мы так и остаемся на первой (последней) записи.

И хотя такое поведение вполне объяснимо, эти два AfterScroll-а с точки зрения моей логики лишние.
Как бы мне отследить, что хотя AfterScroll возник, на другую запись мы не перешли?


  (2006-07-04 15:00:00) [1]

Удалено модератором


Johnmen   (2006-07-04 11:49:00) [2]

>Bless ©

Я бы запоминал значение ключевого поля в BeforeScroll, а в AfterScroll сравнивал с текущим и при несовпадении давил бы деталь (если она активна).


ЮЮ   (2006-07-04 02:49:00) [3]


> Медвед   (03.07.06 21:31) [10]

Для закрытия, естественно (см.[7]). Это понятно и ежу  :)


  (2006-07-03 21:31:00) [4]

Удалено модератором


Bless   (2006-07-03 19:47:00) [5]


> evvcom ©   (03.07.06 17:35) [8]
> Не вижу проблемы.



> Bless ©   (03.07.06 17:23) [7]
> Это не проблема и  я ее уже решил.


evvcom   (2006-07-03 17:35:00) [6]

> [7] Bless ©   (03.07.06 17:23)

Надеюсь в нижний грид/датасет ключевой параметр передаешь? Ну и сравнивай его с полем в верхнем гриде/датасете и делай вывод, переоткрывать или нет. Не вижу проблемы.


Bless   (2006-07-03 17:23:00) [7]

Плохиш ©   (03.07.06 15:16) [6]>

Есть два грида. В нижнем гриде отображаются некоторые данные, соответствующие текущей строке в верхнем гриде. Короче говоря, master-detail.
Но я не хочу переоткрывать датасет, соответствующий нижнему гриду всякий раз, как изменилась запись в первом датасете, чтоб не гонять ненужные запросы по сети в случае простого скроллирования по верхнему гриду в поисках нужной записи.
Нижний датасет открываю только по даблклику (или Enter-у).
И закрываю, когда на верхнем гриде ушли с текущей записи (OnAfterScroll).
Все нормально. Вот только если человек даблкликнул на первой строчке в верхнем гриде (нижний грид заполнился), а потом (пусть нечаянно) нажал кнопочку "вверх", то AfterScroll закроет нижний грид, хотя запись в верхнем гриде осталась той же.

Это не проблема и  я ее уже решил. Просто хотелось услышать чужие мнения по этому поводу. Всегда есть вероятность, что тривиальный ответ лежит на поверхности, а я его не вижу :)
Короче, я надеялся, а вдруг будет ответ в духе "RTFM, набери слово .... и нажми F1"


Плохиш   (2006-07-03 15:16:00) [8]


> Bless ©   (03.07.06 14:08) [5]

Можно узнать, что за обработка проводиться, что для неё критично количество вызовов событий OnAfterScroll?


Bless   (2006-07-03 14:08:00) [9]

проверяй BOF, EOF. по идее первый переход не взведет этот флаг, а во втором он будет установлен.

Но ведь на первую запись и по Ctrl+Home могли переместиться, а в этом случае bof= true сразу.
Я хочу сказать, не всякому bof = true соответствует фальшивый AfterScroll.


sniknik   (2006-07-03 13:20:00) [10]

> Как бы мне отследить, что хотя AfterScroll возник, на другую запись мы не перешли?
проверяй BOF, EOF. по идее первый переход не взведет этот флаг, а во втором он будет установлен.


Плохиш   (2006-07-03 13:19:00) [11]


> Как бы мне отследить, что хотя AfterScroll возник, на другую
> запись мы не перешли?

Проверяй Bof и Eof у DataSet


Плохиш   (2006-07-03 13:15:00) [12]


> Посмотри в сторону TDataSource.OnDataChange

Он тоже два раза вызывается.


Ega23   (2006-07-03 13:11:00) [13]

Посмотри в сторону TDataSource.OnDataChange


Наверх

Титульная страница Поиск, карта сайта Написать письмо