Экспертная система Delphi.int.ru

Сообщество программистов
Общение, помощь, обмен опытом

Логин:
Пароль:
Регистрация | Забыли пароль?

Delphi.int.ru Expert

Другие разделы портала

Переход к вопросу:

#   

Статистика за сегодня:  


Лучшие эксперты

Подробнее »



Вопрос # 1 801

/ вопрос открыт /

Здравствуйте!

Здравствуйте уважаемые эксперты. Подскажите пожалуйства. Мне необходимо в сервере приложений сделать следуюшее.
При старте сервера. Сервер считывает данные подключения к СУБД из реестра. Ведь сервер приложений может быть установлен где угодно. Все я реализовал за исключениям следующего:
У меня в сервере еть локальный модуль данных и несколько удалееных. Так, вот с локальным проблем нет. А, вот с удаленными проблема. Необходимо считать строку подключения к СУБД из реестра. Но модуль на события не отвечает. Он вообще не реагирует на это событие. Как мне быть? Можно, конечно сдеть сервер без настраиваемого подключения, но это дико. Мне бы хотелось все же сделать настраиваеммое продключение.

Приложение:
  1. procedure TRDMTehuchet.RemoteDataModuleCreate(Sender: TObject);
  2. begin
  3. Try
  4. With RDMTehuchet do
  5. Begin
  6. mainForm.ReadRegistry(Key7);
  7. OraSession1.Connected:=True;
  8. Tstation.Active:=True;
  9. Tsub_phone.Active:=True;
  10. TDepartments.Active:=True;
  11. Tdepartments_Name.Active:=True;
  12. TSub_Services.Active:=True;
  13. TStreet.Active:=True;
  14. TMechanic_MS.Active:=True;
  15. THighWays_MS.Active:=True;
  16. TMechanic_ATS.Active:=True;
  17. TFailures_type.Active:=True;
  18. Tusers_privs.Active:=True;
  19. TSub_Adres.Active:=True;
  20. TStreet_Name.Active:=True;
  21. Tsub_Service_Name.Active:=True;
  22. TService_Name.Active:=True;
  23. TFailure_asl.Active:=True;
  24. Tphone_book.Active:=True;
  25. end
  26. except
  27. With RDMTehuchet do
  28. Begin
  29. oraSession1.ConnectPrompt:=true;
  30. mainForm.SaveRegistry(Key7);
  31. OraSession1.Connected:=true;
  32. Tstation.Active:=True;
  33. Tsub_phone.Active:=True;
  34. TDepartments.Active:=True;
  35. Tdepartments_Name.Active:=True;
  36. TSub_Services.Active:=True;
  37. TStreet.Active:=True;
  38. TMechanic_MS.Active:=True;
  39. THighWays_MS.Active:=True;
  40. TMechanic_ATS.Active:=True;
  41. TFailures_type.Active:=True;
  42. Tusers_privs.Active:=True;
  43. TSub_Adres.Active:=True;
  44. TStreet_Name.Active:=True;
  45. Tsub_Service_Name.Active:=True;
  46. TService_Name.Active:=True;
  47. TFailure_asl.Active:=True;
  48. Tphone_book.Active:=True;
  49. end;
  50. end;
  51. end;


John Вопрос ожидает решения (принимаются ответы, доступен мини-форум)

Вопрос задал: John (статус: Посетитель)
Вопрос отправлен: 5 августа 2008, 11:16
Состояние вопроса: открыт, ответов: 0.


Мини-форум вопроса

Всего сообщений: 9; последнее сообщение — 6 августа 2008, 11:33; участников в обсуждении: 2.
Вадим К

Вадим К (статус: Академик), 5 августа 2008, 11:41 [#1]:

Не совсем понятно, когда данные не считываются, но кто мешает хранить данные подключения в файле конфигурации и сделать форму настройки?
Галочка "подтверждения прочтения" - вселенское зло.
John

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

John (статус: Посетитель), 5 августа 2008, 12:33 [#4]:

Я пытался, но пока без успешно, может я чего не правильно делал.
Подскажите, какой следующий шаг следует сделать. ПАЖАЛУЙСТА!!
Вадим К

Вадим К (статус: Академик), 5 августа 2008, 12:48 [#5]:

я написал, что я считаю правильным сделать. но мне не понятно что же вы хотите.
Галочка "подтверждения прочтения" - вселенское зло.
John

John (статус: Посетитель), 5 августа 2008, 13:21 [#6]:

Я создаю сервер приложений по технологии COM. Один сервер вмещает в себе несколько удаленных модулей данных. Один модуль локальный. То есть это обычный модуль данных для редактирования данных на самом сервере если это нужно. Другие два удаленные модули данных. Проблема стоит в том, что у компонента OraSession есть строка подключения к СУБД. Сама СУБД находится на том же сервере, что Серв. прилож. так, вот OraSession при празработтке системы все работает, потому как я вручную забиваю подключение к серверу. Но ведь сервер может перенесен на другую машину. Поэтому я придумал перерегистрацию подключения к серверу СУБД. Вот, только не удается контролировать момент создания самого модуля. Ведь только, когда создается модуль данных возможно настроить компоненты для доступа к СУБД. Но удаленные модули не имеют видимого создания самого модуля. Вот и вся проблема.
Вадим К

Вадим К (статус: Академик), 5 августа 2008, 14:03 [#7]:

он создан после вызова в строке
CustRDMTehuchet:=TComponentFactory.Create(ComServer, TRDMTehuchet,
Class_RDMTehuchet, ciMultiInstance, tmApartment);
На этот момент отработал конструктор.
следующей строкой можно вызвать свою процедуру/метод, который осуществит настройку. Едиственное, что следует сделать, это в дизайнере модуля отключить все автоподключения. Иначе модуль вначале будет пытаться подключиться к установленным настройкам, а лишь потом будет вызвана процедура настройки. Это типичная ошибка при проектировании подобных систем.
Галочка "подтверждения прочтения" - вселенское зло.
John

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

Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.

Версия движка: 2.6+ (26.01.2011)
Текущее время: 22 февраля 2025, 11:34
Выполнено за 0.03 сек.