Задать вопрос
@DeeUs

Как правильно закрыть программу?

Здравствуйте!
Как правильно закрыть программу?
Сейчас у меня это работает так, что при нажатии крестика у формы - она сворачивается в трей, а сама кнопка закрыть реализована в PopupMenu:
procedure TForm1.FormCloseQuery(Sender: TObject; var CanClose: Boolean);  
begin
//не закрываем а сворачиваем в трей
  CanClose := false;
  TrayIcon1.Visible := true;
  Form1.Visible := false;
  ShowWindow(Application.Handle, SW_HIDE);
end;
procedure TForm1.FormDestroy(Sender: TObject);
begin
  UnRegisterHotKey (Form1.Handle, 0);
  TrayIcon1.Free;
  Image1.Free;
  Self.Free;
end;
procedure TForm1.N4Click(Sender: TObject);   //кнопка закрыть 
begin
  //halt;
  Application.Terminate;
end;
procedure TForm1.ApplicationEvents1Minimize(Sender: TObject);       //сворачивание окна
begin
  Form1.Visible := false; // Делаем форму невидимой
  TrayIcon1.Visible := True; // Делаем иконку с трее видимой
end;

Вроде все работает, но при закрытии программы в windows 10 воспроизводится звуковой сигнал "Критическая ошибка", что в свою очередь наводит на мысль: "что-то я сделал не так...".
Объясните пожалуйста как сделать правильно и где моя ошибка(если оная имеется).

P.S.:
На основной форме расположены компоненты: ApplicationEvents, PopupMenu, TrayIcon, ImageList, ColorDialog, SavePictureDialog, OpenPictureDialog, IdHTTP, IdAntiFreeze, IdSSLIOHandlerSocketOpenSSL + всякие кнопки панели и т.д.
В самой программе 5 форм: основная, настройки (IdHTTP, IdSSLIOHandlerSocketOpenSS), форма авторизации, форма с редактором richedit и дополнительная форма а ля модальное окно.
  • Вопрос задан
  • 268 просмотров
Подписаться 1 Простой Комментировать
Решения вопроса 1
HemulGM
@HemulGM Куратор тега Delphi
Delphi Developer, сис. админ
1. Не нужно уничтожать/освобождать компоненты, которые созданы через дизайнер или с указанием Owner. Такие компоненты сами освободятся.
2. FormDestroy - вызывается при уничтожении формы, а ты снова пытаешься вызвать уничтожение формы. Это даже логически можно понять.
3. Application.Terminate; - нормальное закрытие программы. Этот метод ставит флаг на завершение программы. И программа закроется сразу, как только очередь сообщений закончится.
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
OCTAGRAM
@OCTAGRAM
Во-первых, безопаснее и переносимее вместо прямого вызова Free делать FreeAndNil. Во-вторых, убирайте немедленно

Self.Free;
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы