![]() |
|
|
Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
![]() |
|
Опции темы | Поиск в этой теме | Опции просмотра |
|
#1
|
||||
|
||||
![]() Сей вопрос не особо важен и вызван чрезмерной ленью.
Суть: Есть некоторая функция проверки условия. Вызывается из целого ряда других функций и процедур. Выдает сообщение об ошибке (если условие не выполнилось). Вопрос: Можно ли из этой функции проверки прервать выполнение той функции, из которой она была вызвана? Мотивация: На данный момент есть несколько функций проверки. Их результат критичен (то есть если результат отрицательный, дальше ничего выполняться не должно). В большинстве случаев они используются все, но местами требуется использовать их поодиночке. Выглядит это так: Код:
function ФункцияПроверки1:boolean; begin ****** end; Function ФункцияПроверки2:boolean; begin ****** end; Function ФункцияПроверки3:boolean; begin ****** end; procedure ВыполняемаяПроцедура1; begin if ФункцияПроверки1 then begin *** if ФункцияПроверки2 then begin *** if ФункцияПроверки3 then begin ***** ***** ***** end; end; end; end; procedure ВыполняемаяПроцедура2; begin if ФункцияПроверки1 then begin *** if ФункцияПроверки2 then begin *** if ФункцияПроверки3 then begin ***** ***** ***** end; end; end; end; Код:
procedure ПроцедураПроверки1; begin if Условие=false then begin ****** завершить подпрограмму, из которой была вызвана проверка; end; end; procedure ПроцедураПроверки2; begin if Условие=false then begin ****** завершить подпрограмму, из которой была вызвана проверка; end; end; procedure ПроцедураПроверки3; begin if Условие=false then begin ****** завершить подпрограмму, из которой была вызвана проверка; end; end; procedure ВыполняемаяПроцедура1; begin ПроцедураПроверки1; //дальше не должно пойти, если условие не выполнено *** ПроцедураПроверки2; //дальше не должно пойти, если условие не выполнено *** ПроцедураПроверки3; //дальше не должно пойти, если условие не выполнено *** *** *** end; procedure ВыполняемаяПроцедура2; begin ПроцедураПроверки1; //дальше не должно пойти, если условие не выполнено *** ПроцедураПроверки2; //дальше не должно пойти, если условие не выполнено *** ПроцедураПроверки3; //дальше не должно пойти, если условие не выполнено *** *** *** end; |
#2
|
||||
|
||||
![]() Цитата:
|
#3
|
||||
|
||||
![]() Abort()
или raise EAbort.Create — Как тебя понимать? — Понимать меня не обязательно. Обязательно меня любить и кормить вовремя. На Delphi, увы, больше не программирую. Рекомендуемая литература по программированию |
#4
|
|||
|
|||
![]() Код:
if not ФункцияПроверки1 then exit; *** if not ФункцияПроверки1 then exit; >woweook< |
#5
|
||||
|
||||
![]() Цитата:
|
#6
|
||||
|
||||
![]() Цитата:
|
#7
|
||||
|
||||
![]() Код:
procedure ВыполняемаяПроцедура1; begin if not ФункцияПроверки1 then Exit; *** if not ФункцияПроверки2 then Exit; *** if not ФункцияПроверки3 then Exit; ***** ***** ***** end; Пишу программы за еду. __________________ |
#8
|
||||
|
||||
![]() Цитата:
Есть еще способы? Может, есть команда, которая разом прерывает выполнения всех функций (в том числе и рекурсивных) и переходит в режим ожидания действий пользователя? Ну, типа Application.Terminate, только без полного завершения программы, а лишь завершение активности. ![]() А потоки в этом помогут, как думаете? Последний раз редактировалось morebeauty, 16.11.2012 в 11:43. |
#9
|
|||
|
|||
![]() Цитата:
>woweook< |
#10
|
||||
|
||||
![]() Код:
procedure ВыполняемаяПроцедура1; begin if not ФункцияПроверки1 then Exit; *** if not ФункцияПроверки2 then Exit; *** if not ФункцияПроверки3 then Exit; ***** ***** ***** end; Вот поэтому я и хочу свести все действия на невыполнение условия к процедуре проверки. Тогда код будет более гибким ИМХО. Цитата:
Цитата:
|
#11
|
||||
|
||||
![]() Цитата:
![]() В примере ниже "Beep" никогда не вызовется, так как первый же "Abort" прервёт одним махом все вложенные (рекурсивные) вызовы и перейдёт "в режим ожидания действий пользователя" (если конечно не встретится другого обработчика except): Код:
procedure TForm1.Button4Click(Sender: TObject); procedure Recursion(Level: Integer); begin if Level = 100 then Abort; Recursion(Level + 1); Beep; end; begin Recursion(0); end; |
Этот пользователь сказал Спасибо poli-smen за это полезное сообщение: | ||
morebeauty (19.11.2012)
|