Модераторы: Poseidon, Snowy, bems, MetalFan

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Завершение работы программы. Как? 
:(
    Опции темы
RST8
  Дата 5.11.2005, 12:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 232
Регистрация: 8.12.2004

Репутация: 1
Всего: 1



В моей прграмме есть обработчик TForm1.FormCreate который работает фактически
в до Application.Run

Код
Application.Initialize;
Application.Title := '123';
Application.CreateForm(TForm1, Form1);
{где то здесь}
Application.Run;


Вопрос: как в зависимости от результата работы этого обработчика (TForm1.FormCreate)
сделать так что бы программ не запустилась?

Отладчиком я нашел процедуру которая запускается сразу после Application.Run
и вставил туда проверку специальной переменной. Но только никак не пойму прочему
именно эта процедура вызывается первой. Фактически это процедура OnShow объекта
только вот он как раз и непоказывается сразу. Да и думаю этот способ не очень красивый.

Подскажите свои решения этого вопроса.
smile
--------------------
Посадка, с места которой можно уйти на собственных ногах, считается удачной!
PM   Вверх
Демо
Дата 5.11.2005, 14:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1278
Регистрация: 3.11.2005

Репутация: 30
Всего: 50



Halt


--------------------
    
PM MAIL ICQ Skype   Вверх
Droll
Дата 5.11.2005, 14:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 61
Регистрация: 10.11.2004

Репутация: 1
Всего: 3



Код

  Application.Terminate;

PM   Вверх
Albinos_x
Дата 5.11.2005, 15:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Evil Skynet
****


Профиль
Группа: Комодератор
Сообщений: 3288
Регистрация: 28.5.2004
Где: X-6120400 Y-1 4624650

Репутация: 26
Всего: 108



Цитата(Droll @ 5.11.2005, 14:57)
1:
  Application.Terminate;


в этом случае программа выключится, только после выполнения строчки
Application.Run;


--------------------
"Кто владеет информацией, тот владеет миром"    
Уинстон Черчилль
PM MAIL ICQ   Вверх
RST8
Дата 5.11.2005, 17:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 232
Регистрация: 8.12.2004

Репутация: 1
Всего: 1



И в каком месте написать? Если пишем так:

Код

  Application.CreateForm(TForm1, Form1);
  if УСЛОВИЕ then halt;
  Application.Run;


то получаем AV. Если напишем так:

Код

  Application.CreateForm(TForm1, Form1);
  if УСЛОВИЕ then Application.Terminate;
  Application.Run;


то ошибки не возникает но программа все равно обрабатывает события OnShow и т.д. А это как раз ненадо. Повторю, что я нашел событие обрабатываемое первым после Application.Run и закрываю программу оттуда. Только она все равно на мгновенье появляется на экране, что неприятно и к тому же неизвестно почему именно эта процедура OnShow обрабатыватся первой и всегда ли так будет? Этот элемент сразу не показывается, даже в дизайне не он виден, и покажется он только после программного включения. в общем не совсем нужный метод.


Если прям в TForm1.FormCreate написать Halt то опять получаем AV. Меняем здесь Halt на Application.Run то ошибки нет и программа продолжает свою работу.

Даже если написать

Код

procedure TForm1.FormShow(Sender: TObject);
begin
  if УСЛОВИЕ then Application.Terminate;
end;


то опять таки программа продолжает свою работу. smile smile smile

Ну должен же быть выход... smile
--------------------
Посадка, с места которой можно уйти на собственных ногах, считается удачной!
PM   Вверх
Albinos_x
Дата 5.11.2005, 17:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Evil Skynet
****


Профиль
Группа: Комодератор
Сообщений: 3288
Регистрация: 28.5.2004
Где: X-6120400 Y-1 4624650

Репутация: 26
Всего: 108



можно сделать на активную форму:
Visible:=false;
но при обработке Application.Run; всё равно на короткий момент форма моргнёт, ещё вариант минимизировать её...


--------------------
"Кто владеет информацией, тот владеет миром"    
Уинстон Черчилль
PM MAIL ICQ   Вверх
Poseidon
Дата 5.11.2005, 19:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Delphi developer
****


Профиль
Группа: Комодератор
Сообщений: 5273
Регистрация: 4.2.2005
Где: Гомель, Беларусь

Репутация: 53
Всего: 133



Цитата(RST8 @ 5.11.2005, 17:25)
Если прям в TForm1.FormCreate написать Halt то опять получаем AV
Что получаем? Сам-то пробовал? Если написать
Код
procedure TForm1.FormCreate(Sender: TObject);
begin
halt
end;
то прога не запускается (точнее запускается и закрывается. При этом никаких мельканий нет). Что еще нужно? Или я не правильно понял
Цитата(RST8 @ 5.11.2005, 12:51)
Вопрос: как в зависимости от результата работы этого обработчика (TForm1.FormCreate)
сделать так что бы программ не запустилась?




--------------------
Если хочешь, что бы что-то работало - используй написанное, 
если хочешь что-то понять - пиши сам...
PM MAIL ICQ   Вверх
Демо
Дата 5.11.2005, 20:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1278
Регистрация: 3.11.2005

Репутация: 30
Всего: 50



Вариантов много, например:
1. См. Poseidon
Код

procedure TForm1.FormCreate(Sender: TObject);    
begin    
halt    
end;


2.
Код

procedure TForm1.FormCreate(Sender: TObject);
begin
    Application.ShowMainForm := false;
    Application.Terminate;
end;


3.
Код

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;



--------------------
    
PM MAIL ICQ Skype   Вверх
Albinos_x
Дата 5.11.2005, 21:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Evil Skynet
****


Профиль
Группа: Комодератор
Сообщений: 3288
Регистрация: 28.5.2004
Где: X-6120400 Y-1 4624650

Репутация: 26
Всего: 108



Проверил...

halt...

работает нормально... приложение нормально завершает работу и без всякого моргания...


--------------------
"Кто владеет информацией, тот владеет миром"    
Уинстон Черчилль
PM MAIL ICQ   Вверх
RST8
Дата 5.11.2005, 21:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 232
Регистрация: 8.12.2004

Репутация: 1
Всего: 1



Цитата
Что получаем? Сам-то пробовал?

Конечно пробывал.

----------
2Poseidon: AV = Access Violation
-------

Да если все это написать в новом проекте то halt работает.

Но я использую Fast Report 3. Далее если на Halt поставть точку
останова и далее по F7 (доооолго) можно добраться до

Модуль frxClass
Код

destructor TfrxReport.Destroy;
begin
  inherited;
  Preview := nil;

  FDatasets.Free;
  FEngineOptions.Free;
  FPreviewOptions.Free;
  FPrintOptions.Free;
  FReportOptions.Free;

  FExpressionCache.Free;
  FScript.Free;
  FScriptText.Free;
  FVariables.Free;
  FEngine.Free;
  FPreviewPages.Free;
  FErrors.Free;
  FStyles.Free;
  FSysVariables.Free;
  FEnabledDataSets.Free;
  FTimer.Free;
  TObject(FDrawText).Free;

  if FParentForm <> nil then
    FParentForm.Free;
end;


после выполнения последне строки ( if FParentForm <> nil then FParentForm.Free;)
нажимаем F7 еще раз и получаем этот самый AV. Вот так.



--------------------
Посадка, с места которой можно уйти на собственных ногах, считается удачной!
PM   Вверх
Albinos_x
Дата 5.11.2005, 21:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Evil Skynet
****


Профиль
Группа: Комодератор
Сообщений: 3288
Регистрация: 28.5.2004
Где: X-6120400 Y-1 4624650

Репутация: 26
Всего: 108



Цитата(RST8 @ 5.11.2005, 21:20)
после выполнения последне строки ( if FParentForm <> nil then FParentForm.Free;)
нажимаем F7 еще раз и получаем этот самый AV. Вот так.

1. Проверь порядок создания объекта... возможно где-то у тебя он освобождается раньше...и связи с другими объектами...


--------------------
"Кто владеет информацией, тот владеет миром"    
Уинстон Черчилль
PM MAIL ICQ   Вверх
RST8
Дата 5.11.2005, 21:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 232
Регистрация: 8.12.2004

Репутация: 1
Всего: 1



Цитата(Albinos_x @ 5.11.2005, 21:40)
1. Проверь порядок создания объекта... возможно где-то у тебя он освобождается раньше...и связи с другими объектами...


Да я сам в обработчике procedure TForm1.FormCreate(Sender: TObject); ничего такого несоздаю. Только форму создал - показал - уничтожил. Моожет в ней дело, хммм попробую без нее.

Пока самое лучшее что я нашел это перенес обработчик в событие OnShow вместо OnCreate .
Там использую
Код

    Application.Terminate;
    exit;


Так работает нормально.


-------------------- Добавлено позже -----------------------

Разместил Halt самой первой командой в TForm1.FormCreate(Sender: TObject); Сразу вылетает ошибка.
Наверное это прикол FastReporta.

Это сообщение отредактировал(а) RST8 - 5.11.2005, 21:57
--------------------
Посадка, с места которой можно уйти на собственных ногах, считается удачной!
PM   Вверх
Albinos_x
Дата 5.11.2005, 22:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Evil Skynet
****


Профиль
Группа: Комодератор
Сообщений: 3288
Регистрация: 28.5.2004
Где: X-6120400 Y-1 4624650

Репутация: 26
Всего: 108



Цитата(RST8 @ 5.11.2005, 21:54)
Разместил Halt самой первой командой в TForm1.FormCreate(Sender: TObject); Сразу вылетает ошибка.
Наверное это прикол FastReporta.

предпологаю... может ошибаюсь...
ты компанентом пользуешся или вручную создаёшь?
если компанентом.... то скорее всего ошибка из-за того, что он не успел создаться, а уничтожение всё равно происходит.... по крайней мере... такие глюки вылетают при использовании компанентов с закладки Servers...про FastReporta ничего сказать не могу, ни разу не использовал... но возможно ситуация такая же...


--------------------
"Кто владеет информацией, тот владеет миром"    
Уинстон Черчилль
PM MAIL ICQ   Вверх
RST8
Дата 5.11.2005, 22:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 232
Регистрация: 8.12.2004

Репутация: 1
Всего: 1



Нет руками не создаю. Хотя можно попробовать, времени нет на такие эксперементы.

Но, если создать пустой проект и положить на него FastReport то при прочих равных с
другим проектом условиях такого невозникает. Будет время поподробнее покапаю.

Как считаеш перенос обработчика из FormCreate в OnShow это нормально? Вроде бы
все работает так как надо. Не получиться ли такой ситуации что он вызовется повторно?
--------------------
Посадка, с места которой можно уйти на собственных ногах, считается удачной!
PM   Вверх
Albinos_x
Дата 5.11.2005, 23:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Evil Skynet
****


Профиль
Группа: Комодератор
Сообщений: 3288
Регистрация: 28.5.2004
Где: X-6120400 Y-1 4624650

Репутация: 26
Всего: 108



Цитата(RST8 @ 5.11.2005, 22:59)
Как считаеш перенос обработчика из FormCreate в OnShow это нормально?

смотря что он делает...

Цитата(RST8 @ 5.11.2005, 22:59)
Не получиться ли такой ситуации что он вызовется повторно?

может и получится...

Цитата(RST8 @ 5.11.2005, 22:59)
Нет руками не создаю. Хотя можно попробовать, времени нет на такие эксперементы.

Посмотри настнойки компанента...поставь по умолчанию... а инициализацию далай после строки прерывания работы программы


--------------------
"Кто владеет информацией, тот владеет миром"    
Уинстон Черчилль
PM MAIL ICQ   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Общие вопросы"
SnowyMetalFan
bemsPoseidon
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0838 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.