Обработка потери подключения к БД.

IBX, FIBPlus, UIB, ADO, .Net и прочее-прочее-прочее, в общем все, что относится к созданию приложений, работающих с InterBase, Firebird и Yaffil - клиент-серверных, трехзвенных, консольных и т.п.

Модератор: kdv

Ответить
santilaas
Сообщения: 51
Зарегистрирован: 27 авг 2005, 21:05

Обработка потери подключения к БД.

Сообщение santilaas » 30 мар 2007, 17:36

Привет всем!!!
СУБД Firebird 1.5.3, язык - Delphi, ср.доступа - FIBPlus
Вопрос такой: хочу сделать обработку потери подключения к БД (по книге "Мир Interbase 3") НО там для примера рассмотрена одна форма (и один Dataset), на которой лежат все FIB-овские компоненты, и следовательно все процедуры тоже описаны в модуле данной формы (в общем, там все просто).
У меня же несколько иная ситуация:
- есть DataModule, есть форма "Сообщение", на которой есть выпад.список действий: "Отключиться от БД", "Закрыть приложение", "Восстановить соединение" и нужно, чтобы при OnLostConnect компонента Database открывалась модально эта форма, я бы выбирал значение из списка и в зависимости от выбора в "Actions" ("Actions" - это переменная процедуры "OnLostConnect") подставлялось одно из значений "laCloseConnect", "laTerminateApp", "laWaitRestore".

вот код (по аналогии с книгой):

Код: Выделить всё

procedure TDM.DBLostConnect(Database: TFIBDatabase; E: EFIBError;
  var Actions: TOnLostConnectActions);
begin
   AttemptRest:= 0;
   //открываю свою форму предупреждения об ошибке
   FMes:= TFMes.Create(nil);
   FMes.ShowModal; 

   case FMes_OnLostConnect.cmbKindOnLost.ItemIndex of
      //закрываем активное подключение
      0: Actions:= laCloseConnect;
      //закрываем приложение
      1: Actions:= laTerminateApp;
      //пытаемся восстановить подключение к БД
      2: Actions:= laWaitRestore;
   end;
end;
- понятное дело, что код (с "case") не выполнится пока не закроется модальная форма, поэтому я пробовал делать аналогичный "case" и на OnChange выпадающего списка формы "Сообщение", но все
работает (т.е. "Actions"-ам присваиваются значения) только после закрытия формы "Сообщение": в принципе для случая "Отключения от БД" и "Закрытия приложения" все меня устраивает, НО!!! мне нужно чтобы в случае, если на форме "Сообщение" было выбрано значение "Восстановить подключение", тогда на этой форме должно отображаться и количество попыток подключения к БД, т.е. форма должна оставаться открытой, и при этом каким-то образом надо в процедуру "onLostConnect" передать значение "Actions"-а.
2) ну и сразу 2-ой вопрос (если по первому кто-то что-то понял): опять же в книге описан случай применения сделанных
изменений после восстановления подключения для одного конкретного Dataset-а, а как быть, если я хочу применить все сделанные изменения в нескольких Dataset-ах.
Может кто приведет пример всего этого, если есть желание.
Заранее спасибо!

CyberMax
Заслуженный разработчик
Сообщения: 638
Зарегистрирован: 31 янв 2006, 09:05

Сообщение CyberMax » 31 мар 2007, 08:16

1. Ты хочешь сделать, чтобы действие, выбранное пользователем, тут же применялось? Так делать нельзя, потому что это грубейшее нарушение правил UI (пользовательского интерфейса). Конкретные действия должны применяться только после подтверждения пользователем, то есть нажатия кнопки "ОК".
2. Если ты внимательно посмотришь на параметры события OnLostConnect, то заметишь, что в него передается TFIBDatabase. Это значит, что событие относится ко всем датасетам, которые подключены через него.

santilaas
Сообщения: 51
Зарегистрирован: 27 авг 2005, 21:05

Сообщение santilaas » 01 апр 2007, 06:00

