Delphi "проблема": TForm. Создать () - ноль, Self или приложение?

Когда вы создаете Delphi объекты динамически наследуемые от TControl, такие как TForm (представляющий форму / окно в приложениях Delphi), конструктор «Create» ожидает параметр «Owner»:

конструктор Create (AOwner: TComponent);

Параметр AOwner является владельцем объекта TForm. Владелец формы отвечает за освобождение формы, т. Е. Памяти, выделенной формой, когда это необходимо. Форма появляется в массиве компонентов ее владельца, и она уничтожается автоматически при уничтожении ее владельца.

У вас есть три варианта для параметра AOwner: ноль, самостоятельно, и заявление.

Чтобы понять ответ, сначала нужно узнать значение слов «ноль», «я» и «приложение».

  • ноль указывает, что ни один объект не владеет формой, и поэтому разработчик несет ответственность за освобождение созданной формы (путем вызова myForm. Бесплатно, когда вам больше не нужна форма)
  • само указывает объект, в котором вызывается метод. Если, например, вы создаете новый экземпляр формы TMyForm из обработчика OnClick кнопки (где эта кнопка находится в MainForm),
    instagram viewer
    сам ссылается на "MainForm." Таким образом, когда MainForm освобождается, он также освобождает MyForm.
  • заявка определяет глобальную переменную типа TApplication, созданную при запуске вашего приложения. «Приложение» инкапсулирует ваше приложение, а также предоставляет множество функций, которые происходят в фоновом режиме программы.

Примеры:

  1. Модальные формы. Когда вы создаете форму для отображения модально и освобождаетесь, когда пользователь закрывает форму, используйте «nil» в качестве владельца:
    var myForm: TMyForm; начать myForm: = TMyForm. Создайте(ноль); попробуйте myForm. ShowModal; наконец myForm. Свободно; конец; конец;
  2. Немодальные формы. Используйте «Приложение» в качестве владельца:
    вар
    myForm: TMyForm;
    ...
    myForm: = TMyForm. Создать (Приложение);

Теперь, когда вы завершаете работу (выход) из приложения, объект «Приложение» освобождает экземпляр «myForm».

Почему и когда это TMyForm. Создать (приложение) НЕ рекомендуется? Если форма является модальной формой и будет уничтожена, вы должны передать «ноль» для владельца.

Вы можете передать «приложение», но задержка, вызванная отправкой метода уведомления каждому компоненту и форме, принадлежащей или косвенно принадлежащей Приложению, может оказаться разрушительной. Если ваше приложение состоит из множества форм со многими компонентами (в тысячах), а создаваемая форма имеет много элементов управления (в сотнях), задержка уведомления может быть значительной.

Передача «nil» в качестве владельца вместо «application» приведет к тому, что форма появится раньше и не повлияет на код.

Однако, если форма, которую нужно создать, не является модальной и не создается из основной формы приложения, тогда, когда вы укажете «self» в качестве владельца, закрытие владельца освободит созданную форму. Используйте «я», когда вы не хотите, чтобы форма пережила своего создателя.

Предупреждение: Чтобы динамически создать компонент Delphi и явно освободить его через некоторое время, всегда передавайте «nil» в качестве владельца. Невыполнение этого требования может привести к ненужному риску, а также к проблемам с производительностью и обслуживанием кода.

В Приложения SDIкогда пользователь закрывает форму (нажав на кнопку [x]), форма все еще существует в памяти - она ​​только скрывается. В приложениях MDI закрытие дочерней формы MDI только минимизирует ее.
OnClose событие обеспечивает действие параметр (типа TCloseAction), который можно использовать для указания того, что происходит, когда пользователь пытается закрыть форму. Установка этого параметра в «caFree» освободит форму.

Delphi подсказки навигатора:
»Получить полный HTML-код из компонента TWebBrowser
«Как конвертировать пиксели в миллиметры

instagram story viewer