powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / Как сделать красивый выход по Esc
4 сообщений из 4, страница 1 из 1
Как сделать красивый выход по Esc
    #34927174
t03
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Добрый день господа!
Подскажите плиз как сделать красивый выход по Esc в такой ситуации:
Есть функция FUN1 в корой работает сложный SELECT. Она может вызываться из других функций, форм и т.д. в разных уровнях вложенности. Если пользователь устал ждать выполнения этого Selecta, то он хочет нажать Esc и выйти в ту форму или программу из которой была вызвана FUN1. Как это сделать красиво, не перебирая при выходе по Esc все уровни вложенности вызывающих программ.
И еще вопрос: если Fun1 вызывалась по Form1.Knopka.Click - то как вернуться туда же из Fun1 вариант RETURN TO Form1.Knopka.Click не работает.

Vfp6

Заранее спасибо
...
Рейтинг: 0 / 0
Как сделать красивый выход по Esc
    #34928879
12345678
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
t03Добрый день господа!
Подскажите плиз как сделать красивый выход по Esc в такой ситуации:
Есть функция FUN1 в корой работает сложный SELECT. Она может вызываться из других функций, форм и т.д. в разных уровнях вложенности. Если пользователь устал ждать выполнения этого Selecta, то он хочет нажать Esc и выйти в ту форму или программу из которой была вызвана FUN1. Как это сделать красиво, не перебирая при выходе по Esc все уровни вложенности вызывающих программ.Решение не красивое, а ленивое и жутко опасное.
Вызывающие программы могут создавать временные ресурсы или изменять состояние системы перед вызовом подпрограмм. "не перебирая при выходе по Esc все уровни вложенности вызывающих программ" в принципе не гарантируется, что система будет возвращена в исходное консистентное состояние. По-хорошему, все подпрогаммы должны уметь принимать в виде результата признак отмены процесса и коректно обрабатывать эту ситуацию - ничего трудного в канализации ошибок нет.

И из вашего текста несовсем понятно, как обрывается выполнение оператора в однопоточном-то фоксе. ON ESCAPE чтоле? Тем не менее, можно поднимать исключение при отмене операции пользователем. В этом случае стек действительно будет свернут до первой подпрограммы, в которой есть обработчик ошибок. В поздних версиях есть try..catch, в шестерке придется извращаться с событием Error. Что то вроде:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
DEFINE CLASS Caller as Custom &&Класс корректно обрабатывающий отмену пользователем
  PRIVATE UserCancel
  UserCancel = .F.  && Это флаг отмены, устанавливаемый в событии Error

  FUNCTION Blablabla 
    DO SomeJob && Вызываем процедуру или метод, который в конечном итоге вызовет FUN1
    IF This.UserCancel THEN
      This.UserCancel = .F. && Возвращаем флаг в исходное положение
      * Сливаем воду
      RETURN
    ENDIF
    * Запрос выполнен - продолжаем обработку
    
    PRIVATE FUNCTION Error
      LPARAMETERS nError, cMethod, nLine
      IF MESSAGE() == "USER CANCEL" THEN
        * Это прерывание пользователем, а не ошибка
        This.UserCancel = .T.
      ELSE 
        * А вот это действительно ошибка
        * Передаем упраление глобальному обработчику ошибок (а есть чё?)
      ENDIF 
    ENDFUNC 
  ENDFUNC
ENDDEFINE 

FUNCTION FUN1 && It's a real fun
  * Врубаем прерыватель
  SET ESCAPE ON
  ON ESCAPE ERROR "USER CANCEL"
  
  * Просим
  SELECT что-то страшное
  
  * Вырубаем прерыватель
  SET ESCAPE OFF
ENDFUNC 

Надеюсь, принцип понятен.
...
Рейтинг: 0 / 0
Как сделать красивый выход по Esc
    #34929050
t03
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Спасибо - бум думать :)
...
Рейтинг: 0 / 0
Как сделать красивый выход по Esc
    #34929555
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
t03Добрый день господа!
Подскажите плиз как сделать красивый выход по Esc в такой ситуации:
...
Можно красиво, только переписать все прийдется.
Есть так называемый "параноидальный" стиль программирования. Параноидальность состоит в проверке результатов каждой операции. Т.е. каждая процедура/функция возвращает успешность своего завершения. В кратце так:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
* Основной код
local llOk
llOk = .T.
if llOk
    llOk = Raschet1()
endif
if llOk
    llOk = Raschet2()
endif
...

proc Raschet1
* Промежуточный код
local llOk
llOk = .T.
if llOk
    llOk = Raschet1_1()
endif
if llOk
    llOk = Raschet1_2()
endif
return llOk

proc Raschet1_2
* Сложный запрос
local llOk
on escape return .F.
...
return llOk

...
Рейтинг: 0 / 0
4 сообщений из 4, страница 1 из 1
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / Как сделать красивый выход по Esc
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]