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

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

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

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

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

Сообщение ivanov1 »

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

т.е.

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

procedure TForm1.MenuItem1Click(Sender: TObject);
begin
 pbegin;
 ///
 ///
 ///
 ////
end;

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

sign
энтузиаст
Сообщения: 1131
Зарегистрирован: 30.08.2009 09:20:53

Сообщение sign »

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

procedure TForm1.MenuItem1Click(Sender: TObject);
begin
  if pbegin then exit;
  ...
end;

function pbegin: boolean;
begin
  if ... then exit(true);
  ...
  result := false;
end;
iN0k
постоялец
Сообщения: 146
Зарегистрирован: 18.07.2012 14:09:50

Сообщение iN0k »

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

Связанную с этим паттеном ошибку у себя как-то искать запарился )))
В связи с этим процедуру EXIT не использую :-)
Аватара пользователя
Лекс Айрин
долгожитель
Сообщения: 5723
Зарегистрирован: 19.02.2013 16:54:51
Откуда: Волгоград
Контактная информация:

Сообщение Лекс Айрин »

sign, я, кстати, тоже переделал бы процедуру так, чтобы не использовать Exit. Это несложно.
ivanov1
новенький
Сообщения: 32
Зарегистрирован: 03.01.2015 15:25:04

Сообщение ivanov1 »

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

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

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

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

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

procedure pbegin; inline;
begin
 if belka=false then exit;
end;
iN0k
постоялец
Сообщения: 146
Зарегистрирован: 18.07.2012 14:09:50

Сообщение iN0k »

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

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

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

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

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

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

Сообщение ivanov1 »

Делай как sign говорит, с поправкой Лекс Айрин!!! Это наверно самый ПРАВИЛЬНЫЙ вариант, который он будет работать всегда.
ок
скалогрыз
долгожитель
Сообщения: 1804
Зарегистрирован: 03.09.2008 02:36:48

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

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

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

в баг репорт? по логике вещей, exit в inlinе должен выйти только из текущей процедуры, но не родительской.
Аватара пользователя
phomm
незнакомец
Сообщения: 9
Зарегистрирован: 26.09.2014 12:56:06
Откуда: Тюмень
Контактная информация:

Сообщение phomm »

Можно использовать Abort, но, скорее всего, ещё понадобятся небольшие телодвижения, типа трайэксепта ( срабатывающего либо безотносительно типа исклдючения, либо явно на EAbortException) в нужном месте. Abort формально возвращается к ближайшему обработчику исключений, и может пройти нн-ое количество подпрограмм по стеку вызовов "назад".
Если что, могу привирать, ибо положения с Abort в RTL FPC не знаю, исхожу из опыта в Дельфи, полагаю, что наличествует.
Аватара пользователя
pda
постоялец
Сообщения: 303
Зарегистрирован: 27.05.2005 19:59:53

Сообщение pda »

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

В багтрекер отправлено?
iN0k
постоялец
Сообщения: 146
Зарегистрирован: 18.07.2012 14:09:50

Сообщение iN0k »

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

...
но он стопудово был (несколько лет назад) ... пытаюсь найти следы :oops:
sign
энтузиаст
Сообщения: 1131
Зарегистрирован: 30.08.2009 09:20:53

Сообщение sign »

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

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

procedure TForm1.MenuItem1Click(Sender: TObject);
begin
  if pbegin then exit;
  ...
end;

function pbegin: boolean;
begin
  Result := belka=false;
end;
Аватара пользователя
Лекс Айрин
долгожитель
Сообщения: 5723
Зарегистрирован: 19.02.2013 16:54:51
Откуда: Волгоград
Контактная информация:

Сообщение Лекс Айрин »

sign, забейте на Exit. Как правило, если он используется, то значит программист не очень хорошо проработал код в данном месте программы. Exit, это тот же Goto и, насколько мне известно, компилируется в команду безусловного перехода в бинарном коде.
Аватара пользователя
pda
постоялец
Сообщения: 303
Зарегистрирован: 27.05.2005 19:59:53

Сообщение pda »

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

Главное, говоря такие слова, сделать серьёзное лицо и не упоминать как часто используется exit() в исходниках free pascal и его rtl... :roll:
Аватара пользователя
Лекс Айрин
долгожитель
Сообщения: 5723
Зарегистрирован: 19.02.2013 16:54:51
Откуда: Волгоград
Контактная информация:

Сообщение Лекс Айрин »

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

Хотел я его взять за основу одного проекта, но когда в исходники посмотрел, то посчитал более перспективным работать с нуля.
Ответить