Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 21.03.2013, 13:34   #1
DeveloPerchik
Пользователь
 
Регистрация: 06.04.2012
Сообщений: 78
Вопрос Окно закрывается не смотря на EExternalException

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

Совершенно бредовая проблема - есть два схожих диалога ввода данных в обоих работает одинаковая схема обработки кнопки "Сохранить", а именно срабатывает блок Проверки проверяя все требуемые поля на ввод и если всё введено верно - срабатывает блок Сохранения и потом закрывается окно. Но если какое-то поле для ввода заполнено неправильно - возникает ошибка типа EExternalException которая останавливает выполнение блоков Проверки и Сохранения и возвращает пользователя к правильному заполнению полей. Так вот в одном окне всё отлично пашет, а в другом, если что-либо введено неверно - ошибка выскакивает как должна, но и окно закрывается не дожидаясь исправления данных!!! Проверил вроде всё - в обоих окнах одинаково, но проблема есть... может у вас возникнут предположения из-за чего в одном случае окно закрывается?!

Код:
procedure btSaveClick(Sender: TObject);
begin
  if FormValidate then begin
    qryClient.Post;
    ModalResult:=mrOk;
    Close;
  end;
end;

function FormValidate: boolean;
Begin
  Result:=False;
    if ed_CLIENT.Field.IsNull then Raise EExternalException.CREATE('Клиент не указан!');
  ...ещё такие же проверки...
  Result:=True;
end;
DeveloPerchik вне форума Ответить с цитированием
Старый 21.03.2013, 13:37   #2
Yurk@
Участник клуба
 
Аватар для Yurk@
 
Регистрация: 19.12.2007
Сообщений: 1,100
По умолчанию

Код:
function FormValidate: boolean;
Begin
  Result:=False;
  if ed_CLIENT.Field.IsNull then 
  begin
    Raise EExternalException.CREATE('Клиент не указан!');
    Exit;
  end;
  ...ещё такие же проверки...
  Result:=True;
end;
На форуме: Помогаю за спасибо
ICQ\Skype: Это моё личное время ...
Yurk@ вне форума Ответить с цитированием
Старый 21.03.2013, 13:40   #3
DeveloPerchik
Пользователь
 
Регистрация: 06.04.2012
Сообщений: 78
По умолчанию

Должен заметить, что как я и написал выше - схема работы идентична для обоих окон и в случае с одним окном всё работает и без "Exit;"... а значит проблема в чём-то другом... в чем ???
DeveloPerchik вне форума Ответить с цитированием
Старый 21.03.2013, 14:35   #4
Sciv
Старожил
 
Аватар для Sciv
 
Регистрация: 16.05.2012
Сообщений: 3,211
По умолчанию

Все ж таки лучше весь код увидеть а не вот эти:

Код:
...ещё такие же проверки...
Потому что по текущему коду я вижу только, что функция FormValidate всегда возвращает true. То ли неудачно вырвано из контекста кода, то ли так и надо - в таком случае прога правильно отрабатывает.

И еще - сами окна одинаково создаются?
Начал решать проблему с помощью регулярных выражений. Теперь решаю две проблемы...

Последний раз редактировалось Sciv; 21.03.2013 в 14:38.
Sciv вне форума Ответить с цитированием
Старый 21.03.2013, 14:58   #5
DeveloPerchik
Пользователь
 
Регистрация: 06.04.2012
Сообщений: 78
По умолчанию

Цитата:
Все ж таки лучше весь код увидеть а не вот эти: ...ещё такие же проверки...
Аналогичные, просто ещё несколько таких же полей.
Цитата:
отому что по текущему коду я вижу только, что функция FormValidate всегда возвращает true.
Эээ почему же?! А разве EExternalException не прекращает выполнение кода FormValidate ???


Кто как реализует такую функцию проверки полей перед сохранением???
DeveloPerchik вне форума Ответить с цитированием
Старый 21.03.2013, 15:32   #6
evg_m
Старожил
 
Регистрация: 20.04.2008
Сообщений: 5,543
По умолчанию

на проблемной кнопке установлен ModalResult ?
программа — запись алгоритма на языке понятном транслятору
evg_m вне форума Ответить с цитированием
Старый 21.03.2013, 15:38   #7
Yurk@
Участник клуба
 
Аватар для Yurk@
 
Регистрация: 19.12.2007
Сообщений: 1,100
По умолчанию

