Página 1 de 1

Intentando sin exito implementar un metodo en TForm

Publicado: Jue Dic 07, 2017 4:10 am
por Carlos Ortiz
Estoy tratando de implementar un metodo FormDestroy en la clase TForm propia, use la tForm vacia y la incluí en el proyecto, defini el metodo pero no logro que al cerrar cualquier form del proyecto se ejecte el FormDestroy que indico mas abajo (el problema es que me quedan unos Alias abiertos)

Código: Seleccionar todo

METHOD FormDestroy CLASS TForm
   local oControl
   logdebug("cerrando form")
   FOR each oControl IN Self
      IF valtype(oControl)="O"
         IF oControl:IsKindOf( "TDBBrowse" )    // Es un objeto browse
            oControl:oFont := Nil
            IF oControl:oDataSet#Nil
               IF oControl:oDataSet:IsKindOf( "TODbcDataSet" ) // Tipo ODBC
                  oControl:oDataSet:Close()     // la cierro asi se elimina el cursor
                  oControl:oDataSet:Destroy()   // la cierro asi se elimina el cursor
                  logdebug("cerro un dataset y su alias")
               ELSEIF oControl:oDataSet:IsKindOf( "TSQLQuery" ) // Tipo ADO
                  oControl:oDataSet:Close()     // la cierro
                  oControl:oDataSet:Destroy()   // la cierro asi se elimina el cursor
               ENDIF
            ENDIF
         ENDIF
      ENDIF
   NEXT
RETURN Nil
Gracias

Re: Intentando sin exito implementar un metodo en TForm

Publicado: Sab Dic 09, 2017 1:02 pm
por jfgimenez
Carlos,

el problema es: ¿quién llama a FormDestroy()?

En principio nadie, salvo que tú lo estés llamando desde algún sitio. En un formulario normal diseñado desde el IDE (p.ej. TForm1), cuando haces doble clic en el evento OnDestroy, el IDE crea automáticamente el método FormDestroy() y se lo asigna al evento. Puedes verlo en el archivo .xfm correspondiente.

Pero si lo que estás creando es una clase por código, que hereda de TForm, entonces tienes dos opciones: o asignas tú el evento a ese método, o sobrecargas el método correspondiente de la clase padre (en este caso Destroy()), teniendo siempre cuidado de llamar al ::Super