Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Компоненты";
Текущий архив: 2005.12.11;
Скачать: [xml.tar.bz2];

Вниз

Компонент для работы с базами данных 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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.49 MB
Время: 0.037 c
2-1132570964
Apachi
2005-11-21 14:02
2005.12.11
TWebBrowser как прочитать содержимое


2-1132921845
brownrat
2005-11-25 15:30
2005.12.11
доступ к компоненте другой программы


14-1132584149
manulo
2005-11-21 17:42
2005.12.11
LPT


3-1130399234
Nikola62
2005-10-27 11:47
2005.12.11
Постраничный запрос


6-1125481501
Nikolay Kislov
2005-08-31 13:45
2005.12.11
Как обойти конфликт между IP адресами?





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский