Модераторы: Poseidon, Snowy, bems, MetalFan

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Правильное зевершение приложения 
:(
    Опции темы
EDuard
Дата 14.12.2005, 21:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 331
Регистрация: 1.8.2005
Где: Синее нигде

Репутация: 2
Всего: 7



В программе в 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.

Как правильно завершить программу?


--------------------

PM MAIL WWW ICQ   Вверх
Snowy
Дата 14.12.2005, 21:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 11363
Регистрация: 13.10.2004
Где: Питер

Репутация: 192
Всего: 484



Дай код.
PM MAIL   Вверх
THenry
Дата 14.12.2005, 22:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 20
Регистрация: 13.9.2005

Репутация: нет
Всего: нет



Как так? Form1 главная, а ты её не создаешь, но независимо от Form1 всегда создается Form2. Ну дык сделай Form2 главной и Form2.Close;
PM MAIL   Вверх
Zero
Дата 14.12.2005, 22:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2169
Регистрация: 23.10.2004
Где: Россия, г. Рязань

Репутация: 8
Всего: 24



Цитата(EDuard @ 14.12.2005, 22:15)
Как правильно завершить программу?

Напиши в форме 2, на кнопку вот так:
Код

form1.Close

При этом возможно придётся после implementation втавить:
Код

uses unit1

Смысл в том, что при выполнении команды Close происходит переход главной формы, на строчку с командой End., главного файла проекта, поэтому должно сработать - ИМХО самый универсальный способ.
Добавлено @ 22:40
Цитата(THenry @ 14.12.2005, 23:35)
Form2.Close

И закроется только вторая форма.
PM MAIL ICQ   Вверх
THenry
Дата 14.12.2005, 22:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 20
Регистрация: 13.9.2005

Репутация: нет
Всего: нет



Цитата(Henry_12)
Ну дык сделай Form2 главной

А это я для кого написал?

Это сообщение отредактировал(а) THenry - 14.12.2005, 22:51
PM MAIL   Вверх
Zero
Дата 14.12.2005, 22:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2169
Регистрация: 23.10.2004
Где: Россия, г. Рязань

Репутация: 8
Всего: 24



Цитата(THenry @ 14.12.2005, 23:50)
А это я для кого написал?

Велосипед неприемлим в 21 веке, без необходимости...
PM MAIL ICQ   Вверх
THenry
Дата 14.12.2005, 23:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 20
Регистрация: 13.9.2005

Репутация: нет
Всего: нет



Посмотрел бы я как ты будешь закрывать не созданную Form1 кодом Form1.Close;
PM MAIL   Вверх
Snowy
Дата 14.12.2005, 23:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 11363
Регистрация: 13.10.2004
Где: Питер

Репутация: 192
Всего: 484



Код

begin
  Application.Initialize;
  Application.CreateForm(Form1);
  Application.CreateForm(Form2);
  if not Form2.ShowModal <> mrCancel then
    Application.Run;
end;

PM MAIL   Вверх
Zero
Дата 14.12.2005, 23:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2169
Регистрация: 23.10.2004
Где: Россия, г. Рязань

Репутация: 8
Всего: 24



Цитата(THenry @ 15.12.2005, 00:02)
Посмотрел бы я как ты будешь закрывать не созданную Form1 кодом Form1.Close;

Всё просто:
Код

implementation

{$R *.dfm}
uses unit1;
procedure TForm2.Button1Click(Sender: TObject);
begin
  form1.Close
end;

Ну а в файле проекта естесно:
Код

begin
  Application.Initialize;
  Application.CreateForm(TForm1, Form1);
  Application.CreateForm(TForm2, Form2);
  Application.Run;
end.

Добавлено @ 23:42
Про про не созданную ту речь не идёт.
PM MAIL ICQ   Вверх
Poseidon
Дата 15.12.2005, 00:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Delphi developer
****


Профиль
Группа: Комодератор
Сообщений: 5273
Регистрация: 4.2.2005
Где: Гомель, Беларусь

Репутация: 53
Всего: 133



а как насчет halt?


--------------------
Если хочешь, что бы что-то работало - используй написанное, 
если хочешь что-то понять - пиши сам...
PM MAIL ICQ   Вверх
FRAGNATIC
Дата 15.12.2005, 00:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


..::Свирепый Кодер::..
**


Профиль
Группа: Участник
Сообщений: 901
Регистрация: 17.10.2004
Где: ICQ

Репутация: 6
Всего: 11



Цитата
а как насчет halt?

терминэйт коректней завершает работу)
PM MAIL   Вверх
Albinos_x
Дата 15.12.2005, 06:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Evil Skynet
****


Профиль
Группа: Комодератор
Сообщений: 3288
Регистрация: 28.5.2004
Где: X-6120400 Y-1 4624650

Репутация: 26
Всего: 108



вообще как я понял, выполнение Form2.ShowModal приостанавливает выполнение кода. если в ней делаешь Application.Terminate, о по-любому нормально приложение не завершится, т.к. не выполнена строчка Application.Run; - здесь лучше использовать как предлогал Poseidon - halt. Application.Terminate - выполняется только после выполнения строчки Application.Run;... а судя по твоему коду эта строчка может и не выполниться... отсюда и ошибка...


