Delphi "problema": TForm. Create () - ¿Nulo, auto o aplicación?

click fraud protection

Cuando creas Delphi objetos dinámicamente que heredan de TControl, como un TForm (que representa un formulario / ventana en aplicaciones Delphi), el constructor "Crear" espera un parámetro "Propietario":

constructor Create (AOwner: TComponent);

El parámetro AOwner es el propietario del objeto TForm. El propietario del formulario es responsable de liberar el formulario, es decir, la memoria asignada por el formulario, cuando sea necesario. El formulario aparece en la matriz Componentes de su propietario y se destruye automáticamente cuando se destruye su propietario.

Tiene tres opciones para el parámetro AOwner: Nulo, yo, y solicitud.

Para comprender la respuesta, primero debe conocer el significado de "nulo", "propio" y "Aplicación".

  • Nulo especifica que ningún objeto posee el formulario y, por lo tanto, el desarrollador es responsable de liberar el formulario creado (llamando a myForm. Gratis cuando ya no necesita el formulario)
  • Yo especifica el objeto en el que se llama el método. Si, por ejemplo, está creando una nueva instancia de un formulario TMyForm desde el controlador OnClick de un botón (donde este botón se coloca en un MainForm),
    instagram viewer
    yo se refiere a "MainForm". Por lo tanto, cuando se libera MainForm, también liberará MyForm.
  • Solicitud especifica una variable de tipo de aplicación global TA creada cuando ejecuta su aplicación. "Aplicación" encapsula su aplicación y proporciona muchas funciones que se producen en el fondo del programa.

Ejemplos:

  1. Formas modales. Cuando cree un formulario para que se muestre modalmente y se libere cuando el usuario cierre el formulario, use "nil" como propietario:
    var myForm: TMyForm; Comience myForm: = TMyForm. Crear(nulo); prueba myForm. ShowModal; finalmente myForm. Gratis; final; final;
  2. Formas sin modo. Utilice "Aplicación" como propietario:
    var
    myForm: TMyForm;
    ...
    myForm: = TMyForm. Crear (aplicación);

Ahora, cuando finaliza (sale) de la aplicación, el objeto "Aplicación" liberará la instancia "myForm".

Por qué y cuándo es TMyForm. Crear (Aplicación) NO recomendado? Si el formulario es modal y se destruirá, debe pasar "nulo" para el propietario.

Puede pasar "solicitud", pero el retraso de tiempo causado por el método de notificación que se envía a cada componente y formulario de propiedad o propiedad indirecta de la Aplicación podría resultar perjudicial. Si su aplicación consta de muchos formularios con muchos componentes (en miles), y el formulario que está creando tiene muchos controles (en cientos), el retraso de la notificación puede ser significativo.

Si pasa "nulo" como propietario en lugar de "solicitud", el formulario aparecerá antes y no afectará el código.

Sin embargo, si el formulario que necesita crear no es modal y no se crea desde el formulario principal de la aplicación, cuando especifique "self" como propietario, al cerrar el propietario se liberará el formulario creado. Use "self" cuando no quiera que el formulario sobreviva a su creador.

Advertencia: Para crear una instancia dinámica de un componente Delphi y liberarlo explícitamente en algún momento posterior, siempre pase "nulo" como propietario. De lo contrario, puede introducir riesgos innecesarios, así como problemas de rendimiento y mantenimiento del código.

En Aplicaciones SDI, cuando un usuario cierra el formulario (haciendo clic en el botón [x]), el formulario todavía existe en la memoria, solo se oculta. En las aplicaciones MDI, cerrar un formulario secundario MDI solo lo minimiza.
los OnClose evento proporciona un Acción parámetro (del tipo TCloseAction) que puede usar para especificar qué sucede cuando un usuario intenta cerrar el formulario. Establecer este parámetro en "caFree" liberará el formulario.

Navegador de consejos de Delphi:
»Obtenga el HTML completo del componente TWebBrowser
«Cómo convertir píxeles a milímetros

instagram story viewer