|
Вопрос # 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;
Но надо помнить, что до вызова конструктора базового класса нельзя обращаться ко всем полям класса - нет гарантии, что они инициализированы. Но можно обращаться к своим полям (то есть полям уже этого класса, которые вы сами добавили и чётко понимаете, что они делают). также можно инициализировать поля, но не забывайте, что конструктор базового класса может переделать это по своему.
Галочка "подтверждения прочтения" - вселенское зло.
|
Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.
|