¿Se liberará un formulario de implementación de interfaz cuando no haya más referencias? -- delphi campo con interface campo con tform camp Relacionados El problema

Will an interface-implementing form free itself when there are no more references to it?


6
vote

problema

Español

Si implemento una interfaz en un formulario, como TMyForm = class(TForm, IMyInterface) , ¿se liberará el objeto cuando no haya más referencias de interfaz? Parece que no, aunque no pude ejercer cómo se cuenta TForm se cuenta (en absoluto). Me preocupa la forma de liberarme cuando una referencia de interfaz sale de alcance, pero esto no parece suceder.

Supongo que hay dos partes a la pregunta, en primer lugar si un formulario podría liberarse inesperadamente (la pregunta real), y en segundo lugar, cómo se cuentan las formas.

Original en ingles

If I implement an interface on a form such as TMyForm = class(TForm, IMyInterface), will the object free itself when there are no more interface references to it? It seems not to, although I couldn't work out how TForm is reference counted (if at all). I'm concerned about the form getting freed when an interface reference goes out of scope, but this does not seem to happen.

I guess there are two parts to the question, firstly whether a form might get unexpectedly freed (the real question), and secondly how forms are reference counted.

        
         
         

Lista de respuestas

15
 
vote
vote
La mejor respuesta
 

TForm Deriva de TComponent , que implementa _AddRef() y _Release() para deshabilitar el conteo de referencia en sí mismo. Como tal, cualquier interfaz implementada por cualquier clase TComponent descendiente, como TForm , no liberará su objeto de implementación TComponent6 de forma predeterminada cuando se libera la interfaz .

Sin embargo, si se asigna una propiedad IVCLComObject a la propiedad TComponent8 , luego TComponent delegará el conteo de referencia a ese objeto, de modo que ese objeto Puede ser liberado si su cuenta de referencia cae a 0 ( TComponent0 no incrementa el recuento de referencia de su referencia TComponent1111).

Esto es válido para todos los descendientes de TComponent2 , a menos que implementen cualquier conteo de referencia propio por el anulación TComponent3 y TComponent4 manualmente. < / p>

 

TForm derives from TComponent, which implements _AddRef() and _Release() to disable reference counting on itself. As such, any interface implemented by any TComponent descendant class, like TForm, will not free its implementing TComponent object by default when the interface is released.

However, if an IVCLComObject interface is assigned to the TComponent.VCLCOMObject property, then TComponent will delegate reference counting to that object, so that object can be freed if its reference count falls to 0 (TComponent does not increment the reference count of its IVCLCOMObject reference).

This is valid for all descendants of TComponent, unless they implement any reference counting of their own by overriding _AddRef() and _Release() manually.

 
 
     
     
0
 
vote

Si implementa una interfaz en un formulario, puede valer la pena agregar su propio

  TComponent5  

Descubrí que era posible liberar un formulario con una interfaz, y luego hubiera llamado a la variable local, ya que la variable local salió del alcance. Esto podría producir una violación de acceso, ya que las verificaciones de implementación de TComponent para ver si FVCLOMOBJECT se establece

  TComponent6  

Dado que en esta etapa, FVCLOMOBJECT está indefinido, puede ocurrir una molestita excepción A / V. Al cablear a THE -1, se puede llamar de forma segura sin excepciones de activación.

 

IF you implement an interface in a form, it can be worth adding your own

_Release as follows:      function _Release: Integer; stdcall;  function TMyInterfacedForm._Release: Integer; begin   result:=-1;  end; 

I found that it was possible to free a form with an interface, and then have the _Release called as the local variable went out of scope. This could produce an access violation, as the Tcomponent implementation checks to see if FVCLComObject is set

  if FVCLComObject = nil then     Result := -1   // -1 indicates no reference counting is taking place   else     Result := IVCLComObject(FVCLComObject)._Release; 

Since at this stage, FVCLComobject is undefined, an annoying A/V exception can occur. By hardwiring the -1, it can be called safely without trigger exceptions.

 
 

Relacionados problema

0  Delphi: Marco y Estado de ActionList - ¿Error?  ( Delphi frame and state of actionlist error ) 
Tengo una lista de acción en un formulario y un marco (una unidad de un formulario se está impulsando en el marco). It Form2.General.State: = Aspirada en ...

4  ¿Hay algún evento disparado en un formulario cuando se cierre la aplicación?  ( Is there an event fired in a form when application closes ) 
Mi aplicación engendra varias formas independientes. Una vez que se creó la aplicación se olvida de ellos. Toda la acción se maneja en esa forma en sí. Cuando...

1  ¿Por qué TJVFormStorage no almacena correctamente la posición del formulario?  ( Why tjvformstorage not store the form position correctly ) 
Tengo un formulario llamado fmTest . Yo uso jvcl tjvformstorage para almacenar la colocación del formulario, el tamaño del formulario y la posición de fo...

1  ¿Por qué TForm.Handle es un getter en lugar de un campo?  ( Why tform handle is a getter instead of a field ) 
Estaba depurando recientemente un error complicado. Fue causado al acceder a un Form.Handle (indicador de gancha). El error se reveló de manera bastante in...

1  ¿Cómo puedo mostrar un formulario de Delphi en un panel?  ( How can i display a delphi form in a panel ) 
He intentado seguir el ejemplo de http: // Docwiki. Embarcadero.com/codeeExamples/Xe7/en/FMXembedDedForm_(Delphi) PERO PERMITÉ MI PRIMER PROBLEMA CON LOS NI...

2  Libera un objeto en OnClose Evento de TForm en Delphi  ( Free an object in onclose event of tform in delphi ) 
Soy nuevo en Delphi y mi pregunta puede ser muy básica. Creé un formulario en un procedimiento de Delphi. Hasta ahora estaba usando ShowModal y luego libera...

6  Delphi Deshabilitar la forma mientras se carga  ( Delphi disable form while loading ) 
En mi solicitud, tengo una forma principal, con la capacidad de cargar algunas imágenes en la base de datos. Mientras se carga las imágenes, quiero mostrar un...

0  ¿Cómo puedo usar la variable global de un formulario para ponerla en un panel?  ( How can i use a forms global variable to put it in a panel ) 
Esta es una continuación de mi pregunta: Cómo ¿Puedo mostrar un formulario Delphi en un panel? Quiero usar una variable global de formularios para incrust...

-1  ¿Evento ONSHOWN para TFF?  ( Onshown event for tform ) 
En el inicio del programa, en el controlador de eventos OnActivate7, necesito hacer algo que bloquea el programa durante unos segundos. Durante este tiempo, ...

2  ¿Por qué la etiqueta de aguja se cierra automáticamente?  ( Why tapplication messagebox closes automatically ) 
Tengo una aplicación que tarda unos segundos en cargar (muchas iniciales). El GUI se congela durante el inicio. Así que quiero crear una pantalla de salpicadu...




© 2022 respuesta.top Reservados todos los derechos. Centro de preguntas y respuestas reservados todos los derechos