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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Завершение приложения 
:(
    Опции темы
Denis
Дата 29.9.2009, 10:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Код

Application.Initialize;  
  Application.CreateForm(Tdm, dm);
  Application.CreateForm(TfFace, fFace);
  Application.CreateForm(TPasswordDlg,PasswordDlg);
  if PasswordDlg.ShowModal=mrNo then halt;
... 
  Application.Run;


PasswordDlg - форма для авторизации. Если была нажата кнопка Cancel, выполняется команда halt, которая вызывает ошибку. Как корректно завершить приложение, если еще не была выполнена команда   Application.Run;?
Или может вообще другой подход тут нужен?


PM MAIL   Вверх
Snowy
Дата 29.9.2009, 10:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 11363
Регистрация: 13.10.2004
Где: Питер

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



Код

  if PasswordDlg.ShowModal <> mrNo then
  begin
   ...
    Application.Run;
  end;

PM MAIL   Вверх
Denis
Дата 29.9.2009, 11:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Та же самая проблема
Ошибка типа "Access violation..."
возникает на последней строке проекта: end.

Я так понимаю, что это возникает при завершении инициализированного, но незапущенного приложения

Это сообщение отредактировал(а) Denis - 29.9.2009, 11:14
PM MAIL   Вверх
Snowy
Дата 29.9.2009, 11:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 11363
Регистрация: 13.10.2004
Где: Питер

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



Нет, скорее всего ошибка возникает при выгрузке dll или bpl.
Типичная ошибка - вызов CoInitialize в DllMain.
Подробнее тут.
Вобщем проблема не с выходом, а просто с завершением работы.
PM MAIL   Вверх
Denis
Дата 29.9.2009, 13:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Нет, наверно не в этом дело
нашел такое решение:
Код

function KillTask(ExeFileName: string): integer;
const
  PROCESS_TERMINATE=$0001;
var
  ContinueLoop: BOOL;
  FSnapshotHandle: THandle;
  FProcessEntry32: TProcessEntry32;
begin
  result := 0;
  FSnapshotHandle := CreateToolhelp32Snapshot
  (TH32CS_SNAPPROCESS, 0);
  FProcessEntry32.dwSize := Sizeof(FProcessEntry32);
  ContinueLoop := Process32First(FSnapshotHandle,
  FProcessEntry32);

  while integer(ContinueLoop) <> 0 do
  begin
    if ((UpperCase(ExtractFileName(FProcessEntry32.szExeFile)) =
    UpperCase(ExeFileName)) or (UpperCase(FProcessEntry32.szExeFile) =
    UpperCase(ExeFileName))) then
    Result := Integer(TerminateProcess(OpenProcess(
    PROCESS_TERMINATE, BOOL(0), FProcessEntry32.th32ProcessID), 0));
    ContinueLoop := Process32Next(FSnapshotHandle, FProcessEntry32);
  end;

  CloseHandle(FSnapshotHandle);
end;

Эта функция выполняется на нажатие Cancel
PM MAIL   Вверх
bems
Дата 29.9.2009, 14:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Не делай так. Со своей программой - никогда, с чужими - пока не поймешь как это работает.


--------------------
Обижено школьников: 8
PM MAIL   Вверх
Snowy
Дата 29.9.2009, 14:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 11363
Регистрация: 13.10.2004
Где: Питер

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



Убивать процесс - жестоко.
Может это и сработает... Может быть...
Но рубить топором, вместо того, чтобы найти ошибку - дурной тон.
Где-то в коде явно зарыта ошибка при закрытии, выгрузке или выходе.
Нужно её ловить, а не вырезать паяльной лампой.
PM MAIL   Вверх
Beltar
Дата 2.10.2009, 10:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Не проще ли не страдать фигней (года 3 назад, я ей тоже страдал, но у меня все работало, было:

Код

  Application.Initialize;
  Application.CreateForm(TDM, DM);
  Application.CreateForm(TfmWelcome, fmWelcome);
  //Ля-ля-ля
  if INIFile.ReadBool('Security','UseUsers',false) then fmWelcome.ShowModal;
  {Софтина так и не пошла в эксплуатацию и полезная для отладки возможность отключить пароль осталась}
  if fmWelcome.Tag=1 then Application.Terminate
                     else
  begin
  FreeAndNil(fmWelcome);
  Application.CreateForm(TfmMain, fmMain);
  //и т. д.
  Application.Run;
  end;


), а просто в MainForm.Create засунуть:

Код

PasswordDlg:=TPasswordDlg.Create(Application);
PasswordDlg.ShowModal;


В разы проще просто закрывать какие-то наборы данных при обломе авторизации, но программу все равно грузить до конца, после чего можно будет нормально нажать кнопку и перелогиниться, чем следить, что там еще не создано.
Более того, если тебе придется проверять как работает софтина под разными аккаунтами, то можно вспотеть перезапускаться.

Цитата

нашел такое решение:


Не удивлюсь, если этот код в 100 местах только в рунете есть.


--------------------
Опытный программист на C++ легко решает любые не существующие в Паскале проблемы. smile(с) я, хотя может и нет
Пищущий на C++ мужик. Даже если это мужик сидит в написанном на Delphi и жрущем паскалевскую библиотеку билдере.
PM MAIL   Вверх
pseud
Дата 2.10.2009, 16:08 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Экспёрт Тыдыщ
***


Профиль
Группа: Завсегдатай
Сообщений: 1175
Регистрация: 18.5.2007
Где: Минск, Беларусь

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



Цитата(Denis @  29.9.2009,  10:24 Найти цитируемый пост)
Как корректно завершить приложение, если еще не была выполнена команда   Application.Run;?

так:
Код

  Application.Initialize;  
  Application.CreateForm(Tdm, dm);
  Application.CreateForm(TfFace, fFace);
  Application.CreateForm(TPasswordDlg,PasswordDlg);
  if PasswordDlg.ShowModal=mrNo then 
  begin
    Application.Terminate;
    Exit;
  end;
  Application.Run;




--------------------
Испытание чужого терпения можно считать успешным, если оно лопнуло...
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Общие вопросы"
SnowyMetalFan
bemsPoseidon
Rrader

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

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

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

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


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

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


 




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


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

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