![]() |
|
#1
|
|||
|
|||
![]() Скажите мне, умные люди, ВСЕГДА ли при разрушении формы случается событие OnDestroy для этой формы? У меня оно как-то не случается, если форма разрушается косвенно(при разрушении формы-владельца).
Подробнее это выглядит так: На главной форме есть кнопка, при нажатии на которую создаётся другая форма, собственником которой является главная, т.е. Код:
И вот какая засада - если пользователь закрывает приложение (стандартным крестиком на главной форме), не закрыв перед этим Form2(ведь таких неаккуратных - пруд пруди!), то событие TForm2.FormDestroy не наступает ![]() |
#2
|
||||
|
||||
![]() Ничё не понял.
Если я таки понял тебя, то просто при "косвенном" закрытии вызови событие Form2.Destroy или как там оно называется. И будет тебе счастье. Если неправильно я понял, то поясни ещё раз. Если не ты, то кто? (с) Терри Пратчетт Не забывайте ставить плюсы и говорить спасибо! |
#3
|
|||
|
|||
![]() ни разу не вызывала событие принудительно. Ты не покажешь, как это сделать? Нижеприведенный вариант, наверное, совсем того ?
![]() Код:
|
#4
|
||||
|
||||
![]() Код:
Код:
Пишу программы за еду. __________________ |
#5
|
||||
|
||||
![]() В качестве параметра пихай тот объект, который должен вызвать событие. В данном случае ты ждешь ОнДестрой от Форм2. Ну вот и пихай вместо Сендер твой Форм2.
Грамотно поставленный вопрос содержит не менее 50% ответа. Грамотно поставленная речь вызывает уважение, а у некоторых даже зависть. |
#6
|
|||
|
|||
![]() Спасибо, запихнула. Работает!
Попутно вопрос - у меня в последнее время уже при закрытии Delphi часто возникает "Access violation at adress... in dcc70.dll///", причём нервный такой - многократно повторяющийся - множащийся окошками. И его никак, кроме как перезагрузившись, не успокоить. Подозреваю, что это может происходить из-за неправильной организации работы с формами. Может кто сталкивался с такой штукой и даст совет - хотя бы как проверить? У меня в приложении 4 формы с обычным шоу и три - с модальным. Те, которые с модальным, организованы по стандартному(где-то здесь вычитанному) шаблону: Код:
Формы, которые с обычным Show, создаются через TFormCreate(self), где self - это вышеупомянутая Form1. В каждой форме есть свойство типа TNotifyEvent, которое вызывается в CloseForm и сообщает форме-собственнику (ну, той самой Form1), что можно вызываемую рушить (а просто использовать Release в самой процедуре закрытия каждой формы вместо всех этих наворотов нельзя? ). Может непонятно объясняю, лучше код выкладывать? Но он такой... длинновастенький ![]() |
#7
|
|||
|
|||
![]() Код:
Последний раз редактировалось Asinkrit, 02.04.2011 в 20:22. |
#8
|
|||
|
|||
![]() Код:
Последний раз редактировалось Asinkrit, 02.04.2011 в 20:22. |
#9
|
|||
|
|||
![]() Да, очень доступно. Спасибо за подсказку! Попробую так поймать.
А многократное создание форм одного и того же типа при условии их корректного уничтожения - это нормально? Или лучше форму каждого типа создать один раз и потом открывать-закрывать? Ещё хочу уточнить по поводу бессмысленного кода (красного): при такой организации текста он НИКОГДА не выполнится или просто сначала будет выполнен блок Finally, а потом всё-таки exit сработает? Дело в том, что у меня-то там дальше в этой процедуре ещё кусок кода, который нужно выполнить только в случае закрытия формы с mrOK. |
#10
|
|||
|
|||
![]() 1234567890
Последний раз редактировалось Asinkrit, 02.04.2011 в 20:22. |
#11
|
|||
|
|||
![]() Выкладываю (и нервно курю в сторонке) :
Код:
Ну вот, как-то так примерно ![]() Последний раз редактировалось vikk, 09.02.2011 в 16:28. |
#12
|
|||
|
|||
![]() try-finally ее не поймает.
Последний раз редактировалось Asinkrit, 02.04.2011 в 20:22. |
#13
|
||||||
|
||||||
![]() Спасибо за разбор моих каракулей. С MDI-формами не работаю - не могу найти достаточное количество информации, чтоб хоть попробовать, как оно это делается. Скажем, можно ли только ЧАСТЬ форм проекта сделать дочерними к какой-то ещё форме проекта или уж если такая организация, то всего проекта в целом? И особенности организации, кроме как установка FormStyle главной - в MDIForm, а других - в MDIChild что-то не встретила.
Про то, что форму не создавать всякий раз новую, а использовать одну и ту же - это я подумаю, может быть перестрою мышление ![]() Unit1: Код:
Код:
А каким образом можно не выносить обработчик события с вызываемой формы, если в теле этого обработчика производятся манипуляции над ВЫЗЫВАЮЩЕЙ формой(в данном, например, случае надо в меню вызывающей формы создать новую кнопку с именем процесса, введенным пользователем в поле вызываемой формы) ? Другими словами, каковы должны быть действия в случае необходимости передать параметры из вызываемой формы - в вызывающую (гм, я здесь уже такую темку открывала). Можно попросить у Вас общую схему - как действовать в таких случаях? Про признак я не очень поняла. Плохость такого стиля в чём заключается - в том, что в качестве условия используется Caption или в том, что напрямую в коде прописывается кирилловая строка, которая может не совпасть по кодировке на каком-то другом компе ? Ведь если у я введу булевский признак IsNew, то ему же всё равно надо будет присваивать значение в соответствии с тем, нажата ли кнопка с названием 'Новый' или другая. А можно тогда через тэг кнопки эту проблему решить(чтоб не кирильничать в коде?) : Код:
Или это тоже нехорошо? Буду оооочень благодарна за любые наставления, указания, советы и пр. Последний раз редактировалось vikk, 11.02.2011 в 10:05. |
#14
|
|||
|
|||
![]() Я не зря про MDI
Последний раз редактировалось Asinkrit, 02.04.2011 в 20:23. |
#15
|
|||
|
|||
![]() Вау! Вот это я понимаю - объяснение. Осталось только проглотить
![]() Увы, совсем непохоже на то, что писано мной ![]() |