| 
| 
 | Вопрос # 1 801/ вопрос открыт / | 
 |  Здравствуйте!
 Здравствуйте уважаемые эксперты. Подскажите пожалуйства. Мне необходимо в сервере приложений сделать следуюшее.
 При старте сервера. Сервер считывает данные подключения к СУБД из реестра. Ведь сервер приложений может быть установлен где угодно. Все я реализовал за исключениям следующего:
 У меня в сервере еть локальный модуль данных и несколько удалееных. Так, вот с локальным проблем нет. А, вот с удаленными проблема. Необходимо считать строку подключения к СУБД из реестра. Но модуль на события не отвечает. Он вообще не реагирует на это событие. Как мне быть? Можно, конечно сдеть сервер без настраиваемого подключения, но это дико. Мне бы хотелось все же сделать настраиваеммое продключение.
 Приложение:Переключить в обычный режим procedure TRDMTehuchet.RemoteDataModuleCreate(Sender: TObject);begin   Try      With RDMTehuchet do      Begin        mainForm.ReadRegistry(Key7);        OraSession1.Connected:=True;        Tstation.Active:=True;        Tsub_phone.Active:=True;        TDepartments.Active:=True;        Tdepartments_Name.Active:=True;        TSub_Services.Active:=True;        TStreet.Active:=True;        TMechanic_MS.Active:=True;        THighWays_MS.Active:=True;        TMechanic_ATS.Active:=True;        TFailures_type.Active:=True;        Tusers_privs.Active:=True;        TSub_Adres.Active:=True;        TStreet_Name.Active:=True;        Tsub_Service_Name.Active:=True;        TService_Name.Active:=True;        TFailure_asl.Active:=True;        Tphone_book.Active:=True;      end      except      With RDMTehuchet do       Begin          oraSession1.ConnectPrompt:=true;          mainForm.SaveRegistry(Key7);          OraSession1.Connected:=true;         Tstation.Active:=True;         Tsub_phone.Active:=True;         TDepartments.Active:=True;         Tdepartments_Name.Active:=True;         TSub_Services.Active:=True;         TStreet.Active:=True;         TMechanic_MS.Active:=True;         THighWays_MS.Active:=True;         TMechanic_ATS.Active:=True;         TFailures_type.Active:=True;         Tusers_privs.Active:=True;         TSub_Adres.Active:=True;         TStreet_Name.Active:=True;         Tsub_Service_Name.Active:=True;         TService_Name.Active:=True;         TFailure_asl.Active:=True;         Tphone_book.Active:=True;        end;     end;end;
|  |   Вопрос задал: John (статус: Посетитель)Вопрос отправлен: 5 августа 2008, 11:16
 Состояние вопроса: открыт, ответов: 0.
 |  
 Мини-форум вопросаВсего сообщений: 9; последнее сообщение — 6 августа 2008, 11:33; участников в обсуждении: 2. 
