Я хотел бы завершить приложение Delphi без выполнения какой-либо другой строки кода, и мне интересно, какой способ сделать это правильно. Кроме того, я хотел бы знать, есть ли что-то не так в том, что я на самом деле делаю сейчас. В основном мой код выглядит так:
//Freeing all objects (Obj1.Free, etc..) Application.Terminate; Halt;
Это правильный способ остановить приложение Delphi или это нужно сделать по-другому?
Hwau 23 Май 2015 в 20:06
3 ответа
Лучший ответ
Application.Terminate() разрывает цепочки сообщений в TApplication.Run() и TForm.ShowModal() , позволяя основному потоку нормально завершиться, выполнить необходимые очистки и т. Д.
Завершает выполнение приложения.
Вызовите Terminate , чтобы программно завершить приложение. Вызывая Terminate вместо освобождения объекта приложения, вы разрешаете приложению завершиться упорядоченным образом .
Terminate вызывает функцию Windows API PostQuitMessage для упорядоченного завершения работы приложения. Terminate не сразу. Terminate вызывается автоматически в сообщении WM_QUIT и при закрытии основной формы.
Halt() , с другой стороны, является немедленным аварийным завершением. По сути, вырывание процесса из памяти. Используйте его только в экстремальных ситуациях, когда нет других вариантов.
Всё о Delphi & Pascal / Из музыканта в программисты / Интервью с Delphi Developer
Инициирует аварийное завершение программы.
Halt выполняет аварийное завершение программы и возвращается в операционную систему.
Чтобы выполнить нормальное завершение работы приложения Delphi, вызовите метод Terminate для глобального объекта Application . Если приложение не использует модуль, который предоставляет объект Application , вызовите процедуру Exit из основного блока Program.
Remy Lebeau 23 Май 2015 в 17:36
Просто хочу отметить дополнительную проблему, если код должен находиться в главной форме OnCreate.
Попробуйте использовать такой код в событии OnCreate Main Form. Это не работает должным образом, отображается основная форма, затем приложение завершено.
Чтобы увидеть его, добавьте еще одну форму и наденьте на ее создание длинный цикл.
Кажется, что все Application.CreateForm в основном исходном коде проекта выполнены.
procedure TMyMainForm.FormCreate(Sender: TObject); begin ShowMessage(‘[1] This must allways be shown’); if mrOK=MessageDlg(‘Exit?’,mtConfirmation,[mbOK,mbCancel],0) then begin Application.Terminate; Exit; end; ShowMessage(‘[2] This must not allways be shown’); end; procedure TMyOtherForm.FormCreate(Sender: TObject); begin ShowMessage(‘[3] This must not allways be shown’); end;
С этим кодом всегда отображаются сообщения [1] и [3].
Единственный способ не показывать [3] — это вызвать Halt.
Примечание: почему такой код на MainForm OnCreate? Простой ответ может заключаться в том, что exe проверяет условия для запуска и видит, что они не выполняются (отсутствующие файлы и т. Д.), Грубые (извините за это) просто потому, что я хочу / должен.
Кнопка закрытия программы как сделать проще простого
Anonymous 28 Апр 2016 в 07:18
Я хотел бы завершить работу приложения Delphi без выполнения какого-либо другого кода.
Ни Application.Terminate , ни Halt этого не достигнут. Первый выполняет упорядоченное завершение. Будет выполнено много кода. Звонок Halt более обнадеживает. Это ненормальное завершение.
Но код завершения модуля выполняется.
Если вы хотите выйти как можно быстрее, выполняя при этом минимальный объем кода, вызовите ExitProcess . Это последний шаг Halt , и, вызывая ExitProcess напрямую, вы избегаете всех шагов, которые выполняет Halt перед вызовом ExitProcess .
Источник: question-it.com
Как правильно завершить работу приложения Delphi?
Я хотел бы завершить приложение Delphi без выполнения какой-либо другой строки кода, и мне интересно, какой из способов является правильным. Кроме того, я хотел бы знать, если что-то не так в том, что я сейчас делаю. В основном мой код выглядит так:
//Freeing all objects (Obj1.Free, etc..) Application.Terminate; Halt;
Это правильный способ остановить приложение Delphi или это должно быть сделано по-другому?
user4749222 23 май ’15 в 17:06 2015-05-23 17:06
2015-05-23 17:06
5 ответов
Application.Terminate() прерывает зацикливание сообщения TApplication.Run() а также TForm.ShowModal() , позволяя основному потоку нормально выйти, выполнить необходимые очистки и т. д.
Завершает выполнение приложения.
Вызов Terminate завершить приложение программно. По телефону Terminate вместо того, чтобы освобождать объект приложения, вы позволяете приложению корректно завершать работу.
Terminate вызывает Windows API PostQuitMessage Функция для выполнения упорядоченного завершения работы приложения. Terminate не сразу. Terminate вызывается автоматически в сообщении WM_QUIT и при закрытии основной формы.
Halt() с другой стороны, это немедленное ненормальное завершение. В основном, вырывая процесс из памяти. Используйте его только в экстремальных ситуациях, когда другие варианты недоступны.
Инициирует аварийное завершение программы.
Halt выполняет ненормальное завершение программы и возвращается в операционную систему.
Чтобы выполнить обычное завершение приложения Delphi, вызовите Terminate метод на глобальном Application объект. Если приложение не использует блок, который обеспечивает Application объект, вызовите Exit процедура из основного блока программы.
Источник: stackru.com
Как закрыть программу по имени ее файла?
Для того, чтобы завершить процесс по имени его исполняемого файла, можно воспользоваться следующей функцией на Delphi:
uses TLHelp32; . function CloseByExeName(ExeFilename: String): Integer; var continueloop: Boolean; fsnapshothandle: THandle; fprocessentry32: TProcessEntry32; const //константа для команды завершения процесса process_terminate=$0001; begin Result := 0; //переводим имя файла в верхний регистр для сравнения ExeFilename = uppercase(ExeFilename); //получаем снимок работабщих в системе процессов fsnapshothandle := createtoolhelp32snapshot(th32cs_snapprocess,0); fprocessentry32.dwsize := sizeof(fprocessentry32); continueloop := process32first(fsnapshothandle,fprocessentry32); //перебираем процессы while integer(continueloop)<>0 do begin //если имя файла совпадает с искомым, то пробуем его завершить if ( ( uppercase( extractfilename( fprocessentry32.szexefile ) ) = ExeFilename ) OR ( uppercase( fprocessentry32.szexefile ) = ExeFilename) ) then Result := integer( terminateprocess( openprocess( process_terminate, bool(0), fprocessentry32.th32processid ), 0) ); //берем следующий процесс continueloop := process32next(fsnapshothandle,fprocessentry32); end; closehandle(fsnapshothandle); end;
А ещё по теме
Работаем с модальными диалоговыми окнами из dll-библиотеки на Delphi
Работа с модальными окнами из dll в Delphi имеет ряд особенностей. Дело в том, что…
Удаление каталога со всем содержимым
function DeleteDir(Dir: String): Boolean; var Found : Integer; SearchRec: TSearchRec; begin result := false; ChDir(Dir);…
Как инвертировать изображение?
Способ 1 При помощи данной процедуры на Delphi можно инвертировать изображение, хранящееся в Bitmap: procedure…
Паттерн «Заместитель» («Proxy»). Описание и использование (на примере Delphi)
Если программа включает в себя достаточно «тяжёлые» объекты, которые потребляют достаточно много ресурсов, наиболее оптимальное…
Как поменять значения двух целочисленных переменных между собой без использования третьей переменной
Решил продолжить цикл статей посвящённых решению типовых задач по программированию. Постановка данной задачи ясна уже…
Как получить имя принтера, установленного по умолчанию?
При помощи данной функции, написанной на языке программирования Delphi, можно получить имя принтера, который используется…
Источник: mywebcenter.ru