#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 все ведет себя так же.