| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > Delphi: Общие вопросы > Правильное зевершение приложения |
| Автор: EDuard 14.12.2005, 21:15 |
| В программе в Project1.dpr при определенных условиях создаю Form2 из Unit2.pas, при клике на кнопку расположенную на Form2 нужно закрыь проект. Пишу Application.Terminate завершается, но с ошибкой: Debugger Exception Notification "Project Project1.exe raised exception class EInvalidOperation with message 'Cannot make a visible window modal'. Process stoped". При этом главной формой проекта является Form1, которую не создаю если создаю Form2, или создаю после некоторых действий с Form2. Как правильно завершить программу? |
| Автор: Snowy 14.12.2005, 21:20 |
| Дай код. |
| Автор: THenry 14.12.2005, 22:35 |
| Как так? Form1 главная, а ты её не создаешь, но независимо от Form1 всегда создается Form2. Ну дык сделай Form2 главной и Form2.Close; |
| Автор: Zero 14.12.2005, 22:39 | ||||||||
Напиши в форме 2, на кнопку вот так:
При этом возможно придётся после implementation втавить:
Смысл в том, что при выполнении команды Close происходит переход главной формы, на строчку с командой End., главного файла проекта, поэтому должно сработать - ИМХО самый универсальный способ. Добавлено @ 22:40
И закроется только вторая форма. |
| Автор: THenry 14.12.2005, 22:50 | ||
А это я для кого написал? |
| Автор: Zero 14.12.2005, 22:56 | ||
Велосипед неприемлим в 21 веке, без необходимости... |
| Автор: THenry 14.12.2005, 23:02 |
| Посмотрел бы я как ты будешь закрывать не созданную Form1 кодом Form1.Close; |
| Автор: Snowy 14.12.2005, 23:23 | ||
|
| Автор: Zero 14.12.2005, 23:41 | ||||||
Всё просто:
Ну а в файле проекта естесно:
Добавлено @ 23:42 Про про не созданную ту речь не идёт. |
| Автор: Poseidon 15.12.2005, 00:05 |
| а как насчет halt? |
| Автор: FRAGNATIC 15.12.2005, 00:44 | ||
терминэйт коректней завершает работу) |
| Автор: Albinos_x 15.12.2005, 06:56 |
| вообще как я понял, выполнение Form2.ShowModal приостанавливает выполнение кода. если в ней делаешь Application.Terminate, о по-любому нормально приложение не завершится, т.к. не выполнена строчка Application.Run; - здесь лучше использовать как предлогал Poseidon - halt. Application.Terminate - выполняется только после выполнения строчки Application.Run;... а судя по твоему коду эта строчка может и не выполниться... отсюда и ошибка... |
| Автор: Akella 15.12.2005, 09:52 | ||||
а разве нельзяч так?
|
| Автор: Snowy 15.12.2005, 10:35 | ||
| Я ж привел нормальный код. Завершать в данном случае Form2 нужно так: При завершении: Если завершить программу, то устанавливаем Form2.ModalResult в mrCancel, Если продолжаем дальше, то Form2.ModalResult:=mrOk; И просто закрываем Form2 без всяких терминаторов. Добавлено @ 10:36
Зависиьт от того, откуда мы вызвали Form2. |
| Автор: Akella 15.12.2005, 10:40 |
| ...не мы, а он, а он её вызывает из Form1 |
| Автор: Albinos_x 15.12.2005, 11:33 | ||||
тогда можно обойтись и
вторая закроется автоматически, т.к. завершится работа приложения |
| Автор: Guest 15.12.2005, 11:42 | ||||
2Zero
Вот если никаких действий с Form2 не происходит приводящих к созданию Form1 (именно к созданию) тут ты не прав А не создаю подразумевает что Application.CreateForm(TForm1,Form1) выполняется где то в событии Form2 И то что ты написал
Не соответствует нулевому посту темы |
| Автор: Snowy 15.12.2005, 12:05 |
| Нельзя закрывать форму из OnShow или OnCreate. |
| Автор: EDuard 15.12.2005, 18:15 |
| Все разобрался. Код я писал изначально для form1 create там он работал и form2 там вызывалась через show modal. Когда переписывал код под Project1.dpr копировал куски кода из старого, там в одном месте не убрал form2.showmodal, из-за этого и вылезали ошибки при Application.Terminate. После того как убрал эту строку все работает, хотя более углубленно пока не тестил. Poseidon, хотелось бы подробнее узнать о Halt. |
| Автор: Poseidon 15.12.2005, 21:07 | ||||
|