Переназначение TDataSource во время выполнения
Способ совмещения курсоров не является единственным для обеспечения работы с НД из разных форм. Другой способ состоит в переадресации компонента TDaгaSource во время выполнения.
Пусть имеется задача, когда из разных форм нужно работать с одним и тем же НД. Частным случаем данной задачи является форма обновления записей, рассмотренная в предыдущем разделе. В этом случае необходимо:
1. В родительской форме расположить компоненты TDataSource (назовем его DataSourcel), TTable, TDBGrid (или иные визуальные компоненты для
работы с БД) и связать указанные компоненты между собой стандартным способом.
2. Во всех дочерних таблицах расположить компоненты TDataSource (назовем его DataSource2), TDBEdit (или иные визуальные компоненты для работы с БД) и связать их с DataSource2. При этом свойство DataSource2.DataSet не должно указывать ни на какой НД, т.е. должно оставаться пустым в инспекторе объектов во время проектирования, а во время выполнения в обработчике события создания дочерней формы полезно поместить предложение DataSource2.DataSet := nil;
Часто бывает полезным для присваивания имен полей расположить в дочерней форме еще и компонент TTable, связав его стандартным образом с DataSource2 и визуальными компонентами для работы с НД. Однако после этого компонент Table нужно из дочерней формы удалить и очистить свойство DataSource2. DataSet описанным выше образом.
3. Во время выполнения в обработчик события активизации дочерней формы или при вызове дочерней формы из родительской необходимо поместить предложение
DataSource2.DataSet := ИМяРодительскойФормы.ИмяКомпонентаТаЬ1е;
Таким образом, DataSource дочерней формы будет указывать на НД из родительской формы и работать с его текущей записью.
Изменение в дочерней форме местоположения курсора НД приведет к тому, что данное изменение будет актуально и в родительской форме, равно как любые действия по изменению, добавлению и удалению записей НД, произведенные в дочерней форме. Причина простая: и родительская, и дочерняя формы работают с одним и тем же НД.
Подобные действия можно реализовать в любом количестве дочерних форм, таким образом одновременно работая с одним и тем же набором данных из разных форм.
4. При деактивизации дочерней формы необходимо разрушить связь между DataSource дочерней формы и НД из родительской формы, включив в обработчик события деактивизации дочерней формы предложение
DataSource2.DataSet := nil;