--------------------
"Кто владеет информацией, тот владеет миром"    
Уинстон Черчилль
PM MAIL ICQ   Вверх
Akella
Дата 15.12.2005, 09:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Творец
****


Профиль
Группа: Модератор
Сообщений: 18485
Регистрация: 14.5.2003
Где: Корусант

Репутация: 36
Всего: 329



Цитата(EDuard @ 14.12.2005, 21:15)
В программе в Project1.dpr при определенных условиях создаю Form2 из Unit2.pas, при клике на кнопку расположенную на Form2 нужно закрыь проект.


а разве нельзяч так?
Код

нажимаем кнопку на Form2

  Form2.Close;
  Form1.Close;

PM MAIL   Вверх
Snowy
Дата 15.12.2005, 10:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 11363
Регистрация: 13.10.2004
Где: Питер

Репутация: 192
Всего: 484



Я ж привел нормальный код.
Завершать в данном случае Form2 нужно так:
При завершении:
Если завершить программу, то устанавливаем Form2.ModalResult в mrCancel,
Если продолжаем дальше, то Form2.ModalResult:=mrOk;
И просто закрываем Form2 без всяких терминаторов.
Добавлено @ 10:36
Цитата(dsergey @ 15.12.2005, 09:52)
нажимаем кнопку на Form2
  Form2.Close;
  Form1.Close;

Зависиьт от того, откуда мы вызвали Form2.
PM MAIL   Вверх
Akella
Дата 15.12.2005, 10:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Творец
****


Профиль
Группа: Модератор
Сообщений: 18485
Регистрация: 14.5.2003
Где: Корусант

Репутация: 36
Всего: 329



...не мы, а он, а он её вызывает из Form1
PM MAIL   Вверх
Albinos_x
Дата 15.12.2005, 11:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Evil Skynet
****


Профиль
Группа: Комодератор
Сообщений: 3288
Регистрация: 28.5.2004
Где: X-6120400 Y-1 4624650

Репутация: 26
Всего: 108



Цитата(dsergey @ 15.12.2005, 09:52)
нажимаем кнопку на Form2
  Form2.Close;
  Form1.Close;


тогда можно обойтись и
Код

  Form1.Close

вторая закроется автоматически, т.к. завершится работа приложения


--------------------
"Кто владеет информацией, тот владеет миром"    
Уинстон Черчилль
PM MAIL ICQ   Вверх
Guest
Дата 15.12.2005, 11:42 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











2Zero
Цитата(EDuard)
При этом главной формой проекта является Form1, которую не создаю если создаю Form2, или создаю после некоторых действий с Form2.

Вот если никаких действий с Form2 не происходит приводящих к созданию Form1 (именно к созданию) тут ты не прав
А не создаю подразумевает что Application.CreateForm(TForm1,Form1) выполняется где то в событии Form2
И то что ты написал
Код

begin    
  Application.Initialize;    
  Application.CreateForm(TForm1, Form1);    
  Application.CreateForm(TForm2, Form2);    
  Application.Run;    
end.

Не соответствует нулевому посту темы
  Вверх
Snowy
Дата 15.12.2005, 12:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 11363
Регистрация: 13.10.2004
Где: Питер

Репутация: 192
Всего: 484



Нельзя закрывать форму из OnShow или OnCreate.
PM MAIL   Вверх
EDuard
Дата 15.12.2005, 18:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 331
Регистрация: 1.8.2005
Где: Синее нигде

Репутация: 2
Всего: 7



Все разобрался.
Код я писал изначально для form1 create там он работал и form2 там вызывалась через show modal. Когда переписывал код под Project1.dpr копировал куски кода из старого, там в одном месте не убрал form2.showmodal, из-за этого и вылезали ошибки при Application.Terminate.
После того как убрал эту строку все работает, хотя более углубленно пока не тестил.
Poseidon, хотелось бы подробнее узнать о Halt.



--------------------

PM MAIL WWW ICQ   Вверх
Poseidon
Дата 15.12.2005, 21:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Delphi developer
****


Профиль
Группа: Комодератор
Сообщений: 5273
Регистрация: 4.2.2005
Где: Гомель, Беларусь

Репутация: 53
Всего: 133



Цитата(Snowy @ 15.12.2005, 12:05)
Нельзя закрывать форму из OnShow или OnCreate.
По halt можно smile

Цитата(EDuard @ 15.12.2005, 18:15)
Poseidon, хотелось бы подробнее узнать о Halt.
А что тут узнавать? Halt инициирует аварийное завершение программы.




--------------------
Если хочешь, что бы что-то работало - используй написанное, 
если хочешь что-то понять - пиши сам...
PM MAIL ICQ   Вверх
Страницы: (2) [Все] 1 2 
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Общие вопросы"
SnowyMetalFan
bemsPoseidon
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.1420 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.