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

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

Событие "AfterOpen" в TDBGrid


Страницы:   1 2

AlexAA ©   (2010-02-24 11:38:00) 

Добрый день!

Как в TDBGrid'e поймать момент выполнения запроса? А еще лучше момент, когда запрос только выполнился и данные получены.
Уточню: DataSet'ом является TADOQuery.


AlexAA   (2010-02-24 14:44:00) [21]

Да, действительно случай частный.
Ловить открытие датасета нужно для построения некоева подкомпонента для внутренних нужд. В этом подкомпоненте парсится весь текст запроса на составные части. В общем эти данные нужны только в двух случаях: 1) При поднятии формы выбора полей сортировки. 2) При клике с альтом на заголовоке.

Просто не хотелось каждый раз чистить подкомпонент и заполнять снова. Хотя процессорного время на это уходит не так уж много.


Ega23   (2010-02-24 14:41:00) [22]

Сейчас перечитал твой вопрос. Вобщем, попробуй завязаться на TDataSource.OnStateChange, где проанализируй свойство State.
Но, опять же, это не избавит тебя от проблемы TDataSet.DisableControls/ TDataSet.EnableControls


Ega23   (2010-02-24 14:30:00) [23]

Я думаю, что тебе для решения твоей частной задачи достаточно будет завязаться на события TDataSource.
Ты лучше опиши саму задачу, бо народу тут опытного дофига, наверняка твою задачу уже кто-то решал.
DBGrid с нуля отрисовывать ты умучаешься, факт.


AlexAA   (2010-02-24 14:22:00) [24]


> Ega23 ©   (24.02.10 13:45) [6]


Спасибо за подробное разъяснение.

Значит мне нужно переделать TGridDataLink под себя.
Потребутеся перекрыть TDataLink.DataEvent.

Реально ли как-то подменить privat'ный FDataLink или придется переписывать весь TCustomDBGrid (такая задача передо мной ставится впервые) ?


Ega23   (2010-02-24 13:45:00) [25]

А, ну и вдогонку: DataSet понятия не имеет о том, сколько различных контролов на него "смотрит" (и смотрит ли вообще). DataSet знает только список TDataSource, которые "смотрят" на него. И при своих внутренних событиях (если не включено DisableControls) DataSet транслирует эти события всему списку TDataSource.
Соответственно, все TDataSource понятия не имеют о природе компонентов, которые "смотрят" на него, у него есть список TDataLink, которым DataSource перетранслирует полученные события от TDataSet.
Ну а уж как ты свой потомок DataLink организуешь - это твоё личное дело.
К примеру, у меня когда-то давно был написан невизуальный компонент TDBImageList, который работал как стандартный, но картинки сосал из базы.


Ega23   (2010-02-24 13:39:00) [26]


> Так в том и дело, что нужно определить событие в TDBGrid'e.
> В ADOQuery не подходит.
>
> Другими словами, как grid узнает, о том, что записи загружены
> и их нужно отобразить?
>
> В исходниках не нашел ничего похожего на то, что Query сообщает
> grid'y о том, что надо отобразить записи.


В общем "академическом" случае - никак. У TDataSet есть метод DisableControls и парный ему EnableControls. Суть такова, что если было выставлено DataSet.DisableControls, то при любых событиях TDataSet (изменение позиции курсора, добавлении-изменении-удалении записей, переоткрытии запроса) данные события не доходят до всех TDataSource, которые "смотрят" на твой TDataSet.
Соответственно, при "включении" TDataSet.EnableControls во все DB-Aware контролы приходит событие OnDataChange.
Поэтому в общем случае узнать нельзя.

ИМХО, это не совсем правильно, что разработчики VCL не ввели дополнительное событие в DataSource (или в DataLink), что в DataSet был вызван EnableControls. Геморроя добавляется очень много, особенно в случае компонентов типа TDBTreeView (когда требуется полный набор данных, зафетченный до конца, дабы дерево правильно можно было построить).


12   (2010-02-24 13:08:00) [27]

у грида есть FDataLink: TGridDataLink;
а там
TGridDataLink = class(TDataLink)
 private
   FGrid: TCustomDBGrid;
далее  вызывается FGrid/DataChange


> В ADOQuery не подходит.

почему?


Медвежонок Пятачок   (2010-02-24 13:04:00) [28]

Так в том и дело, что нужно определить событие в TDBGrid'e.

Чтобы у грида было событие афтероупен, у него сначала должен появиться метод Оупен.
Чтобы был момент когда уже АфтерОупен настало.


AlexAA   (2010-02-24 12:59:00) [29]


> 12 ©   (24.02.10 11:59) [1]
> ну так наверное и нужно смотреть ADOQuery1AfterOpen


Так в том и дело, что нужно определить событие в TDBGrid'e.

В ADOQuery не подходит.

Другими словами, как grid узнает, о том, что записи загружены и их нужно отобразить?

В исходниках не нашел ничего похожего на то, что Query сообщает grid'y о том, что надо отобразить записи.


12   (2010-02-24 11:59:00) [30]

ну так наверное и нужно смотреть ADOQuery1AfterOpen


Страницы:   1 2

Наверх

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