![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Закрытие программы в 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.