Выход из процедуры родителя

Вопросы программирования и использования среды Lazarus.

Модератор: Модераторы

Выход из процедуры родителя

Сообщение ivanov1 » 20.01.2015 05:56:26

Добрый день. Не знаю как реализовать Выход из процедуры родителя

т.е.

Код: Выделить всё
procedure TForm1.MenuItem1Click(Sender: TObject);
begin
pbegin;
///
///
///
////
end;

procedure pbegin;
begin
здесь сделать
if ... then exit; /// Чтобы exit сработал в процедуре которая вызвала.
end;

ivanov1
новенький
 
Сообщения: 32
Зарегистрирован: 03.01.2015 16:25:04

Re: Выход из процедуры родителя

Сообщение sign » 20.01.2015 07:14:59

Код: Выделить всё
procedure TForm1.MenuItem1Click(Sender: TObject);
begin
  if pbegin then exit;
  ...
end;

function pbegin: boolean;
begin
  if ... then exit(true);
  ...
  result := false;
end;
sign
энтузиаст
 
Сообщения: 1131
Зарегистрирован: 30.08.2009 09:20:53

Re: Выход из процедуры родителя

Сообщение iN0k » 20.01.2015 12:50:55

в качестве плохого паттена проэктирования:
процедуру pbegin; сделать inline;.
проверенно будет работать :-).

Связанную с этим паттеном ошибку у себя как-то искать запарился )))
В связи с этим процедуру EXIT не использую :-)
iN0k
постоялец
 
Сообщения: 146
Зарегистрирован: 18.07.2012 14:09:50

Re: Выход из процедуры родителя

Сообщение Лекс Айрин » 20.01.2015 13:22:23

sign, я, кстати, тоже переделал бы процедуру так, чтобы не использовать Exit. Это несложно.
Аватара пользователя
Лекс Айрин
долгожитель
 
Сообщения: 5723
Зарегистрирован: 19.02.2013 16:54:51
Откуда: Волгоград

Re: Выход из процедуры родителя

Сообщение ivanov1 » 20.01.2015 18:28:05

iN0k писал(а):в качестве плохого паттена проэктирования:
процедуру pbegin; сделать inline;.
проверенно будет работать :-).

Связанную с этим паттеном ошибку у себя как-то искать запарился )))
В связи с этим процедуру EXIT не использую :-)

Попробую так сделать, всем большое спасибо!

Добавлено спустя 2 часа 4 минуты 42 секунды:
инлайн не сработал

Код: Выделить всё
procedure pbegin; inline;
begin
if belka=false then exit;
end;
ivanov1
новенький
 
Сообщения: 32
Зарегистрирован: 03.01.2015 16:25:04

Re: Выход из процедуры родителя

Сообщение iN0k » 20.01.2015 21:28:17

НЕ ДЕЛАЙ ЭТОГО ... я же написал плохого паттена проэктирования ...

причина почему так делать нельзя:
директива INLINE - это лишь твоя просьба компилятору ...
а он, компилятор, твою просьбу может выполнить, или забить на нее. это зависит от множества причин. Версии компилятора, параметров оптимизации кода и т.д.

ivanov1 писал(а):инлайн не сработал

вот ... звезды не сошлись ... а иногда могут и сойтись (обычно это при -О3) ...

но я еще раз повторю: НЕ ДЕЛАЙ ТАК ... это пример ПЛОХОГО, ОЧЕНЬ ПЛОХОГО подхода!!!

Делай как sign говорит, с поправкой Лекс Айрин!!! Это наверно самый ПРАВИЛЬНЫЙ вариант, который он будет работать всегда.
iN0k
постоялец
 
Сообщения: 146
Зарегистрирован: 18.07.2012 14:09:50

Re: Выход из процедуры родителя

Сообщение ivanov1 » 20.01.2015 22:10:21

Делай как sign говорит, с поправкой Лекс Айрин!!! Это наверно самый ПРАВИЛЬНЫЙ вариант, который он будет работать всегда.
ок
ivanov1
новенький
 
Сообщения: 32
Зарегистрирован: 03.01.2015 16:25:04

Re: Выход из процедуры родителя

Сообщение скалогрыз » 20.01.2015 22:22:38

