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

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

Не обновляются данные после EnableControls [D5]


Ega23 ©   (2005-11-02 14:49:00) 

Есть свой DB-компонент. Потребовалось добавить реакцию на DataSet.Post
Пошёл самым простым путём (как мне показалось):
у потомка TDataLink для данного компонента переопределил метод UpdateData, написал свой обработчик. Всё прекрасно работает, всё что надо - обновляется.
Но как только "обкладываю" DataSet DisableControls/EnableControls - всё перестаёт обновляться.
Как я понимаю, связано это со свойством ActiveControl и "рубится" на уровне TDataSource.

Вопрос: как мне это обойти?


Ega23   (2005-11-03 11:06:00) [1]


> Пройди отладчиком. В DataSource.DateEvent есть цикл перебора
> дейталинков. Но для вызова метода линка уть условия по статусу.
>  Нужно понять - почему не отрабатывает. Ctrl+Клик мыши тебе
> в помощь.
>


Значит так. Все изыски привели к следующему:
1. Событие действительно проходит. Только не UpdateData, а RecordChanged. Проходит оно после включения EnableControls (до этого вообще никаких событий до DataSource не доходит).
2. Перечитывать приходится всё дерево. В отличие от DBGrid'а я не могу "кусками" данные читать.
Вот такие вот результаты.


ANB   (2005-11-03 09:28:00) [2]


> Ega23 ©   (02.11.05 18:03) [14]

Пройди отладчиком. В DataSource.DateEvent есть цикл перебора дейталинков. Но для вызова метода линка уть условия по статусу. Нужно понять - почему не отрабатывает. Ctrl+Клик мыши тебе в помощь.


Ega23   (2005-11-02 18:03:00) [3]


> А сравнение и анализ call stack в
> TGridDataLink.UpdateData;
> TTreeDataLink.UpdateData;
> на какие-нибудь мысли не наталкивает?
>


Не-а. В случае, если Disable/EnableControls вллючено до TTreeDataLink вообще ничего не доходит.
А если отключено - то всё ОК.


Владислав   (2005-11-02 17:51:00) [4]

Вопрос на засыпку...
А сравнение и анализ call stack в
TGridDataLink.UpdateData;
TTreeDataLink.UpdateData;
на какие-нибудь мысли не наталкивает?


Ega23   (2005-11-02 17:47:00) [5]

Так. Ситуация малость проясняется.
Приходим на TDataSource.DataEvent - это ещё не по команде Post, это по команде Edit. C Post - сложнее...


Ega23   (2005-11-02 17:31:00) [6]


> У DataSource есть метод DateEvent


Значит так. Установил флажок Use Debug DCUs, бросил на форму моё DB-дерево и стандартный DBGrid. Также имеем связку ADOQuery->DataSetProvider->ClientDataSet->DataSource.
Оба компонента "смотрят" на этот DataSource, навигация, синхронизация - всё как надо. Теперь пытаемся апдейтить одно из полей ClientDataSet. Если без Enable/DisableControls - всё ОК. И в гриде и в дереве обновляется текст.
Включаем Enable/DisableControls, ставим точку останова на:
1. TDataSource.DataEvent
2. TGridDataLink.UpdateData;  // это потомок TDataLink у грида
3. TTreeDataLink.UpdateData; // это уже мой потомок TdataLink.

Делаем update поля.
Результат:
1. Приходим в TGridDataLink.UpdateData!!!! Т.е. до TDataSource.DataEvent ещё не дошли!
2. Приходим на TDataSource.DataEvent (как я понял, этот переход инициирует непосредственно грид).
В мой обработчик так и не проваливаемся.


ANB   (2005-11-02 17:23:00) [7]

Точна - метод вызывается : TDataLink.DataEvent.


ANB   (2005-11-02 17:21:00) [8]

Кстати, а почему у тебя после Post данные то не обновлялись ? Стандартные компоненты редактирования (в т.ч. EhGrid) обновляются . . . Вроде . . . Во всяком случае новый ID с сервера приезжает.


ANB   (2005-11-02 17:19:00) [9]

У DataSource есть метод DateEvent


ANB   (2005-11-02 16:41:00) [10]


> Какое событие TdataLink отвечает за это?

Не знаю. Не факт, что есть событие. Надо АП ждать.


Ega23   (2005-11-02 16:37:00) [11]


> Такс. По идее твой компонент должен получать оповещение
> через TDataLink о применении методов Disable/Enable. Либо
> ты эту штуку сломал, либо по прежнему получает, но не работает.
>


Какое событие TdataLink отвечает за это?


ANB   (2005-11-02 16:33:00) [12]

Такс. По идее твой компонент должен получать оповещение через TDataLink о применении методов Disable/Enable. Либо ты эту штуку сломал, либо по прежнему получает, но не работает.


Ega23   (2005-11-02 16:06:00) [13]


> Не понял. Ты же вроде свой дейтасет написал. Контролы к
> нему привязаны ?


Я свой TDBTreeView написал. Пока у него реакция на DataSet.ActiveChanged и DataSet.DataSetChanged была.
Понадобилось реакцию на обновление данных напрямую в DataSet'е добавить.


ANB   (2005-11-02 15:53:00) [14]


> Ega23 ©   (02.11.05 14:59) [2]

Не понял. Ты же вроде свой дейтасет написал. Контролы к нему привязаны ?


Ega23   (2005-11-02 14:59:00) [15]


> Тупорыло - посему ИМХО. Переопредели EnableControls и воткни
> туда вызов UpdateData.


Переопределить у TClientDataSet?


ANB   (2005-11-02 14:56:00) [16]


> Ega23 ©   (02.11.05 14:49)

Тупорыло - посему ИМХО. Переопредели EnableControls и воткни туда вызов UpdateData.


Наверх

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