Текущий архив: 2005.12.11;
Скачать: CL | DM;
ВнизКомпонент для работы с базами данных DataSet или DataSource? Найти похожие ветки
← →
Rep © (2005-05-17 14:19) [0]Хочу попробовать написать визуальный компонент для работы с базами. И вот столкнулся с выбором типа свойства источника данных.
Везде в компонентах используется TDataSource для связи визуальных компонентов с не визуальными.
А зачем? Почему нельзя использовать напрямую TDataSet?
Чем это может быть чревато? ведь в конечном счете все равно придется писать:
DataSource.DataSet.....
← →
Anatoly Podgoretsky © (2005-05-17 14:30) [1]Принимай решения Борланда как есть, не нравится, отказывайся от решений Борланда, может найдешь, что ни будь не данного типа, хотя тяжело будет.
← →
Rep © (2005-05-17 14:52) [2]
> Anatoly Podgoretsky © (17.05.05 14:30) [1]
Я не прочь принять решения борланда. но я хочу понять зачем использовать DataSource, если к тем же полям я могу обращатся как через DataSet
← →
имя (2005-05-17 16:55) [3]Удалено модератором
Примечание: Оффтопик. Создайте свою ветку.
← →
имя (2005-05-17 16:55) [4]Удалено модератором
Примечание: Дубль.
← →
Юрий Зотов © (2005-05-17 21:40) [5]> Rep © (17.05.05 14:52) [2]
> к тем же полям я могу обращатся как через DataSet
Не можете. Вот, допустим, поле изменилось и все отображающие его контролы должны обновиться. А как они об этом узнают?
Посмотрите в исходниках VCL, как в DB-контролах используется встроенный в них объект TDataLink - сразу все увидите сами.
← →
jack128 © (2005-05-17 22:59) [6]Юрий Зотов © (17.05.05 21:40) [5]
как в DB-контролах используется встроенный в них объект TDataLink - сразу все увидите сами.
а почему дата линки связываются с datasource"ами, а не с DataSet"ом ?? Что я не вижу никакого особого функционала у TDataSource"a.. Нафиг сделано это промежуточное звено??
← →
Ученик (2005-05-17 23:07) [7]>jack128 © (17.05.05 22:59) [6]
Наверно, для простоты подключения различных TDataSet-ов
← →
Юрий Зотов © (2005-05-18 09:30) [8]> jack128 © (17.05.05 22:59) [6]
> а почему дата линки связываются с datasource"ами, а не с
> DataSet"ом ?? Что я не вижу никакого особого функционала у
> TDataSource"a.. Нафиг сделано это промежуточное звено??
Это не "нафиг", Жень, это еще одно проявление величия и мудрости дядьки Борланда. Сделано было еще в Delphi 1, когда не было компонентов прямого доступа к БД и все работали через BDE. Но если бы они этого не сделали, то все последующие разработчики таких компонентов были бы вынуждены писать существенную часть кода методом Copy-Paste (в части работы с контролами).
Задача DataSet"а - работа с БД.
Задача DataSourc"а - работа с контролами.
Две принципиально разные задачи - два совершенно разных компонента. Это один из общих принципов построения VCL. Который, вместе с другими принципами и позволяет ей быть вечно расширяемой, а не вечно переписываемой.
Наверное, то же самое можно было реализовать и иначе. Но они выбрали именно такое решение - их право. И, как показали последующие 10 лет, решение это себя вполне оправдывает.
← →
jack128 © (2005-05-18 19:46) [9]Юрий Зотов © (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 22:50) [10]> 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-19 17:28) [11]Юрий Зотов © (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]
Нет, Жень, велик и мудр дядька Борланд.
Не спорю, но все мы люди, в том числе Борланды ;)
← →
jack128 © (2005-05-19 17:29) [12]jack128 © (19.05.05 17:28) [11]
Борланды бы написали
TDataSet = class
FDataLinks: array of TList
end;
Это не читать..
← →
Юрий Зотов © (2005-05-20 12:23) [13]> jack128 © (19.05.05 17:29) [12]
> Это не читать..
Жень, давай остальное тоже читать не будем, ладно?
Загляни в VCL и перечитай [7] и [8]. Неохота снова воду в ступе не толочь.
Страницы: 1 вся ветка
Текущий архив: 2005.12.11;
Скачать: CL | DM;
Память: 0.49 MB
Время: 0.044 c