|
|
|
Как прекратить выполнение события из продцедуры?
|
|||
|---|---|---|---|
|
#18+
Произошло какое-то событие, ну допустим OnButton.Click, и оно выполняется... Если в теле этого события встретится Exit, то выполнение прекращается. Но если, в нём вызывается процедура, и уже в ней встретится Exit, то прекратится исполнение только этой процедуры. А можно ли из процедуры остановить выполнение всего события? Конечно можно делать костыли: можно превратить процедуру в функцию, и в ней перед выходом подавать значение: выполнилась нормально или прекратила работу через Exit, а потом на основания полученного от функции значения делать такой же выход и в блоке вызвавшем функцию. Но это костыли! Возможно тут кто-то возмущённо скажет, что НЕТ, что Именно так и должна работать программа, последовательно и продуманно выполняя каждое действие... Но по такой логике и Exit не должен существовать, а тем более ужасный Halt. Ну или как аналог взять циклы: там есть Continue (так же как Exit прерывающий выполнение блока), но есть и Break - который прекращает выполнение всего цикла (вот аналог такого для прекращения события я и ищу). P.S. Предвижу что кто-то вместо решения задачи, будет говорить о лени, о том что дескать поставить одну проверку, или даже вписать вместо простого вызова процедуры, конструкцию типа: if MyFunction=666 then Exit - это даже красиво... Но эти процедура приводящая к остановке может иметь и десятую степень вложенности, и тогда переделывать процедуры в функции надо будет в десятках мест. Да и где-то может оказаться что остановка произойдёт в функции, а она уже и так что-то возвращает... Тут сразу же появятся люди которые предложат проверять не возвращаемое событие, а специально созданную глобальную переменную. И по всему коду, на всех уровнях вложенности, после выхода из каждой процедуры или функции связанной с этим событием надо будет выставлять проверки выхода (если внутри могла быть изменена эта глобальная переменная). Тут уже кто-то ужаснётся - Что так у тебя за монстр, многоуровневый и остановить которого может потребоваться не в одном каком-то месте, а во многих местах на разных уровнях? Всё просто: Одна кнопка, и она вызывает событие который производит анализ большого массива данных. Расчёты производятся десятками разных методов. У каждого разный метод. Где-то идём рекурсивно, где-то проверяем на возможность ошибок перебором углубляясь вглубь и сравнивая с другими блоками массива, где-то пытаемся вычислить что может произойти и просчитываем дальнейшие решения на базе имеющихся данных, чтобы предугадать события, где-то просто оптимизируем меняя одну последовательно данных на другую... И на разных уровнях вложенности есть возможность отображения на экране (изменение данных, изменение данных, отметка области с ошибками, удаление того что не повлияет ни на что... Всем выводом занимается одна процедура (вызываемая из сотни мест на разных уровнях вложенности процедур и функций). И чтобы сделать пошаговый вывод, достаточно было бы в конце этой функции вызвать какой-то условный GlobalExit (или EventExit), который бы остановил всё действие единственного события. Чтобы оператор проанализировал изменения, и принял решение о продолжении анализа уже с другими параметрами или с другим приоритетом или в другом направлении. Не хочется в случае пошагового режима после каждого вывода данных делать бесконечный цикл (таким образом останавливая работу программы) и Halt'ить её для того чтобы оператор продолжил анализ с другими параметрами. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.09.2019, 13:56 |
|
||
|
Как прекратить выполнение события из продцедуры?
|
|||
|---|---|---|---|
|
#18+
Код: pascal 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.09.2019, 14:11 |
|
||
|
Как прекратить выполнение события из продцедуры?
|
|||
|---|---|---|---|
|
#18+
Aniskinraise EEverythingIsOk Обычно используется Abort; Posted via ActualForum NNTP Server 1.5 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.09.2019, 14:14 |
|
||
|
Как прекратить выполнение события из продцедуры?
|
|||
|---|---|---|---|
|
#18+
InterSkyА можно ли из процедуры остановить выполнение всего события? Можно процедуру объявить функцией и анализировать её результат. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.09.2019, 14:48 |
|
||
|
Как прекратить выполнение события из продцедуры?
|
|||
|---|---|---|---|
|
#18+
wadmanInterSkyА можно ли из процедуры остановить выполнение всего события? Можно процедуру объявить функцией и анализировать её результат. Процедура которую вы предложили объявить функцией и анализировать её результат, сама может быть вызвана из другой функции вызванной из процедуры сработавшей по OnClick. Этот вариант предусмотрительно разобран в вопросе, чтобы заранее избавиться от ответов типа вашего... Aniskin - спасибо! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.09.2019, 15:19 |
|
||
|
Как прекратить выполнение события из продцедуры?
|
|||
|---|---|---|---|
|
#18+
InterSky, обработка исключительных ситуаций может вам помочь. InterSky... Ну или как аналог взять циклы: там есть Continue (так же как Exit прерывающий выполнение блока), но есть и Break - который прекращает выполнение всего цикла (вот аналог такого для прекращения события я и ищу). Break прерывает цикл, но не прерывает процедуру. Exit - прерывает не только цикл, но и процедуру. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.09.2019, 15:30 |
|
||
|
Как прекратить выполнение события из продцедуры?
|
|||
|---|---|---|---|
|
#18+
Dimitry SibiryakovОбычно используется Abort; +1 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.09.2019, 15:35 |
|
||
|
Как прекратить выполнение события из продцедуры?
|
|||
|---|---|---|---|
|
#18+
goldmi45InterSky, обработка исключительных ситуаций может вам помочь. InterSky... Ну или как аналог взять циклы: там есть Continue (так же как Exit прерывающий выполнение блока), но есть и Break - который прекращает выполнение всего цикла (вот аналог такого для прекращения события я и ищу). Break прерывает цикл, но не прерывает процедуру. Exit - прерывает не только цикл, но и процедуру. Вы знаете что такое аналогия? Представьте язык программирования, в котором нету циклов (а так же goto и рекурсии). Если вам надо было бы что-то выполнить в цикле от 1 до 5, вы бы писали: Код: pascal 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. То есть, цикл - это процедура внутри процедуры. Если вместо комментария вы впишите текст программы и там встретится Exit, он сработает как Continue в циклах и завершит лишь внутреннюю процедуру "innerProc". По аналогии, встречающийся в цикле Break завершил бы внешнюю процедуру "outerProc". ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.09.2019, 17:07 |
|
||
|
Как прекратить выполнение события из продцедуры?
|
|||
|---|---|---|---|
|
#18+
InterSky, "Выдыхай, бобер" - ©. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.09.2019, 17:22 |
|
||
|
Как прекратить выполнение события из продцедуры?
|
|||
|---|---|---|---|
|
#18+
InterSky, авторНо если, в нём вызывается процедура, и уже в ней встретится Exit, то прекратится исполнение только этой процедуры. А можно ли из процедуры остановить выполнение всего события? надежнее и проще всего решается исключениями ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.09.2019, 18:10 |
|
||
|
Как прекратить выполнение события из продцедуры?
|
|||
|---|---|---|---|
|
#18+
Есть еще более красивый вариант: Код: pascal 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.09.2019, 18:15 |
|
||
|
Как прекратить выполнение события из продцедуры?
|
|||
|---|---|---|---|
|
#18+
rgreatЕсть еще более красивый вариант: If not MyProc then Exit; Я же объяснил что и из функций тоже надо выходить... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.09.2019, 18:25 |
|
||
|
Как прекратить выполнение события из продцедуры?
|
|||
|---|---|---|---|
|
#18+
InterSky, Меняйте функцию. funtion myFunc: integer; на funtion myFunc(out Res: integer): boolean; ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.09.2019, 18:29 |
|
||
|
Как прекратить выполнение события из продцедуры?
|
|||
|---|---|---|---|
|
#18+
Собственно половина winAPI так работает. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.09.2019, 18:30 |
|
||
|
Как прекратить выполнение события из продцедуры?
|
|||
|---|---|---|---|
|
#18+
InterSkyЯ же объяснил что и из функций тоже надо выходить... Слово "аборт" ты при чтении топика пропустил как "шибка нипанятное"? Posted via ActualForum NNTP Server 1.5 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.09.2019, 18:35 |
|
||
|
Как прекратить выполнение события из продцедуры?
|
|||
|---|---|---|---|
|
#18+
Dimitry Sibiryakov, Abort - медленно. Если таких выходов предпологается много - это очень плохое решение. Как-то у меня коллега сделал как-то так: Код: pascal 1. 2. 3. 4. 5. 6. 7. 8. 9. А потом удивлялся, что это у него все тормозит нещадно на больших объемах данных. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.09.2019, 18:40 |
|
||
|
Как прекратить выполнение события из продцедуры?
|
|||
|---|---|---|---|
|
#18+
rgreatА потом удивлялся, что это у него все тормозит нещадно на больших объемах данных. Тормозило у него в основном из-за передачи строки по значению скорее всего. SEH, используемый для исключений, считается быстрейшим способом их обработки из всех. Posted via ActualForum NNTP Server 1.5 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.09.2019, 18:46 |
|
||
|
Как прекратить выполнение события из продцедуры?
|
|||
|---|---|---|---|
|
#18+
Dimitry Sibiryakov, Код: pascal 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 11297 0 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.09.2019, 18:52 |
|
||
|
Как прекратить выполнение события из продцедуры?
|
|||
|---|---|---|---|
|
#18+
rgreat11297 0 Ну, у меня разница не так велика, но таки да, второй цикл в 100 раз быстрее первого. Очевидно, туда вмешиваются накладные расходы менеджера памяти. Жаль в Дельфи нельзя выкинуть статический объект исключения. Posted via ActualForum NNTP Server 1.5 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.09.2019, 19:07 |
|
||
|
Как прекратить выполнение события из продцедуры?
|
|||
|---|---|---|---|
|
#18+
Dimitry Sibiryakov, 0.1 секунды на мнеджер памяти не списать. Если бы дело было только в нем то было бы не 100 вызовов в секунду а как минимум 10000. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.09.2019, 19:21 |
|
||
|
Как прекратить выполнение события из продцедуры?
|
|||
|---|---|---|---|
|
#18+
Упс, 0.01 сек. Опечатался. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.09.2019, 19:22 |
|
||
|
Как прекратить выполнение события из продцедуры?
|
|||
|---|---|---|---|
|
#18+
rgreat0.1 секунды на мнеджер памяти не списать. Это у тебя что-то с таймером. Мне пришлось добавить два нуля в цикл чтобы получить 4087 47 Posted via ActualForum NNTP Server 1.5 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.09.2019, 19:23 |
|
||
|
Как прекратить выполнение события из продцедуры?
|
|||
|---|---|---|---|
|
#18+
Выброс исключения тормозит, да. Там, где предполагается частый отрицательный результат, лучше юзать возврат флага/кода ошибки ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.09.2019, 19:26 |
|
||
|
Как прекратить выполнение события из продцедуры?
|
|||
|---|---|---|---|
|
#18+
Dimitry SibiryakovЭто у тебя что-то с таймером. Не, реально 11 секунд. Delphi 10.2, Release, Core i5-6500 3.2 GHz. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.09.2019, 19:28 |
|
||
|
Как прекратить выполнение события из продцедуры?
|
|||
|---|---|---|---|
|
#18+
Под x64 быстрей. x86 - 11391 х64 - 4265 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.09.2019, 19:31 |
|
||
|
Как прекратить выполнение события из продцедуры?
|
|||
|---|---|---|---|
|
#18+
rgreatDelphi 10.2, Release, Core i5-6500 3.2 GHz. Delphi 2006, AMD ноутбук пятилетней давности 1Ггц. Походу, они что-то сломали в RTL. Posted via ActualForum NNTP Server 1.5 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.09.2019, 19:32 |
|
||
|
Как прекратить выполнение события из продцедуры?
|
|||
|---|---|---|---|
|
#18+
Dimitry Sibiryakov, Не. Надо было не из под среды запускать. Она даже в релизе ошибки отлавливает оказывается. Теперь все как у тебя. Код: pascal 1. 4047 62 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.09.2019, 19:40 |
|
||
|
Как прекратить выполнение события из продцедуры?
|
|||
|---|---|---|---|
|
#18+
InterSkyТо есть, цикл - это процедура внутри процедуры. Если вместо комментария вы впишите текст программы и там встретится Exit, он сработает как Continue в циклах и завершит лишь внутреннюю процедуру "innerProc". По аналогии, встречающийся в цикле Break завершил бы внешнюю процедуру "outerProc". Чта? Всегда считал, что цикл - это конструкция, предназначенная для многократного выполнения. В паскале это for, while, repeat-until. То, что вы привели, это последовательное выполнение процедуры. И если в outerProc вы напишете Break без цикла, то будет ошибка компиляции. Потому что break должен находиться внутри цикла (for, while, repeat-until). Код 1: Код: pascal 1. 2. 3. 4. 5. 6. 7. 8. 9. Код 2: Код: pascal 1. 2. 3. 4. 5. 6. 7. 8. 9. Как вы думаете, есть разница между кодом 1 и 2? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.09.2019, 08:02 |
|
||
|
Как прекратить выполнение события из продцедуры?
|
|||
|---|---|---|---|
|
#18+
InterSky, есть еще способ, если по твоим условиям позволено менять тип и кол-во параметров процедуры (изврат, конечно, но если сильно надо) :) Код: pascal 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. 38. 39. 40. 41. 42. 43. 44. 45. 46. 47. 48. 49. 50. 51. 52. 53. 54. 55. 56. 57. 58. 59. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.09.2019, 09:24 |
|
||
|
Как прекратить выполнение события из продцедуры?
|
|||
|---|---|---|---|
|
#18+
Попробуйте использовать вместо if then оператор выбора case или метку Label ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.09.2019, 17:18 |
|
||
|
Как прекратить выполнение события из продцедуры?
|
|||
|---|---|---|---|
|
#18+
13.09.2019 17:18, Linux_64 пишет: > Попробуйте использовать вместо if then оператор выбора case или метку Label и шо? Posted via ActualForum NNTP Server 1.5 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.09.2019, 18:11 |
|
||
|
|

start [/forum/topic.php?all=1&fid=58&tid=2039047]: |
0ms |
get settings: |
7ms |
get forum list: |
11ms |
check forum access: |
2ms |
check topic access: |
2ms |
track hit: |
21ms |
get topic data: |
7ms |
get forum data: |
2ms |
get page messages: |
37ms |
get tp. blocked users: |
1ms |
| others: | 225ms |
| total: | 315ms |

| 0 / 0 |
