Хорошая вопроска!
Чтобы скрыть окно MDI-ребенка, вы можете использовать метод Hide вместо установки свойства Visible в False. Это потому что когда окно ребёнок скрыто, оно не будет получать никакие сообщения о рисовании или другие события UI.
Когда вы устанавливаете Visible в False, окно все еще присутствует в памяти и может продолжать получать уведомления от системы. Поскольку скрывать окно вместо этого, вы обеспечиваете, что оно будетproperly удалено из UI и его ресурсы будут освобождены.
В вашем коде вы можете изменить обработчик события VisibleChanging следующим образом:
procedure TCustomForm.VisibleChanging;
begin
if (FormStyle = fsMDIChild) and Visible then
Hide; // вместо вызова исключения
end;
Таким образом, когда пользователь пытается отобразить окно ребёнка, которое не должно быть видимо (по вашей бизнес-логике), оно просто спрячется без вызова ошибки.
В отношении альтернативных решений вы также можете рассмотреть использование флага или булевой свойства для указания, должен ли быть видимым окно ребёнок или нет. Затем в обработчике события VisibleChanging вы можете проверить этот флаг и либо скрыть, либо отобразить окно соответственно.
Например:
private
FShouldBeVisible: Boolean;
...
procedure TCustomForm.VisibleChanging;
begin
if (FormStyle = fsMDIChild) then
if not FShouldBeVisible then
Hide; // скрыть окно ребёнка, если оно не должно быть видимо
end;
Используя флаг в этом виде, вы можете отделить видимость окна ребёнка от его свойства Visible и обеспечить больше гибкости в логике вашего приложения.
Процедура VisibleChanging позволяет скрыть окно MDI Child, предотвращая изменение его видимости при помощи проверки типа формы и ее видимости.
Комментарии и вопросы
Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS