Форум: "Начинающим";
Текущий архив: 2005.11.20;
Скачать: [xml.tar.bz2];
ВнизЗакрытие программы в 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 дело дойти не должно.
Ну так и напиши все прямо в *.dprif параметры
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;
Скачать: [xml.tar.bz2];
Память: 0.49 MB
Время: 0.052 c