Delphi 3 и создание приложений баз данных

       

Обмен инициализирующими сообщениями между приложениями


Несколько усложним предыдущий пример. Пусть с удаленной БД одновременно работают приложения А и В, причем приложение А должно быть загружено в момент начала работы приложения В. Тогда приложение В должно проверить факт загрузки приложения А и, если оно не загружено, перейти в состояние ожидания. Работа приложением В может быть продолжена только после загрузки приложения А.

В этом случае приложение В должно претерпеть некоторые изменения. Отсылка сообщения к приложению А и ожидание поступления от него подтверждающего сообщения вынесена в отдельную форму WailingForm. В ней размещены компоненты DatabaseB, StoredProcB, Timer 1 и IBEventAlerterB (рис. 34.4).

Диалоговое окно "Ожидание ответа от приложения А"

Рис. 34.4. Форма WailingForm

Компонент DatabaseB управляет соединением приложения В с удаленной БД, общей для приложений А и В. Компонент StoredProcB предназначен для вызова хранимой процедуры B_SEND_INIT. Транзакция вызова хранимой процедуры осуществляется каждые 5 секунд компонентом Timer! (тип TTimer) в обработчике события On Timer:

procedure TWaitingForm.TimerlTimer(Sender: TObject);

begin

DatabaseB.StartTransaction;

StoredProcB.ExecProc;

Databases.Commit;

end;

Повторяющийся вызов хранимой процедуры необходим, чтобы приложение А, если оно загружается позднее приложения В, наверняка получило от сервера уведомление о наступлении события "B_LOADED". Как только компонент IBEvenlAlerierB получит от сервера обратное инициализирующее сообщение, посланное приложением А, компонент Timer} дезактивизируется и повторяющийся вызов хранимой процедуры B_SEND_INIT будет прекращен, программа сообщает серверу о том, что событие "A_LOADED" ее больше не интересует, а форма WailingForm закрывается:

procedure TWaitingForm.IBEventAlerterBEventAlert(Sender: TObject;



EventName: string; EventCount: Longint; var CancelAlerts: Boolean);

begin

Timer1.Enabled := False;

FormB.ListBoxB.Items.Add(EventName) ;

CancelAlerts := True;

WaitingForm.ModalResult := mrOk;

end;

Перед вызовом из главной формы приложения В форма WaitingForm динамически создается, а после окончания работы - уничтожается:

procedure TFormB.FormActivate(Sender: TObject);

begin

WaitingForm := TWaitingForm.Create(Self);

WaitingForm.ShowModal;

WaitingForm.Free;

end;

В форме WaitingForm отменены иконки выхода, минимизации и максимизации (свойство Border-Icons), чтобы предотвратить выход из формы до получения инициализирующего сообщения от приложения А.



Содержание раздела