Цитата:
А разве EExternalException не прекращает выполнение кода FormValidate ???
а поставить маячок после функции и проверить? ;-)
Цитата:
Кто как реализует такую функцию проверки полей перед сохранением???
я уже написал в п.2 как это сделать без лишней головной боли
На форуме: Помогаю за спасибо
ICQ\Skype: Это моё личное время ...

Последний раз редактировалось Yurk@; 21.03.2013 в 15:41.
Yurk@ вне форума Ответить с цитированием
Старый 21.03.2013, 15:40   #8
DeveloPerchik
Пользователь
 
Регистрация: 06.04.2012
Сообщений: 78
По умолчанию

Цитата:
на проблемной кнопке установлен ModalResult ?
Да, в обоих окнах стоит одно и то же - mrOK. Но одно окно после EExternalException закрывается, а второе после EExternalException не закрывается...
Цитата:
я уже написал в п.2 как это сделать без лишней головной боли
Хотелось бы разобраться в проблеме, а не городить лишний код.

evg_m
Нашёл проблему! Оба окна изначально Visible=False и после создания их ещё приходится дополнительно показывать...
Окно, которое НЕ закрывается при EExternalException показывается методом ".Show;"
Окно, которое ЗАКРЫВАЕТСЯ при EExternalException показывается методом ".ShowModal;"...
Спасибо за наводку!!! ))

Правда возникло неудобство... у меня работал код:
If Forma.ShowModal=mrOk then Dataset.FullRefresh;
Теперь из-за проблем с ShowModal нет возможности определить был ли mrOK... ((
Может посоветуете что-то?

Последний раз редактировалось Stilet; 24.03.2013 в 13:20.
DeveloPerchik вне форума Ответить с цитированием
Старый 21.03.2013, 16:10   #9
evg_m
Старожил
 
Регистрация: 20.04.2008
Сообщений: 5,543
По умолчанию

а в чем проблема вы же и так ставите
Цитата:
Код:
procedure btSaveClick(Sender: TObject);
begin
  if FormValidate then begin
    qryClient.Post;
    ModalResult:=mrOk;
    Close;
  end;
end;
в нужное время (здесь при модальном показе даже Close не нужен.)
т.е.изначально на кнопке нет mrOK.(чтобы окно не закрывалось по кнопке)
при успешной проверке
Код:
{form.}ModalResult:=mrok;
и окно будет закрыто (и проверить можно)
Код:
if formX.modalResult =mrok
да и так будет работать
Код:
if formX.showModal =mrok
либо я чего-то не понимаю?
программа — запись алгоритма на языке понятном транслятору

Последний раз редактировалось evg_m; 21.03.2013 в 16:16.
evg_m вне форума Ответить с цитированием
Старый 24.03.2013, 13:07   #10
DeveloPerchik
Пользователь
 
Регистрация: 06.04.2012
Сообщений: 78
По умолчанию

Опишу какое поведение необходимо и какие возникли проблемы в реализации...

Нужно, чтобы:
+ при нажатии кнопки в каталоге создавалось окно которое Visible=False;
+ соот это окно нужно как-то показать (form.Show или form.ShowModal), хотелось бы form.Show, чтобы можно было из каталога открывать множество таких мелких окон;
+ если ModalResult=mrOK повесить на кнопку, то возникают те баги с проверкой формы, что описаны в этой теме. Ладно, убираем mrOK с кнопки, а выводим ModalResult=mrOK кодом в нужный момент после проверки FormValidate;

Но есть проблема - если сначала сделать form.Show а потом поставить ожидание от формы модального ответа типа [if formX.modalResult=mrOK] то в окне возникает ошибка "Нельзя видимое окно сделать модальным"...

Можно ли используя ModalResult=mrOK сделать окно не модальным (чтобы открывать множество таких окон) но с целью после закрытия любого из мелких окон затем в родительском окне каталога обработать событие ModalResult=mrOK (нужно сделать Dataset.Refresh)??

Или через ModalResult никак, только создавать в каталоге отдельное property??
+
DeveloPerchik вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Не закрывается диалоговое окно Jopses JavaScript, Ajax 1 23.02.2013 14:23
Закрывается окно DOS zlo_999 Общие вопросы C/C++ 10 16.03.2011 01:30
Закрывается окно Никита_П Общие вопросы C/C++ 2 27.02.2010 17:22