![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Компонент для работы с базами данных DataSet или DataSource? [D5]
Rep © (2005-05-17 14:19:00)Хочу попробовать написать визуальный компонент для работы с базами. И вот столкнулся с выбором типа свойства источника данных.
Везде в компонентах используется TDataSource для связи визуальных компонентов с не визуальными.
А зачем? Почему нельзя использовать напрямую TDataSet?
Чем это может быть чревато? ведь в конечном счете все равно придется писать:
DataSource.DataSet.....
Юрий Зотов (2005-05-20 12:23:00) [1]> jack128 © (19.05.05 17:29) [12]
> Это не читать..
Жень, давай остальное тоже читать не будем, ладно?
Загляни в VCL и перечитай [7] и [8]. Неохота снова воду в ступе не толочь.
jack128 (2005-05-19 17:29:00) [2]jack128 © (19.05.05 17:28) [11]
Борланды бы написали
TDataSet = class
FDataLinks: array of TList
end;
Это не читать..
jack128 (2005-05-19 17:28:00) [3]Юрий Зотов © (18.05.05 22:50) [10]
то придем ровно к той же ситуации, о которой уже говорилось - все разработчики совершенно разных DataSet'ов будут вынуждены писать какую-то часть кода методом Copy-Paste.
Это какую??? Нету такой части и быть не может. DataSource - это вообще не класс, это можно сказать запись(ну фигурально выражаясь). Чистые данные без кода.
Борланды бы написали
TDataSet = class
FDataLinks: array of TList
end;
Юрий Зотов © (18.05.05 22:50) [10]
Ситуация с DataSource похожа
Ничуть. В отличии от StringList'а DataSet сам по себе является компонентом и мы вполне могли бы ссылаться на него из DBControl'ов напрямую(а не через DataSource как сейчас) в дезигн тайм.
Юрий Зотов © (18.05.05 22:50) [10]
Нет, Жень, велик и мудр дядька Борланд.
Не спорю, но все мы люди, в том числе Борланды ;)
Юрий Зотов (2005-05-18 22:50:00) [4]> jack128 © (18.05.05 19:46) [9]
> а что тогда делает DataLink то ???
Ты же сам сказал - "работа по нотификации страждущих об изменнении данных (страждущих - это не только контролы, но и например подчиненные датасеты) - этим занимается DataLink".
> Где здесь место DataSource'у то?
> А места этого нету. Знаешь в каком контексте чаще всего
> встречается DataSources в методах DataSet'a?
> то есть datasource - это просто список DataLink'ов - и не
> больше..
Знаю, Жень. Но место для DataSourcе все же есть. Как раз потому, что ты прав - по сути, это именно список DataLink'ов. И поместить его в контрол нельзя, в контроле нужен только один элемент этого списка, а если поместить его в DataSet, то придем ровно к той же ситуации, о которой уже говорилось - все разработчики совершенно разных DataSet'ов будут вынуждены писать какую-то часть кода методом Copy-Paste.
То есть, список DataLink'ов нужен, и нужен он отдельно от всего. Хорошо, ну а где же он тогда должен быть, чтобы простой неискушенный юзер мог легко и просто добавлять/удалять в/из него DataLink'и?
Ответ напрашивается - этот список DataLink'ов надо выполнить внутри невизуального компонента, который можно положить на форму и настроить в ИО. Борланд так и сделала. И назвала этот компонент TDataSource.
Имела полное право, согласись?
:о)
P.S.
У тебя никогда не возникало желания написать компонентскую оболочку вокруг TSringList? Просто контейнер набора строк, единственный смысл которого в том, что с ним можно работать в ИО?
У меня возникало. И у других тоже, знаю таких. Ситуация с DataSource похожа, но заметно сложнее - требуется простановка ссылок и из него, и на него. Эта простановка должна быть именно в ИО, поскольку при проектировании форм состав контролов, привязанных к DataSource меняется довольно часто, и не в коде, а мышкой. Согласись, что менять что-то мышкой и быть вынужденным тут же лезть в код и что-то править еще и там - это нонсенс. Поэтому в DBControl'ах и появилось свойство DataSource - а куда оно еще может ссылаться, как не компонент? Только на компонент. А чем же еще может быть этот компонент, как не оболочкой вокруг списка DataLink'ов?
Нет, Жень, велик и мудр дядька Борланд.
jack128 (2005-05-18 19:46:00) [5]Юрий Зотов © (18.05.05 9:30) [8]
Задача DataSet'а - работа с БД.
Задача DataSourc'а - работа с контролами
а что тогда делает DataLink то ??? В том то и дело, что что есть две задачи: работа с данными(эту задачу решает DataSet) и работа по нотификации страждущих об изменнении данных(страждущих - это не только контролы, но и например подчиненные датасеты) - этим занимается DataLink. Где здесь место DataSource'у то??
А места этого нету. Знаешь в каком контексте чаще всего встречается DataSources в методах DataSet'a?
for I := FDataSources.Count - 1 downto 0 do
with TDataSource(FDataSources[I]) do
for J := FDataLinks.Count - 1 downto 0 do
то есть datasource - это просто список DataLink'ов - и не больше..
Юрий Зотов (2005-05-18 09:30:00) [6]> jack128 © (17.05.05 22:59) [6]
> а почему дата линки связываются с datasource'ами, а не с
> DataSet'ом ?? Что я не вижу никакого особого функционала у
> TDataSource'a.. Нафиг сделано это промежуточное звено??
Это не "нафиг", Жень, это еще одно проявление величия и мудрости дядьки Борланда. Сделано было еще в Delphi 1, когда не было компонентов прямого доступа к БД и все работали через BDE. Но если бы они этого не сделали, то все последующие разработчики таких компонентов были бы вынуждены писать существенную часть кода методом Copy-Paste (в части работы с контролами).
Задача DataSet'а - работа с БД.
Задача DataSourc'а - работа с контролами.
Две принципиально разные задачи - два совершенно разных компонента. Это один из общих принципов построения VCL. Который, вместе с другими принципами и позволяет ей быть вечно расширяемой, а не вечно переписываемой.
Наверное, то же самое можно было реализовать и иначе. Но они выбрали именно такое решение - их право. И, как показали последующие 10 лет, решение это себя вполне оправдывает.
Ученик (2005-05-17 23:07:00) [7]>jack128 © (17.05.05 22:59) [6]
Наверно, для простоты подключения различных TDataSet-ов
jack128 (2005-05-17 22:59:00) [8]Юрий Зотов © (17.05.05 21:40) [5]
как в DB-контролах используется встроенный в них объект TDataLink - сразу все увидите сами.
а почему дата линки связываются с datasource'ами, а не с DataSet'ом ?? Что я не вижу никакого особого функционала у TDataSource'a.. Нафиг сделано это промежуточное звено??
Юрий Зотов (2005-05-17 21:40:00) [9]> Rep © (17.05.05 14:52) [2]
> к тем же полям я могу обращатся как через DataSet
Не можете. Вот, допустим, поле изменилось и все отображающие его контролы должны обновиться. А как они об этом узнают?
Посмотрите в исходниках VCL, как в DB-контролах используется встроенный в них объект TDataLink - сразу все увидите сами.
(2005-05-17 16:55:00) [10]Удалено модератором
Примечание: Оффтопик. Создайте свою ветку.
(2005-05-17 16:55:00) [11]Удалено модератором
Примечание: Дубль.
Rep (2005-05-17 14:52:00) [12]
> Anatoly Podgoretsky © (17.05.05 14:30) [1]
Я не прочь принять решения борланда. но я хочу понять зачем использовать DataSource, если к тем же полям я могу обращатся как через DataSet
Anatoly Podgoretsky (2005-05-17 14:30:00) [13]Принимай решения Борланда как есть, не нравится, отказывайся от решений Борланда, может найдешь, что ни будь не данного типа, хотя тяжело будет.