|
|
Регистрация Восстановить пароль |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
|
|
Опции темы | Поиск в этой теме |
21.08.2015, 10:54 | #1 |
Форумчанин
Регистрация: 11.06.2010
Сообщений: 525
|
Помогите обойти рекурсию, чтобы правильно закрыть форму
Доброе время суток форумчане
Приложение работает с БД. Есть 2 сценария работы программы: первый режим (в свернутом виде - работает), с вторым режимом (немного отличается от первого) у меня возникла проблема. Есть DataSet с данными, в котором первая строка, позволяет открыть «Form2», т.е. LRemains = 0 (см. код), вторая строка, НЕ разрешает открыть «Form2», т.е. LRemains <> 0 (см. код), Проблема в том что, после ухода с первой строки, «Form2» - не закрывается Если кратко то дело обстоит так: Код:
Код:
Код:
Код:
В первом сценарии форма закрывается где я указал. Но 2-ой сценарии – у меня какой-то замкнутый цикл. А если в «Form1.MESSAGE_APPLICATION», явно грохнуть «Form2», тогда «Project PEng_gDB.exe raised exception class EAccessViolation with message 'Access violation at address 0000001B. Read of address 0000001B'. Process stopped. Use Step or Run to continue.» и "Project D:\Prog\Eng_gdb\PEng_gDB.exe faulted with message: 'application-defined exception (code 0xc000041d) at 0x76e80309'. Process Stopped. Use Step or Run to continue." Мне нужно каким-то образом выйти на "FRepeat.Free;" перед "Form1.ibdsWord.Next;". И закрыть «Form2». Заранее спасибо Последний раз редактировалось KBO; 21.08.2015 в 11:05. |
21.08.2015, 11:35 | #2 |
мальчик-помогай =)
Форумчанин
Регистрация: 16.09.2010
Сообщений: 522
|
Сложно что-то конкретно советовать, не знаю весь проект (а он явно сложнее, чем обычная писанина студентов), но:
1) Show/Hide вместо постоянного Create/Free 2) не совсем отдельное от п.1, но очень плохая идея в таймере создавать окна ----------------------------- да, таймер совсем тут не нужен.. я бы заменил его на пользовательское сообщение, если уж очень нужно показывать/скрывать форму 2 после окончания кода обработки события простейший вариант: Код:
Последний раз редактировалось GreenWizard; 21.08.2015 в 11:49. Причина: не проснулся, блин, и торможу |
21.08.2015, 12:01 | #3 | |
Форумчанин
Регистрация: 11.06.2010
Сообщений: 525
|
Цитата:
Как я выше писал (про один из сценариев ее работы), при работе в скрытом режиме, она может через заданный промежуток времени, показывать небольшое окно с разными англ.словами, чтоб пользователь мог, их вспоминать (кнопки "да", "нет"), а потом опять закрываться. и опять открываться и т.д. Т.е. без таймера тут ни как. А на счет "Show/Hide" - спасибо - это вариант, я как-то о "Hide" - забыл. нужно тогда будет немного событие «TimerRepeatTimer» переделать, т.е сделать 2 ветки: одна на "create/free", другая на "Show/Hide" Последний раз редактировалось KBO; 21.08.2015 в 12:09. |
|
21.08.2015, 12:40 | #4 |
Старожил
Регистрация: 20.04.2008
Сообщений: 5,528
|
Код:
Она должна сообщить о своих результатах и все. ---------------- Это ДОЛЖНО быть в Form1OnTimer ПОСЛЕ showModal. (получили результат и принимаем решение о дальнейших действиях) после перемещения видно что ontimer и AfterScroll имеют неуправляемую рекурсию. afterScroll вызвает Ontimer где идет перемещение (Next) что приводит к AfterScroll и .... ---------------- И ПОСКОЛЬКУ это(Next) ни в коем разе не ДОЛЖНО быть вызвано при Scroll, то НЕ ДЕЛАТЬ там (AfterScroll) вызов обработки, а просто НАПИСАТЬ второй код создания (показа) form2. =============== по поводу второго кода (и "левого"вызова обработчика события)
программа — запись алгоритма на языке понятном транслятору
Последний раз редактировалось evg_m; 21.08.2015 в 12:52. |
21.08.2015, 14:03 | #5 | |
мальчик-помогай =)
Форумчанин
Регистрация: 16.09.2010
Сообщений: 522
|
Цитата:
во-первых, таймер не должен знать о Form2 т. е. в OnTimer мы должны только проверить пришло ли время показа (если интервал таймера = периодичности показа, то проверка не нужна, она внутри таймера) и вызвать уже некий showForm2() во-вторых, во втором сценарии (или первом, не помню) должен быть именно вызов showForm2(), а не обработчика таймера showForm2() я бы сделал методом главной формы и поручил бы ему создание/показ Form2 + работу с БД, а в Form2 оставил самый минимум, например, оповещение Form1 об ответе пользователя и таймер скрытия формы (скажем, 30 сек на ответ отводим пользователю) AfterScroll я бы вовсе выпилил т. к. он явно не для этого и могут быть проблемы... как-то так: Код:
Последний раз редактировалось GreenWizard; 21.08.2015 в 14:07. |
|
21.08.2015, 15:15 | #6 |
Форумчанин
Регистрация: 11.06.2010
Сообщений: 525
|
Сделал до завтра пока, так
Код:
только из-за "Enabled := false;" пришлось вставить "BringWindowToTop(FMain.Handle) ;" - т.к. Form1, после того как "LRemains <> 0" - прячется на задний план почему-то. Хотя на форуме встретилось, что на это вроде "grid" влияет, хотя не сказано почему??? Но потом - правильно сказал evg_m нужно правильно оформить результат "Form2" |
21.08.2015, 15:21 | #7 |
мальчик-помогай =)
Форумчанин
Регистрация: 16.09.2010
Сообщений: 522
|
ну, вполне логично: окно создали/показали - сделать его активным
сам в одном проекте писал подобный код т. к. окно новостей захватывало фокус |
21.08.2015, 15:37 | #8 |
Форумчанин
Регистрация: 11.06.2010
Сообщений: 525
|
Так почему "Enabled := false;", после закрытия "Form2", переводит "Form1" на задний план?
Я взял и такое же сделал на простеньком приложении (в котором одни формы). Так такого не было... Это в общем-то не так нужно, но хотелось бы узнать Еще немножко полохо, когда "Form2" закрывается и опять открывается, то вся "Form1" перерисовывается (вот бы от этого избавиться, совсем классно было бы!!! :-)) Последний раз редактировалось KBO; 21.08.2015 в 15:45. |
22.08.2015, 11:42 | #9 | |
мальчик-помогай =)
Форумчанин
Регистрация: 16.09.2010
Сообщений: 522
|
Цитата:
По теме: это нужно смотреть весь проект, может ты как-то не там окна показываешь и оно моргает |
|
22.08.2015, 12:16 | #10 | |
фонатик DELPHI
Форумчанин
Регистрация: 14.01.2008
Сообщений: 714
|
Такое пишешь, автор?
п.с Советую прислушаться к товарищу evg_m, начиная отсюда Цитата:
95% сбоев и ошибок приложений, находится в полу метрах от монитора
Последний раз редактировалось JUDAS; 22.08.2015 в 12:21. |
|
|
Похожие темы | ||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
Как закрыть форму? | MIKE11IPME | Windows Forms | 8 | 11.08.2013 02:07 |
Закрыть вторую форму | WhiteForge | Общие вопросы Delphi | 19 | 03.11.2012 22:04 |
Закрыть форму по команде TsaveDialog | kta87 | Общие вопросы Delphi | 10 | 21.05.2012 20:10 |
Закрыть и открыть форму | Swatch | Microsoft Office Access | 1 | 31.05.2010 23:04 |
Как закрыть форму при показе | RIO | Общие вопросы Delphi | 4 | 28.08.2009 07:54 |