Информация о TDataLink
Автор: James Thorpe (CSA Australasia)
Вот тексовое описание TDatalink, которое взято из моего учебного материала.
Оригинал имеет еще несколько диаграмм и рисунков, которые не могут быть включены
в данный совет. Также рекомендую заглянуть в исходный код модуля DB.PAS.
TFieldDatalink - производный класс от TDataLink, являющийся базовым классом
для объекта, используемого компонентами для работы с базами данных и
осуществляющий функцию связи с набором данных DataSet (TTable или TQuery).
DataLink используется DataSet'ом для информирования всех БД-компонентов об
изменении записи, о необходимости обновления записи перед помещением ее в базу
данных, о том, что DataSet сменила свое состояние на активное или неактивное, и
т.д.. И наоборот, DataLink используется БД-компонентами для обновления DataSet,
например, его статуса.
DataSet может быть связан с несколькими источниками данных DataSource, каждый
DataSource может быть связан с несколькими DataLink, и каждый DataLink может
быть связан с единственным БД-компонентом. В большинстве случаев, отдельный
компонент использует только один DataLink, тем не менее, имеются компоненты,
такие как, например, DBLookupList или DBLookupCombo, использующих два DataLink.
В этих элементах управления первый DataLink используется для чтения данных из
lookup DataSet, второй DataLink используется для записи этих данных (при их
изменении) во второй имеющийся DataSet. Каждый DataSet поддерживает связанный с
ним список DataSource и, аналогично этому, каждый DataSource поддерживает список
связанных с ним Datalink'ов.
В момент, когда DataSet должен уведомить БД-компоненты о наступлении
какого-то события, например, при изменении пользователем какой-либо записи, он
рассылает это сообщение всем DataSource, находящимся в его списке. Каждый
DataSource затем повторяет этот процесс и рассылает сообщение всем Datalink'ам,
находящимся в его списке. Другими словами, связь не зависит от элемента
управления, при этом логика программирования должна отслеживать передачу
сообщения каждому элементу управления, пользующемуся услугами DataLink и
изолировать только те события, на которые элементу необходимо отреагировать.
Связывая компонент с набором данных другим способом, мы не получим в свое
распоряжение столько управляющих функций, гибкости и мониторинга, сколько даст
нам один DataSet, соединенный с помощью DataLink.
Кроме функции обеспечения поддержания коммуникационного канала между DataSet
и ДБ-компонентами, DataLink также обеспечивает управление буфером для каждого
компонента. Большинство элементов управления, таких как, например, TDBEdit,
отображающий только отдельно взятую запись, буферизация не требуется, тем не
менее, таким компонентам, как, например, TDBGrid и TDBLookupList, отображающим
множество записей, буферизация нужна. Физически DataLink данные не буферизирует,
эта функция выполняется DataSet. Всесто этого DataLink поддерживает виртуальный
буфер, который, в сущности, небольшое "окно" в физический буфер DataSet. Размер
этого виртуального буфера может быть установлен с помощью свойства DataLinks
BufferCount, а количество записей, реально в нем хранимых, с помощью свойства
RecordCount.
|