Н. 3. Елманова. C++Builder 3.0, архиге<оу^'кди^нг/сервер" и Internet________
разместить в удаленном модуле дан^ых, Т«Ь могут возникнуть проблемы, связанные с тем, что при нескольких подключениях могут быть конфликты между несколькими его экземплярами. ве^ь каждое новое подключение создает свой экземпляр удаленного *<«уля данных. Поэтому следует позаботиться о разных именах пользовательских сессий во избежание таких конфликтов либо, если это позволяв соо^ражения безопасности, применить для всех подключений общий кс^гтоне^ TDatabase. Окончательный состав проекта пг?еЛст:щ-Лен на рис. g.ll.
] appsiv
""1 appsrv.cp'P 3 appsrvl
-Щ) appsi'v1cPP
-Щ Formf1 | appstv.tlb? | apps;v_T^LB-cPP
-Щ appsi"v2-W
-Ш MyRlDN
] appMvJ^LcpP
Puc. 8.11. Окончательный co?cm* "Р^екта сервера приложений Далее из контекстного меню ко1»м"°ненгов TTable надо выбрать опции:
Export Tablet  from data module Export Table2 from data module
Для корректной работы серве'еРа HWcHO обязательно экспортировать компоненты TTable из модуля дай-™» (%бо связать их с компонентами TProvider и затем экспортировать i гюследцие)_ ?сли этого не сделать, клиентское приложение не будет имеТ5ТЬ ло^па K этим объектам (эта ошибка является довольно типичной). Ос'с«»ное назначение удаленного модуля данных заключается именно в пред Д<швлении содержащимся в нем компонентам доступа к данным возможности 5ыть видимыми и управляемыми извне, т. е. из других приложений * (" в <%eM случае - с других компьюте-
Создание многозвенных информационных систем с помощью C++Builder 3.0
ров, в том числе доступных не только посредством локальной сети, но и через Internet).
Проконтролировать наличие в удаленном модуле данных объектов, видимых извне, можно, просмотрев соответствующую библиотеку типов (Туре library), в нашем случае - appsrv.tlb. Можно обнаружить, что СОМ-объект, который будет создаваться при подключении очередного клиента, обладает интерфейсом, осуществляющим доступ извне к компонентам Table 1 иТаЫе2(рис, 8.12).
			
ra	appsiv-Ub		
i te	Ш1 -'• ^M^yt:;":^ ;': ' ^iiS •'  ' " '''  .- :•> A *ШЩ,:-%ВД1,:.Г:С::*-. • «f«agC!it»tch sGoOestk'-iEnuni'	*         @   :   Ф Alias      Recotd     Unior	*$•'•."•**'       ^  "," ">:<""''    -ШИ Module    Method  Property         • .   :        -SSftS-
E	A appsiv E-J* IMyRDM :      ".                    |Г"МЦЩМ."1	Attiibutes | Parameters	Flaas j Text   |
	,  r-^iEB 1     i-fiS Table!	Name:	Table2                                                                              :,
	-ft MjiRDM	.D:	I....     ....                  .   .                                          '•-
		Type:	IProvider'                                                     ^         :;
		Invoke Kind         : , Help    •     '      •   - •	Property Get                                                  jj         :: ....... . .......           .... ......               ... .                       ;.
		; Help String:	::
		Help Context	i
		Help String Context	..,'.',.. .   •
т			....... ..... .......,._....... — .......,^__,_, — ............
Рис. 8.12.  Библиотека типов, связанная с удаленным модулем данных
Теперь включим ссылку на h-файл главной формы в текст модуля, связанного с модулем данных, и создадим обработчики событий, связанные с созданием и уничтожением удаленного модуля данных:
void _fastcall TMyRDM::MyRDMCreate(TObject *Sender)
{
Forml->Label1->Caption =
IntToStr(StrToInt(Form1->Label1->Caption)+1 );
}
// -------------.----.-.--.------.----
void _fastcall TMyRDM::MyRDMDestroy(TObject *Sender)
{
Forml->Label1->Caption =
IntToStr(StrToInt(Forml->Label1->Caption)-1);
}
174
175