Могу ли я закрыть основную форму из дочерней формы?

#c builder

#c builder

Вопрос:

Этот код в порядке? Может ли точка выполнения корректно вернуться после вызова MainForm-> Close()? Будет ли дочерняя форма закрыта должным образом?

 void TChildForm::TestSomething()  
{
   if (SomethingFails)
      {
      MainForm->Close();  // I know Release() should be more appropriate than Close();
      return;
      }
   else EverythingIsFine_DoTheSettings;
}
  

Комментарии:

1. Да, сайт вызова будет возвращен. Mainform.close вызывает application.terminate. Terminate отправляет сообщение о выходе, поэтому дочерняя форма будет должным образом закрыта / освобождена. Черт возьми, нет никакой разницы между вызовами «close» и «release» для не основной формы, которая должна быть освобождена, в этом случае «close» вызывает «release». Все это для Delphi, не знаю builder.

2. Все в порядке, эта часть на самом деле не была связана с вашим кодом, поскольку вы закрываете основную форму. Лучше ответить тому, кто знает builder.

3. До тех пор, пока очередь не будет очищена. Все отправленные / опубликованные сообщения будут обработаны. Хотя это официально не задокументировано, WM_QUIT имеет более низкий приоритет, чем опубликованные сообщения ( ссылка ). Приложение. ProcessMessages очистит очередь.

4. @Rigel » Из любопытства: как долго я могу продолжать злоупотреблять (читать это как «использовать») основной формой ПОСЛЕ того, как я вызвал Close для нее? » — пока Application->Terminated не станет true, как только WM_QUIT сообщение действительно будет обработано. Application->Run() завершит работу, когда увидит Terminated=true . Но даже в этом случае MainForm фактически не освобождается, пока TApplication объект не будет уничтожен, что происходит только после того, как WinMain() завершится работа приложения. В принципе, все в порядке, пока WinMain() она все еще запущена, но после этого вам не следует ничего делать, за исключением, возможно, очистки в глобальных объектах.

5. @SertacAkyuz » Все это для Delphi, не знаю builder » — в C Builder все ведет себя так же.