Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 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 дело дойти не должно.


Ну так и напиши все прямо в *.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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.49 MB
Время: 0.053 c
2-1129828890
ASVShade
2005-10-20 21:21
2005.11.20
Знатокам процедур (хотя можно и запрос)


2-1130920589
Ale-x
2005-11-02 11:36
2005.11.20
Автозапуск


14-1130303971
Ega23
2005-10-26 09:19
2005.11.20
С днем рождения! 26 октября


1-1130596156
FunkyByte
2005-10-29 18:29
2005.11.20
Проблема при вставке текста из буффера обмена в Memo


11-1111913330
MInd_fl
2005-03-27 12:48
2005.11.20
Record?





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский