После закрытия формы (XE6) крестиком на экране всё исчезает, но вот в Диспетчере задач my.exe кочует из Приложения в Фоновые процессы, посему не позволяет запустить это приложение в следующий раз. Приходится вручную нажимать "Снять задачу".
Перепробовал внутри TFormMain.FormDestroy:
Application.Terminate; // не помогло
Halt(700); // не помогло
даже попробовал:
FreeAndNil(Application); // не помогло
Причём этой проблемы нет если запускать (Run (F9)) и закрывать из RAD Studio XE6, правда при закрытии приложения запущенного из Studio надо нажимать Control Reset (CTRL + F2) (это красная квадратная кнопка наверху) чтобы можно было ещё раз запустить с F9 или редактировать.
Как закрыть приложение, ставшее невидимым из за того что оно вдруг стало фоновым процессом?
Уважаемые авторы вопросов! Большая просьба сообщить о результатах решения проблемы на этой странице. Иначе, следящие за обсуждением, возможно имеющие аналогичные проблемы, не получают ясного представления об их решении. А авторы ответов не получают обратной связи. Что можно расценивать, как проявление неуважения к отвечающим от автора вопроса.
17-11-2018 23:15
>>> Причём этой проблемы нет...из RAD Studio XE6
>>> надо нажимать Control Reset
Противоречащие параграфы. Это одна и та же проблема, просто под отладкой она проявляется именно так.
Без кода сказать что-то невозможно. Но скорее всего, кода там (а) много (б) публиковать его вы не захотите. Так что единственный совет - это попытаться выделить участок кода, из-за которого это происходит. Пока вангую только наиболее очевидные и понятные варианты поиска проблемы (но, похоже, вы их не проверили):
обязательно сделать резервную копию текущего проекта. Совет абсолютно очевидный, но я на всякий случай пишу - некоторые умудряются удалить код и только потом вспомнить, что резервной копии то и нет... и всё это писать заново. На Undo надеяться не надо, может не сработать.
проверить, что эффект есть, если просто запустить приложение, НИЧЕГО НЕ ДЕЛАТЬ (нельзя даже перемещать форму и менять размер!) и просто закрыть. Если при этом эффект исчезнет - дело косвенно (НЕ ПРЯМО!) связано с обработчиком того события, которое вызывалось. Это обязательно нужно проверить! В дальнейшем при ВСЕХ экспериментах - аналогично, не выполнять никаких действий, просто открыть и закрыть приложение. Наиболее удобно это делать в отладке, если "красный квадрат" (program reset) активен - программа работает, но "скрыта".
при запуске программа автоматически соединяется с БД? Отключить! Открывает сохранённую сессию? Убрать! Открывает файлы? Выключить. Проверить эффект.
наименее инвазивный метод. Встать на первую строчку FormClose брякой (Breakpoint) и оттрассировать до end по F8 (Step Over). Оказавшись на end попробовать нажать F7 (Step Into). Если повезёт - можно попасть в обработчик vcl. Трассировать его, проверить входы в личный код.
второй неинвазивный метод. Встать брякой на Halt(700) (хотя аргумент Halt вообще значения не имеет, просто показывает, что вы не понимаете, что делаете) и посмотреть отладчиком, встаёт у него на эту строчку или нет. Если встаёт - то обработчики OnClose, OnDestroy (см. далее) можно не проверять, дело не в них. Хотя можно и проверить, хуже не будет.
закомментировать/удалить FormDestroy (полностью, объявление var можно оставить, warning компилятора пока игнорировать, на утечки памяти внимания не обращать). Теоретически, можно просто отключить обработчик через инспектор объектов, но я это не люблю - ненаглядно, да и можно забыть включить по окончанию проверки, потом будет куча вопросов типа: "обработчик есть, но не вызывается, какого???" потому, не рекомендую такое решение. Ни в коем случае не забывать, что помимо ГЛАВНОЙ формы в проекте могут быть ещё несколько форм (как автосоздаваемых, так и нет), для них этот процесс тоже надо выполнить! Попробовать запустить программу ещё раз. Проверить, остался ли эффект. По окончанию удаления всех обработчиков, выполнить Build All и ещё раз повторить прогон. Наиболее вероятно, что не поможет, но попробовать надо.
закомментировать/удалить FormClose (аналогично). Опять-таки ни в коем случае не забывать про другие формы в проекте, как автосоздаваемые, так и нет! Запускать программу после каждого удаления, проверять эффект. После последнего удаления - сделать Build All и проверить ещё раз. На это решение у меня больше всего ставка.
проверить, не использует ли программа дочерние потоки. Простейший вариант - утилитами типа ProcMon от Руссиновича (там есть столбец Threads). Если да - найти и убрать соответствующие CreateThread/BeginThead. Помнить, что дочерние потоки могут порождать сторонние компоненты. Если непонятно, кто даёт эффект - просто убрать все сторонние компоненты из проекта. Убирать не сразу, а по одному, проверяя наличие эффекта после каждого удаления. Разумеется, придётся чистить код, удаляя ссылки на удалённые компоненты. Про дополнительные формы в проете не забываем, их чистим тоже, правда, во вторую очередь.
проверить, не используются ли сторонние DLL. Отключить сторонние DLL, либо отключить компоненты, которые их используют. Помнить, что DLL могут линковаться не только статически и плагин FileInfo из Total может не найти зависимость.
проверить finalization всех используемых модулей на подозрительные вещи, проще всего - почистить всё, что там находится нафиг. Проверять эффект после каждой очистки. По окончанию очистки всех модулей - Build All и контрольный прогон.
проверить, не используется ли перехват ExitProc и если есть - выдрать нещадно изо всех мест. Проблема усугубляется тем, что перехват может выполняться в сторонних модулях.
удалить обработчики OnMove, OnResize (эммм... честно, не помню так ли они зовутся, я сейчас на lazarus в основном сижу, но смысл должен быть понятен) форм (главной, дополнительных). Проверить эффект.
удалить OnCreate форм (главной, дополнительных). Проверить эффект. Помнить, что в OnCreate могут создаваться важные для работы объекты и программа может начать "падать". Хотя если ничего не делать (кнопки не нажимать, в менюшки не входить, а OnResize, OnMove мы ранее убрали) - то обращений к несозданным объектам не будет и ничего не произойдёт.
(это уже медитация, когда ничего другого не остаётся): последовательно удалять все обработчики всех компонентов во всех формах, начиная с главной. В идеале по окончанию этого процесса в модулях вообще останутся только неиспользуемые процедуры и функции.
(медитация второго уровня): удалить из секции Uses всех форм все нестандартные модули. Очистить код от внешних ссылок, если потребуется. Build All и проверять эффект.
В самом лёгком случае, окажется, что в FormClose стоит Action:=caHide и достаточно его убрать, чтобы всё заработало как надо (например, собирались сделать скрывающуюся в трей форму, но забыли доделать).
В самом худшем случае поможет только последний метод, да ещё при удалении какого-нибудь невзрачного модуля, у которого к тому же и PAS нету, только DCU. Это самый тяжёлый вариант - только переписывать функционал этого недоступного модуля. Если это ещё и коммерческий модуль из коммерческого компонента - то всё, гаси свет. От него могут зависеть другие модули этого же коммерческого пакета. писать в поддержку компонента, если куплен. Если честная пиратка - поискать на форумах, стопроцентно кто-то уже сталкивался, в самой честной в мире стране другого не ожидаю. Если нет - искать аналог и срочно менять.
Думаю, надо выяснять, что там остается на исполнении. Какие потоки не выключились, куда ушло управление после закрытия формы. Удаляется ли форма вообще при закрытии или просто закрывается
Если вы заметили орфографическую ошибку на этой странице, просто выделите ошибку мышью и нажмите Ctrl+Enter. Функция может не работать в некоторых версиях броузеров.