|   | Вадим К (статус: Академик), 5 августа 2008, 11:41 [#1]:Не совсем понятно, когда данные не считываются, но кто мешает хранить данные подключения в файле конфигурации  и сделать форму настройки? Галочка "подтверждения прочтения" - вселенское зло. |  
|   | John (статус: Посетитель), 5 августа 2008, 11:55 [#2]:Суть не в этом. Вы, наверное не поняли вопрос. Событие наступающее  при создании формы не вызывается. Это же удаленный модуль данных. Как я понял он создается в определенном классе. 
 TComponentFactory.Create(ComServer, TRDMTehuchet,
 Class_RDMTehuchet, ciMultiInstance, tmApartment);
 
 Как мне создать событие, что бы заставить модуль при своем создании считать данные. Откуда? Неважно!!!
 Вопрос стоял так: Как мне заставить удаленный модуль данных, который создается через специальный класс, реагировать на события создания сомого модуля или другого события?
 
 unit RDMTehuchetUnit;
 
 {$WARN SYMBOL_PLATFORM OFF}
 
 interface
 
 uses
 Windows, Messages, SysUtils, Classes, ComServ, ComObj, VCLCom, DataBkr,
 DBClient, BTServer_TLB, StdVcl, Provider, DB, DBAccess, Ora, OraErrHand,
 OraSmart, MemDS;
 
 type
 TRDMTehuchet = class(TRemoteDataModule, IRDMTehuchet)
 OraSession1: TOraSession;
 Tstation: TOraTable;
 TstationSTATION_ID: TIntegerField;
 TstationST_NAME: TStringField;
 Tsub_phone: TOraTable;
 Tsub_phoneID: TIntegerField;
 Tsub_phoneSTATION_ID: TIntegerField;
 Tsub_phoneDEPARTMENTS_ID: TIntegerField;
 Tsub_phonePHONE_LAST: TStringField;
 Tsub_phonePHONE_4: TStringField;
 Tsub_phonePHONE_6: TStringField;
 Tsub_phoneSUB_NAME: TStringField;
 Tsub_phonePORT_ASL: TStringField;
 Tsub_phoneSTAN: TStringField;
 Tsub_phoneKSA: TStringField;
 Tsub_phoneNOTE: TStringField;
 Tsub_phoneLIN: TStringField;
 Tsub_phoneRASPRED: TStringField;
 Tsub_phoneORG: TStringField;
 Tsub_phoneNAS: TStringField;
 Tsub_phoneTYPE_ORG: TStringField;
 Tsub_phoneT_KSA: TStringField;
 Tsub_phoneT_50: TStringField;
 Tsub_phoneT_100: TStringField;
 Depart_Name: TStringField;
 TDepartments: TOraTable;
 TDepartmentsDEPARTMENTS_ID: TIntegerField;
 TDepartmentsDP_NAME: TStringField;
 TDepartmentsSHORT_NAME: TStringField;
 TSub_Services: TOraTable;
 TSub_ServicesID: TIntegerField;
 TSub_ServicesSERVICENAME_ID: TIntegerField;
 TMechanic_MS: TOraTable;
 TMechanic_MSID: TIntegerField;
 TMechanic_MSMECH_NAME: TStringField;
 TMechanic_MSNOTE: TStringField;
 THighWays_MS: TOraTable;
 THighWays_MSID: TIntegerField;
 THighWays_MSHW_NAME: TStringField;
 THighWays_MSHW_IN: TStringField;
 THighWays_MSHW_OUT: TStringField;
 THighWays_MSROWID: TStringField;
 TMechanic_ATS: TOraTable;
 TMechanic_ATSID: TIntegerField;
 TMechanic_ATSMECH_NAME: TStringField;
 Tdepartments_Name: TOraTable;
 Tdepartments_NameDEPARTMENTS_ID: TIntegerField;
 Tdepartments_NameDP_NAME: TStringField;
 Tdepartments_NameSHORT_NAME: TStringField;
 TStreet: TOraTable;
 TStreetSTREET_ID: TIntegerField;
 TStreetSTR_NAME: TStringField;
 TFailures_type: TOraTable;
 TFailures_typeFAIL_TYPE: TStringField;
 TFailures_typeID: TIntegerField;
 QUsers: TSmartQuery;
 Tusers_privs: TOraTable;
 QDSCurentUser: TOraDataSource;
 QCurentUser: TSmartQuery;
 DSUserName: TOraDataSource;
 QUserName: TSmartQuery;
 TSub_Adres: TOraTable;
 TStreet_Name: TOraTable;
 TStreet_NameSTREET_ID: TIntegerField;
 TStreet_NameSTR_NAME: TStringField;
 OraErrorHandler1: TOraErrorHandler;
 DSQSearch: TOraDataSource;
 QSearch: TSmartQuery;
 DSQCount: TOraDataSource;
 QSerchAddresCount: TSmartQuery;
 DSQStation: TOraDataSource;
 QStation: TOraQuery;
 Tsub_Service_Name: TOraTable;
 Tsub_Service_NameID: TIntegerField;
 Tsub_Service_NameSRV_NAME: TStringField;
 TService_Name: TOraTable;
 TService_NameID: TIntegerField;
 TService_NameSRV_NAME: TStringField;
 ConnectDialog1: TConnectDialog;
 TFailure_asl: TOraTable;
 TFailure_aslID: TIntegerField;
 lMechanic_ats: TStringField;
 Mechanic_Ms: TStringField;
 lFail_type: TStringField;
 TFailure_aslMECHATS_ID: TIntegerField;
 TFailure_aslMECHMS_ID: TIntegerField;
 TFailure_aslFAILTYPE_ID: TIntegerField;
 TFailure_aslPHONE_6: TStringField;
 TFailure_aslDATA_IN: TDateTimeField;
 TFailure_aslDATA_OUT: TDateTimeField;
 DSQSub_ph_fail: TOraDataSource;
 QSub_ph_fail: TSmartQuery;
 Tphone_book: TOraTable;
 Tphone_bookWORKER_NAME: TStringField;
 Tphone_bookPHONE: TStringField;
 Tphone_bookSOTA: TStringField;
 Tphone_bookADRES: TStringField;
 Tphone_bookNOTE: TStringField;
 QSearchAdres: TSmartQuery;
 DSSearchforEdit: TOraDataSource;
 QSearchforEdit: TSmartQuery;
 Tphone_bookROWID: TStringField;
 DSPStation: TDataSetProvider;
 DSPsub_phone: TDataSetProvider;
 DSPDepartments: TDataSetProvider;
 DSPDepartments_name: TDataSetProvider;
 DSPTStreet_Name: TDataSetProvider;
 DSPTFailure_asl: TDataSetProvider;
 DSPTHighWays_ms: TDataSetProvider;
 DSPTMechanic_ms: TDataSetProvider;
 DSPTStreet: TDataSetProvider;
 DSPTSub_Services: TDataSetProvider;
 TSub_ServicesROWID: TStringField;
 DSPFailures_type: TDataSetProvider;
 DSPTMechanic_ATS: TDataSetProvider;
 DSPTSub_Adres: TDataSetProvider;
 DSPTService_Name: TDataSetProvider;
 DSPTSub_Service_Name: TDataSetProvider;
 DSPTPhone_Book: TDataSetProvider;
 DSPTusers_privs: TDataSetProvider;
 DSPQSearchAdres: TDataSetProvider;
 DSPUsers: TDataSetProvider;
 Procedure CreateCustRDMTehuchet;
 function get_RDMTehuchet: IRDMTehuchet;
 procedure RemoteDataModuleCreate(Sender: TObject);
 
 private
 { Private declarations }
 protected
 class procedure UpdateRegistry(Register: Boolean; const ClassID, ProgID: string); override;
 public
 { Public declarations }
 end;
 Const
 Key1 = '\Software\JohnSoftware\Tehuchet\access';
 Key2 = '\Software\JohnSoftware\Tehuchet\Settings';
 Key3 = '\Software\JohnSoftware\Biladm\access';
 Key4 = '\Software\JohnSoftware\Biladm\Settings';
 Key5 = '\Software\JohnSoftware\Commutator\access';
 Key6 = '\Software\JohnSoftware\Commutator\Settings';
 Key7 = '\Software\JohnSoftware\Bterver\access';
 Key8 = '\Software\JohnSoftware\Bterver\Settings';
 Key9 = '\Software\JohnSoftware\Biloper\access';
 Key10= '\Software\JohnSoftware\Biloper\Settings';
 var
 CustRDMTehuchet : TComponentFactory;
 
 implementation
 
 uses MainUnit;
 
 {$R *.DFM}
 
 
 
 procedure TRDMTehuchet.CreateCustRDMTehuchet;
 begin
 // RDMTehuchet.OraSession1.ConnectPrompt:=true;
 // RDMTehuchet.OraSession1.Connected:=True;
 end;
 
 function TRDMTehuchet.get_RDMTehuchet: IRDMTehuchet;
 begin
 //Result:=CustRDMTehuchet.createcomobject(nil);
 end;
 
 class procedure TRDMTehuchet.UpdateRegistry(Register: Boolean; const ClassID, ProgID: string);
 begin
 if Register then
 begin
 inherited UpdateRegistry(Register, ClassID, ProgID);
 EnableSocketTransport(ClassID);
 EnableWebTransport(ClassID);
 end else
 begin
 DisableSocketTransport(ClassID);
 DisableWebTransport(ClassID);
 inherited UpdateRegistry(Register, ClassID, ProgID);
 end;
 end;
 
 {procedure TRDMTehuchet.OraSession1.BeforeConnect;
 begin
 Try
 With RDMTehuchet do
 Begin
 mainForm.ReadRegistry(Key7);
 OraSession1.Connected:=True;
 Tstation.Active:=True;
 Tsub_phone.Active:=True;
 TDepartments.Active:=True;
 Tdepartments_Name.Active:=True;
 TSub_Services.Active:=True;
 TStreet.Active:=True;
 TMechanic_MS.Active:=True;
 THighWays_MS.Active:=True;
 TMechanic_ATS.Active:=True;
 TFailures_type.Active:=True;
 Tusers_privs.Active:=True;
 TSub_Adres.Active:=True;
 TStreet_Name.Active:=True;
 Tsub_Service_Name.Active:=True;
 TService_Name.Active:=True;
 TFailure_asl.Active:=True;
 Tphone_book.Active:=True;
 end
 except
 With RDMTehuchet do
 Begin
 oraSession1.ConnectPrompt:=true;
 mainForm.SaveRegistry(Key7);
 OraSession1.Connected:=true;
 Tstation.Active:=True;
 Tsub_phone.Active:=True;
 TDepartments.Active:=True;
 Tdepartments_Name.Active:=True;
 TSub_Services.Active:=True;
 TStreet.Active:=True;
 TMechanic_MS.Active:=True;
 THighWays_MS.Active:=True;
 TMechanic_ATS.Active:=True;
 TFailures_type.Active:=True;
 Tusers_privs.Active:=True;
 TSub_Adres.Active:=True;
 TStreet_Name.Active:=True;
 Tsub_Service_Name.Active:=True;
 TService_Name.Active:=True;
 TFailure_asl.Active:=True;
 Tphone_book.Active:=True;
 end;
 end;
 end;}
 
 
 procedure TRDMTehuchet.RemoteDataModuleCreate(Sender: TObject);
 begin
 
 end;
 
 initialization
 // TComponentFactory.Create(ComServer, TRDMTehuchet,
 //  Class_RDMTehuchet, ciMultiInstance, tmApartment);
 CustRDMTehuchet:=TComponentFactory.Create(ComServer, TRDMTehuchet,
 Class_RDMTehuchet, ciMultiInstance, tmApartment);
 end.
 |  
|   | Вадим К (статус: Академик), 5 августа 2008, 12:11 [#3]:ну вот в последних строках я вижу, что вы создаёте экземпляр этого класса. Так кто мешает в ваш класс добавить метод для считывания настроек и разместить после строки
 CustRDMTehuchet:=TComponentFactory.Create(ComServer, TRDMTehuchet,
 Class_RDMTehuchet, ciMultiInstance, tmApartment);
 Галочка "подтверждения прочтения" - вселенское зло. |  
|   | John (статус: Посетитель), 5 августа 2008, 12:33 [#4]:Я пытался, но пока без успешно, может я чего не правильно делал. Подскажите, какой следующий шаг следует сделать. ПАЖАЛУЙСТА!!
 |  
|   | Вадим К (статус: Академик), 5 августа 2008, 12:48 [#5]:я написал, что я считаю правильным сделать. но мне не понятно что же вы хотите. Галочка "подтверждения прочтения" - вселенское зло. |  
|   | John (статус: Посетитель), 5 августа 2008, 13:21 [#6]:Я создаю сервер приложений по технологии COM. Один сервер вмещает в себе несколько удаленных модулей данных. Один модуль локальный. То есть это обычный модуль данных для редактирования данных на самом сервере если это нужно. Другие два удаленные модули данных. Проблема стоит в том, что у компонента OraSession есть строка подключения к СУБД. Сама СУБД находится на том же сервере, что Серв. прилож. так, вот OraSession при празработтке системы все работает, потому как я вручную забиваю подключение к серверу. Но ведь сервер может перенесен на другую машину. Поэтому я придумал перерегистрацию подключения к серверу СУБД. Вот, только не удается контролировать момент создания самого модуля. Ведь только, когда создается модуль данных возможно настроить компоненты для доступа к СУБД. Но удаленные модули не имеют видимого создания самого модуля. Вот и вся проблема. |  
|   | Вадим К (статус: Академик), 5 августа 2008, 14:03 [#7]:он создан после вызова в строке 
 CustRDMTehuchet:=TComponentFactory.Create(ComServer, TRDMTehuchet,
Class_RDMTehuchet, ciMultiInstance, tmApartment);На этот момент отработал конструктор. следующей строкой можно вызвать свою процедуру/метод, который осуществит настройку. Едиственное, что следует сделать, это в дизайнере модуля отключить все автоподключения. Иначе модуль вначале будет пытаться подключиться к установленным настройкам, а лишь потом будет вызвана процедура настройки. Это типичная ошибка при проектировании подобных систем.
 Галочка "подтверждения прочтения" - вселенское зло. |  
|   | John (статус: Посетитель), 6 августа 2008, 09:46 [#8]:Как я понял, дело не в том, как запускается сервер. Дело в том, что каждый клиент при подключении к серверу вузывает у него в нутри потоки в котором создаются собственный класс для подключившегося пользователя. Подсказаное вами решение не выполнимо. Здесь надо что-то другое. Подскажите, как можно реализовать контроль создание экземрляра класса. |  
|   | Вадим К (статус: Академик), 6 августа 2008, 11:33 [#9]: Цитата: вузывает у него в нутри потоки в котором создаются собственный класс
 
 написана глупость. надо писать "создаётся собственный экземляр класса".
 
 Есть надёжный способ вызвать обработчик. причём как до конструктора, так и после.
 в объявление своего класса в секцию public вставляете такое описание
 
 constructor Create(AOwner: TComponent);override;Потом жмём Ctrl+Shift+C и делфи сделает заготовку. в ней пишем такое
 
 constructor T   .......  Create(AOwner: TComponent);
begin
//Код здесь выполниться до конструктора
....
//Эта строка обязательна
//она вызывает конструктор базового класса.
inherited Create(AOwner);
//код дальше будет выполняться после конструктора.
end;Но надо помнить, что до вызова конструктора базового класса нельзя обращаться ко всем полям класса - нет гарантии, что они инициализированы. Но можно обращаться к своим полям (то есть полям уже этого класса, которые вы сами добавили и чётко понимаете, что они делают). также можно инициализировать поля, но не забывайте, что конструктор базового класса может переделать это по своему. Галочка "подтверждения прочтения" - вселенское зло. |  Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте. |