Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > 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
Цитата(EDuard @ 14.12.2005, 22:15)
Как правильно завершить программу?

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

form1.Close

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

uses unit1

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

И закроется только вторая форма.

Автор: THenry 14.12.2005, 22:50
Цитата(Henry_12)
Ну дык сделай Form2 главной

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

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

Велосипед неприемлим в 21 веке, без необходимости...

Автор: THenry 14.12.2005, 23:02
Посмотрел бы я как ты будешь закрывать не созданную Form1 кодом Form1.Close;

Автор: Snowy 14.12.2005, 23:23
Код

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

Автор: Zero 14.12.2005, 23:41
Цитата(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
Про про не созданную ту речь не идёт.

Автор: Poseidon 15.12.2005, 00:05
а как насчет halt?

Автор: FRAGNATIC 15.12.2005, 00:44
Цитата
а как насчет halt?

терминэйт коректней завершает работу)

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


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

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

  Form2.Close;
  Form1.Close;

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

Зависиьт от того, откуда мы вызвали Form2.

Автор: Akella 15.12.2005, 10:40
...не мы, а он, а он её вызывает из Form1

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


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

  Form1.Close

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

Автор: Guest 15.12.2005, 11:42
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
Нельзя закрывать форму из 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
Цитата(Snowy @ 15.12.2005, 12:05)
Нельзя закрывать форму из OnShow или OnCreate.
По halt можно smile

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


Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)