а ещё рекомендуется меньше кода писать в MenuItemClick :)
особенно если идёт какая-та хитрая логика с pbegin и его не выполнением.

Добавлено спустя 3 минуты 49 секунд:
iN0k писал(а):вот ... звезды не сошлись ... а иногда могут и сойтись (обычно это при -О3) ...

в баг репорт? по логике вещей, exit в inlinе должен выйти только из текущей процедуры, но не родительской.
скалогрыз
долгожитель
 
Сообщения: 1803
Зарегистрирован: 03.09.2008 02:36:48

Re: Выход из процедуры родителя

Сообщение phomm » 20.01.2015 22:55:01

Можно использовать Abort, но, скорее всего, ещё понадобятся небольшие телодвижения, типа трайэксепта ( срабатывающего либо безотносительно типа исклдючения, либо явно на EAbortException) в нужном месте. Abort формально возвращается к ближайшему обработчику исключений, и может пройти нн-ое количество подпрограмм по стеку вызовов "назад".
Если что, могу привирать, ибо положения с Abort в RTL FPC не знаю, исхожу из опыта в Дельфи, полагаю, что наличествует.
Аватара пользователя
phomm
незнакомец
 
Сообщения: 9
Зарегистрирован: 26.09.2014 12:56:06
Откуда: Тюмень

Re: Выход из процедуры родителя

Сообщение pda » 20.01.2015 23:18:12

iN0k писал(а):проверенно будет работать

В багтрекер отправлено?
Аватара пользователя
pda
постоялец
 
Сообщения: 303
Зарегистрирован: 27.05.2005 19:59:53

Re: Выход из процедуры родителя

Сообщение iN0k » 20.01.2015 23:34:35

эм ...
про баг трекер СТОЙТЕ :oops:
щас проверил этот эфект НЕ НАБЛЮДАЕТСЯ
Lazarus 1.2.2 r44758 FPC 2.6.1 i386-win32-win32/win64

...
но он стопудово был (несколько лет назад) ... пытаюсь найти следы :oops:
iN0k
постоялец
 
Сообщения: 146
Зарегистрирован: 18.07.2012 14:09:50

Re: Выход из процедуры родителя

Сообщение sign » 21.01.2015 06:35:24

Ну, раз задача, просто что-то там проверить, то

Код: Выделить всё
procedure TForm1.MenuItem1Click(Sender: TObject);
begin
  if pbegin then exit;
  ...
end;

function pbegin: boolean;
begin
  Result := belka=false;
end;
sign
энтузиаст
 
Сообщения: 1131
Зарегистрирован: 30.08.2009 09:20:53

Re: Выход из процедуры родителя

Сообщение Лекс Айрин » 21.01.2015 10:08:44

sign, забейте на Exit. Как правило, если он используется, то значит программист не очень хорошо проработал код в данном месте программы. Exit, это тот же Goto и, насколько мне известно, компилируется в команду безусловного перехода в бинарном коде.
Аватара пользователя
Лекс Айрин
долгожитель
 
Сообщения: 5723
Зарегистрирован: 19.02.2013 16:54:51
Откуда: Волгоград

Re: Выход из процедуры родителя

Сообщение pda » 21.01.2015 13:48:13

Лекс Айрин писал(а):Как правило, если он используется, то значит программист не очень хорошо проработал код в данном месте программы.

Главное, говоря такие слова, сделать серьёзное лицо и не упоминать как часто используется exit() в исходниках free pascal и его rtl... :roll:
Аватара пользователя
pda
постоялец
 
Сообщения: 303
Зарегистрирован: 27.05.2005 19:59:53

Re: Выход из процедуры родителя

Сообщение Лекс Айрин » 21.01.2015 14:47:02

pda, а кто говорит, что FPC хорошо написан?

Хотел я его взять за основу одного проекта, но когда в исходники посмотрел, то посчитал более перспективным работать с нуля.
Аватара пользователя
Лекс Айрин
долгожитель
 
Сообщения: 5723
Зарегистрирован: 19.02.2013 16:54:51
Откуда: Волгоград

След.

Вернуться в Lazarus

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 255

Рейтинг@Mail.ru
cron