Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2005.11.20;
Скачать: CL | DM;

Вниз

Закрытие программы в OnCreate   Найти похожие ветки 

 
BFG9k ©   (2005-11-01 15:52) [0]

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

Как быть ?

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


 
TUser ©   (2005-11-01 15:58) [1]

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


 
Digitman ©   (2005-11-01 15:59) [2]


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


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


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


на то есть Halt()


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


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


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

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


 
BFG9k ©   (2005-11-01 16:02) [4]

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

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

Спасибо.


 
umbra ©   (2005-11-01 16:41) [5]


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


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


 
Leonid Troyanovsky ©   (2005-11-01 16:44) [6]


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

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


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

--
Regards, LVT.


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

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


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


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


 
reonid ©   (2005-11-01 17:16) [8]

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

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


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

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


 
umbra ©   (2005-11-01 17:57) [10]

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

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


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


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


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

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

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


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

--
Regards, LVT.


 
umbra ©   (2005-11-01 18:28) [12]


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


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


 
Leonid Troyanovsky ©   (2005-11-01 18:46) [13]


> 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.


 
BFG9k ©   (2005-11-01 18:50) [14]

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


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

Один из вариантов - поднять 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;



 
umbra ©   (2005-11-01 20:14) [16]

2 all

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


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

А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.



Страницы: 1 вся ветка

Текущий архив: 2005.11.20;
Скачать: CL | DM;

Наверх




Память: 0.51 MB
Время: 0.03 c
8-1120231094
psa247
2005-07-01 19:18
2005.11.20
Алгоритм развевающегося флага OPENGL


3-1129107561
AndDem
2005-10-12 12:59
2005.11.20
Reconnect


2-1131164479
zaN0za
2005-11-05 07:21
2005.11.20
Вопрос по RasAPI


2-1131083532
Gia
2005-11-04 08:52
2005.11.20
DBEdit


14-1130846083
Sergey_Masloff
2005-11-01 14:54
2005.11.20
В очередной раз про ECO