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

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

Компонент для работы с базами данных 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]

Принимай решения Борланда как есть, не нравится, отказывайся от решений Борланда, может найдешь, что ни будь не данного типа, хотя тяжело будет.


Наверх

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