Ты хочешь сделать, чтобы действие, выбранное пользователем, тут же применялось? Так делать нельзя, потому что это грубейшее нарушение правил UI (пользовательского интерфейса). Конкретные действия должны применяться только после подтверждения пользователем, то есть нажатия кнопки "ОК".
- и что же мне теперь для отображения попыток подключения создавать ещё одну форму?

CyberMax
Заслуженный разработчик
Сообщения: 638
Зарегистрирован: 31 янв 2006, 09:05

Сообщение CyberMax » 01 апр 2007, 14:13

Зачем? На форме создаешь радиогруппу (выпадающий список тут неуместен):
- Закрыть подключение
- Закрыть приложение
- Восстановить подключение (NNN-ая попытка)

Пользователь выбирает действие, кликает "ОК" и отрабатывается case. Если было выбрано восстановление, увеличиваешь переменную-счетчик подключений. После чего происходит выход из события.

santilaas
Сообщения: 51
Зарегистрирован: 27 авг 2005, 21:05

Сообщение santilaas » 01 апр 2007, 18:54

Все бы ничего, но ведь форма модальная и при нажатии на "ОК" она закроется. И в принципе оно согласно моему коду будет правильно - ведь только после закрытия выполняется "case". А мне надо, чтобы она осталась.

nicolas
Сообщения: 33
Зарегистрирован: 11 сен 2006, 21:37

Сообщение nicolas » 01 апр 2007, 20:00

Это первоапрельский розыгрыш?

У кнопки ОК ставишь св-во ModalResult = mrNone
и ничего у тебя не закроется.

santilaas
Сообщения: 51
Зарегистрирован: 27 авг 2005, 21:05

Сообщение santilaas » 02 апр 2007, 16:09

У кнопки ОК ставишь св-во ModalResult = mrNone
и ничего у тебя не закроется
- это самом собой, но я имел ввиду другое:
"case" выполняется у меня только после FMes.ShowModal;,
стало быть без закрытия модальной формы, я на "case" не выйду!!!

Если перефразировать вопрос: я как-нибудь могу отловить события, происходящие на модальной форме (до её закрытия) из моего DataModule или нет???

Attid
Спец
Сообщения: 377
Зарегистрирован: 14 ноя 2006, 09:58

Сообщение Attid » 03 апр 2007, 11:20

а перенести case в модальную форму религия не позволяет ?

или оттуда датамодуль не доступен ? для этого uses есть.

stix-s
Заслуженный разработчик
Сообщения: 557
Зарегистрирован: 13 дек 2005, 11:52

Сообщение stix-s » 04 апр 2007, 13:31

santilaas писал(а):- это самом собой, но я имел ввиду другое:
"case" выполняется у меня только после FMes.ShowModal;,
стало быть без закрытия модальной формы, я на "case" не выйду!!!

Если перефразировать вопрос: я как-нибудь могу отловить события, происходящие на модальной форме (до её закрытия) из моего DataModule или нет???
не буквальный ответ, но смысл, думаю понятен

Код: Выделить всё

[b]в вызывающей форме[/b]
procedure Tfm_Clerk_work.bbtFindClick(Sender: TObject);
begin
if (bbtFind.Caption='Ïîèñê')
then
 try
  fmFind:=TfmFind.Create(Application);
  fmFind.ShowModal;
 finally
  if (fmFind.ModalResult=mrOk)
   then
    bbtFind.Caption:='Ñáðîñ'
   else
   begin
    bbtFind.Caption:='Ïîèñê';
    dm_base.dset_docs.Filtered:=false;
   end;
  fmFind.Release;
 end
else
 begin
  bbtFind.Caption:='Ïîèñê';
  dm_base.dset_docs.Filtered:=false;
 end;
end;

[b]в вызываемой форме[/b]
procedure TfmFind.bbtCancelClick(Sender: TObject);
begin
 dm_base.dset_docs.Filtered:=false;
 fmFind.ModalResult:=mrCancel;
end;

procedure TfmFind.bbtFindClick(Sender: TObject);
begin
 FilterStr:=lbeFind.text;
 dm_base.dset_docs.Filtered:=true;
 fmFind.ModalResult:=mrOk;
end;

Ответить