Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2013.04.28;
Скачать: CL | DM;

Вниз

DataSnap: "взаимоотношения" RDM между собой   Найти похожие ветки 

 
d_oleg ©   (2007-07-13 09:27) [0]

Подскажие пожалуйста, чего-то я видимо недопонимаю...

Есть проект 3х звенка на DataSnap. Сервер представляет собой набор объектов TRemoteDataModule, клиент коннектится к главному, с помощью TSharedConnection имеет доступ к остальным remotedataмодулям. Тут все вполне стандартно и понятно TSharedConnection обращается к свойству главного модуля, оный модуль отдает интерфейс созданного объекта.

Так вот, про взаимодействие объектов внутри сервера - в главном модуле лежит компонент-подключение к БД, в остальных - dataset"ы доступа к данным. В дизайн-тайме в cвойства Database DataSet"ов очень замечательно проставляется компонент, находящийся в главном модуле.
Т.е.


TMainRDM = class(TRemoteDataModule, IMainRDM)
   Database: TpFIBDatabase;
   ......
end;

MainRDM: IMainRDM

TChildRDM = class(TRemoteDataModule, IChildRDM)
 Dataset: TpFIBDataSet;
 .......
end;

DFM: object tele_data: TpFIBDataSet
 Database = MainRDM.Database
end;


Внимание вопрос: как это происходит? Ведь MainRDM - это интерфейс, как он может фигурировать в DFM? К тому же нет у него свойства Database.

Спрашиваю для того, чтобы понять, как можно подобное присвоение сделать в коде в run-time.


 
Сергей М. ©   (2007-07-13 09:58) [1]


> MainRDM: IMainRDM


Эту переменную ты создал "ручками" ?

Что-то не припоминаю я, чтобы эксперт создавал в RDM-юните глоб.переменную интерфейсного типа.


 
d_oleg ©   (2007-07-13 11:08) [2]


> Эту переменную ты создал "ручками" ?


нет, автоматом в _TLB файле.


 
Сергей М. ©   (2007-07-13 11:23) [3]


> d_oleg ©   (13.07.07 11:08) [2]
> нет, автоматом в _TLB файле.


Хм..

Только что в Д7 я создал средствами эксперта "чистый" RDM, при этом эксперт кроме юнита с RDM-классом создал соответствующий TLB-юнит.

В упор не вижу ни там ни там никаких переменных интерфейсного типа.

Да и какое непосредственное отношение TLB-юнит имеет к DFM ? Imho, никакого.

Так что, думается, эта интерфейсная переменная, фигурирующая у тебя - чистая отсебячина)


 
d_oleg ©   (2007-07-13 11:49) [4]


> Хм..

