Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Закрытие программы в OnCreate [D2, D3, D4, D5, D6, D7, Win95/98, WinME, NT4, Win2k, WinXP]


BFG9k ©   (2005-11-01 15:52:00) 

Если программа запускается с определнными параметрами, то она должна делать в OnCreate набор действий а потом отваливаться. То есть до Application.Run дело дойти не должно. Но программа игнорирует Close и Destroy, вызванные в OnCreate. К тому же если сделать Application.Free до Application.Run - это вызовет ошибку (причем фатальную).

Как быть ?

P.S.: В программе происходит отправка данных на принтер.


Игорь Шевченко   (2005-11-02 10:30:00) [1]

Аpplication.ShowMainForm := false;
Application.Terminate;

этого достаточно

unit main;

interface
uses
 Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs;

type
 TForm1 = class(TForm)
   procedure FormCreate(Sender: TObject);
 end;

var
 Form1: TForm1;

implementation

{$R *.DFM}

procedure TForm1.FormCreate(Sender: TObject);
begin
 if (ParamCount > 0) and SameText(ParamStr(1), 'STOP') then begin
   Application.ShowMainForm := false;
   Application.Terminate;
 end;
end;

end.


umbra   (2005-11-01 20:14:00) [2]

2 all

OnCreateдействительно вызывается в конструкторе формы в процедуре GlobalNamespace.EndWrite. Что это за зверь я не знаю, но убедился, что таки да, в конструкторе, а значит до Application.Run. Спасибо за помощь!


Baltika-31   (2005-11-01 20:00:00) [3]

Один из вариантов - поднять Exception в Form.OnCreate:

в файле проекта:

program Project1;

uses
 Forms,
 SysUtils,
 Unit1 in 'Unit1.pas' {Form1};

type
 TDummy=class
 class procedure AppException(Sender: TObject; E: Exception);
 end;
class procedure TDummy.AppException(Sender: TObject; E: Exception);
begin
 Application.Terminate;
end;

{$R *.res}

begin
 Application.Initialize;
 Application.OnException := TDummy.AppException;
 Application.CreateForm(TForm1, Form1);
 Application.OnException := nil;
 Application.Run;
end.


в Unit1:

procedure TForm1.FormCreate(Sender: TObject);
begin
 raise Exception.Create('Error');
end;


BFG9k   (2005-11-01 18:50:00) [4]

Да проверьте вы в дебагере ,если интересно. OnCreate вызывается в Application.CreateForm , то есть ДО Application.Run.


Leonid Troyanovsky   (2005-11-01 18:46:00) [5]


> umbra ©   (01.11.05 18:28) [12]

> > выполняется OnCreate непосредственно в/сразу после Create

> где именно? просто интересно.


Сразу после (если AfterConstruction).
На это, правда, косвенно, указывает:

Since the DL register indicates whether the constructor or destructor is the outermost in the call stack, you must restore the value of DL before exiting so that BeforeDestruction or AfterConstruction can be called properly.

Ну, а, по поводу затруднений с исходном вопросе, то там, видимо,
рассматривалось Close, т.е., зависимое от сообщения.

--
Regards, LVT.


umbra   (2005-11-01 18:28:00) [6]


> выполняется OnCreate непосредственно
> в/сразу после Create


где именно? просто интересно. да и сабж говорит о том, что вызывается OnCreateпосле Application.Run, поскольку OldCreateOrderпо умолчанию ложно


Leonid Troyanovsky   (2005-11-01 18:20:00) [7]


> umbra ©   (01.11.05 17:57) [10]

> > OnCreate вызывается из
> > TCustomForm.Create или из TCustomForm.AfterConstruction

> только если свойство OldCreateOrder истинно. По умолчанию
> оно ложно.


Важно лишь то, что выполняется OnCreate непосредственно
в/сразу после Create. И, значит, до Application.Run.

--
Regards, LVT.


umbra   (2005-11-01 17:57:00) [8]

2 reonid ©   (01.11.05 17:16) [8]
2 evvcom ©   (01.11.05 17:22) [9]

> OnCreate вызывается из
> TCustomForm.Create или из TCustomForm.AfterConstruction


только если свойство OldCreateOrderистинно. По умолчанию оно ложно.


evvcom   (2005-11-01 17:22:00) [9]

И если учесть, что MainForm создается до Application.Run, то и получаем, что обработчик выполняется до этого Run.


reonid   (2005-11-01 17:16:00) [10]

2 umbra ©   (01.11.05 16:57) [7]
Обработчик события - это просто функция обратного вызова.
она может вызываться из любого места.
В частности, OnCreate вызывается из
TCustomForm.Create или из TCustomForm.AfterConstruction.

Другое дело, что большинство обработчиков событий
вызываются из обработчиков сообщений,
а цикл выборки сообщений из очереди находится внутри Application.Run


umbra   (2005-11-01 16:57:00) [11]

2 Leonid Troyanovsky ©   (01.11.05 16:44) [6]


> не обработчик сообщения


Это событие. И хотя я точно не знаю, когда оно выполняется, но думаю, что оно не отличается от остальных событий, обработка которых начинается после Application.Run


Leonid Troyanovsky   (2005-11-01 16:44:00) [12]


> umbra ©   (01.11.05 16:41) [5]

> Если не доходит до Application.Run, то никакого OnCreate
> не случится. События начинают обрабатываться после Application.Run


OnCreate - это немного другое, в смысле, что не обработчик сообщения.

--
Regards, LVT.


umbra   (2005-11-01 16:41:00) [13]


> То есть до Application.Run дело дойти не должно.


Если не доходит до Application.Run, то никакого OnCreateне случится. События начинают обрабатываться после Application.Run


BFG9k   (2005-11-01 16:02:00) [14]

Application.Terminate подходит. Видимо, выставляется какой-то флаг и в Application уничтожается непосредственно в Run.

Run мне нравится, но уничтожение происходит до него.

Спасибо.


КиТаЯц   (2005-11-01 16:00:00) [15]


> То есть до Application.Run дело дойти не должно.


Ну так и напиши все прямо в *.dpr

if параметры
 then делать что-то
 else begin
  ...
   Application.Run
 end;


Digitman   (2005-11-01 15:59:00) [16]


> программа запускается с определнными параметрами


по горизону, с какими.


> она должна делать в OnCreate набор действий а потом отваливаться


на то есть Halt()


TUser   (2005-11-01 15:58:00) [17]

А чем не нравится Appli8cation.Run??  Завершение приложения - Application.Terminate или Halt.


Наверх

Титульная страница Поиск, карта сайта Написать письмо