Обмен инициализирующими сообщениями между приложениями
Несколько усложним предыдущий пример. Пусть с удаленной БД одновременно работают приложения А и В, причем приложение А должно быть загружено в момент начала работы приложения В. Тогда приложение В должно проверить факт загрузки приложения А и, если оно не загружено, перейти в состояние ожидания. Работа приложением В может быть продолжена только после загрузки приложения А.
В этом случае приложение В должно претерпеть некоторые изменения. Отсылка сообщения к приложению А и ожидание поступления от него подтверждающего сообщения вынесена в отдельную форму 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), чтобы предотвратить выход из формы до получения инициализирующего сообщения от приложения А.