Так, стормозил... :(

Никакая это не переменная, MainRDM = IMainRDM, т.е. описание Co-класса


> Да и какое непосредственное отношение TLB-юнит имеет к DFM ?
Согласен, никакого. Просто не пойму, на что ссылается DFM строчкой
> MainRDM.Database


 
Сергей М. ©   (2007-07-13 12:13) [5]


> не пойму, на что ссылается DFM строчкой
> MainRDM.Database


Как это на что ? Разумеется на объект-компонент с именем (т.е. св-вом Name) "MainRDM".

B св-во Database у этого объекта имеется, потому как оно у тебя published по умолчанию


 
Сергей М. ©   (2007-07-13 12:16) [6]


> св-во Database у этого объекта имеется


Точнее не св-во, а поле соотв.типа.
Коль ты не указал спецификатор области видимости для этого идентификатора, он автоматически становится published с соответствующими последствиями, кои ты и наблюдаешь.


 
d_oleg ©   (2007-07-13 13:50) [7]


> Как это на что ? Разумеется на объект-компонент с именем
> (т.е. св-вом Name) "MainRDM".

Так откуда он берется-то? Вот в чем вопрос. Ведь на этапе проектирования мы имеем всего лишь тип TMainRDM, но ни одного одъекта этого типа.


 
d_oleg ©   (2007-07-13 13:51) [8]


> B св-во Database у этого объекта имеется, потому как оно
> у тебя published по умолчанию
> ....

Тут-то все понятно.


 
Сергей М. ©   (2007-07-13 14:11) [9]


> d_oleg ©   (13.07.07 13:50) [7]



> ни одного одъекта этого типа


Как это "ни одного" ?

А что, по-твоему, есть то на что ты кинул тот самый компонент Database ?


 
d_oleg ©   (2007-07-13 15:26) [10]


> А что, по-твоему, есть то на что ты кинул тот самый компонент
> Database ?

И где "оно" описано?


 
ага   (2007-07-13 19:17) [11]

2 d_oleg ©   (13.07.07 15:26) [10]
> А что, по-твоему, есть то на что ты кинул тот самый компонент
> Database ?

И где "оно" описано?

Ты че, прикалывашься? В дфмке естесно того модуля где у тя TMainRDM описано. Ну ет для дизайнера. А для раантайма у тя сам модуль есть. Ну ты сослася на него в юзес - усе, тип то компилеру известен, чеб ему не видеть?


 
d_oleg ©   (2007-07-14 15:34) [12]

Тип виден, но не виден непосредственно объект типа, не описан он. Еще раз: не описан ни один объект данного типа. Что мне мешает создать таких объектов с десяток - какой из них будет использован?


 
Сергей М. ©   (2007-07-16 09:32) [13]


> d_oleg ©   (14.07.07 15:34) [12]


Ты вообще справку на тему "Using multiple remote data modules" читал ?


 
d_oleg ©   (2007-07-16 11:57) [14]


> Ты вообще справку на тему "Using multiple remote data modules"
> читал ?

И что там по теме, кроме общих слов? Единственное похожее:


> You may also want to extend the interface for each child
> data module, exposing the parent data module"s interface,
>  or the interfaces of the other child data modules. This
> lets the various data modules in your application server
> communicate more freely with each other.
>


Но во-первых тут говорится про You may also want..., а я говорю про ситуацию "по умолчанию", безо всяких дополинтельных телодвижений со стороны разработчика, а во-вторых, тут ничего не написано на тему, как это сделать. Банально добавить проперть и установить ее в момент создания? Да, это можно, но повторюсь: по умолчанию нет никаких дополнительных свойств, мне интересен именно этот подход.


 
Сергей М. ©   (2007-07-16 12:09) [15]


> мне интересен именно этот подход


В твоей задаче это изначально неверный подход.


> безо всяких дополинтельных телодвижений со стороны разработчика


Это подход батонокидателя, а не "разработчика", тем более - разработчика, использующего не самые тривиальные в использовании технологии и инструменты, поддерживаемые Делфи.


 
d_oleg ©   (2007-07-16 13:05) [16]


> Это подход батонокидателя, а не "разработчика"

Подход разработчика - это понимать, как работает то, что ты пишешь. А не пихать везде код made by я любимый. Если есть стандартный путь взаимодействия - лучше воспользоваться им, а не изобретать каждый раз велосипед, не так ли?


 
Сергей М. ©   (2007-07-16 14:08) [17]


> d_oleg ©   (16.07.07 13:05) [16]
>
>


Слушай, я не знаю что уж ты там наворотил, но Инспектор объектов не позволит выбрать компоненты из другого RDM, подобно описанному тобой случаю.

Только что я провел "чистый" эксперимент:

1. Средствами эксперта создал заготовку проекта AX-библиотеки
2. Средствами эксперта создал в составе проекта пару RDM
3. На один RDM бросил ADOConnection, на другой ADOTable

В Инспекторе объектов открываю список для выбора значения свойства ADOTable.Connection - он девственено чист ! Что собссно и ожидалось)


 
d_oleg ©   (2007-07-16 15:32) [18]


> Сергей М.

в uses-то написал модуль с другим RDM?


 
Сергей М. ©   (2007-07-16 15:44) [19]


> в uses-то написал модуль с другим RDM?


Нет, не написал.

Ну хорошо, я указал оной, вижу в списке имя.

И что ?

Где, спрашивается, в ран-тайм будет осуществляться поиск этого самого компонента с именем "MainRDM", если его Owner = nil ?

Ты просто получишь исключение - и всех делов.


 
d_oleg ©   (2007-07-16 15:51) [20]

Нет, не так вопрос стоит. Когда я выбираю в cild компонент из main, получается, что я обращаюсь непонять к чему - не описано такого объекта (переменной) MainRDM, есть тип MainRDM = IMainRDM, описанный в _TLB.pas
К чему же я обращаюсь в таком случае? Где мне искать этот объект в run-time?

Когда с формами работаешь, там всегда (по умолчанию) наряду с типом генерируется переменная этого типа и (опять же, по умолчанию) объект формы создается "в этой переменной", т.е. потом к этому объекту можно обратиться через переменную. А тут?


 
Сергей М. ©   (2007-07-16 15:58) [21]


> К чему же я обращаюсь в таком случае?


Ты обращаешься к компоненту с именем "MainRDM", существующему в дизайн-тайм.

Будет ли компонент с этим именем существовать в ран-тайм на момент обращения к нему - таких предположений Инспектор не делает за ненадобностью, полагаясь очевидно на полное твое понимание как разработчика, а не батонокидателя.


> потом к этому объекту можно обратиться через переменную


При загрузке св-в компонента из DFM ни о каких "переменных" речи не идет - тот самый "MainRDM" расценивается "загрузчиком" как имя потенциально существующего на этот момент компонента.


 
d_oleg ©   (2007-07-16 16:35) [22]


> Ты обращаешься к компоненту с именем "MainRDM"

все, спасибо, разобрался.



Страницы: 1 вся ветка

Текущий архив: 2013.04.28;
Скачать: CL | DM;

Наверх




Память: 0.53 MB
Время: 0.005 c
15-1356686287
QAZ9
2012-12-28 13:18
2013.04.28
Подсветка синтаксиса


2-1349768093
thely
2012-10-09 11:34
2013.04.28
показ информ окна


15-1356650625
ННН
2012-12-28 03:23
2013.04.28
Где находится IE?


2-1350057756
Mihaip
2012-10-12 20:02
2013.04.28
Вопрос по UDP


2-1350293913
Дмитрий С
2012-10-15 13:38
2013.04.28
Сравнить два пути к файлу.