Muchos de vosotros estáis usando el evento OnInitialize de los formularios para realizar tareas de inicialización de algunos controles, carga de valores iniciales, etc.. Pero algunos lo están usando simplemente porque alguien les ha dicho que hagan esas tareas en ese evento, sin llegar a conocer realmente el porqué.
En este artículo intentaré aclarar los pasos que se ejecutan durante el proceso de creación de un formulario, incluido el momento en que se disparan algunos eventos. De esta forma, todos podrán tener más claro donde y cuando usar un evento u otro.
Empecemos por el principio… New(), Create(), Destroy() y End(). Estos son los cuatro métodos implicados en la creación y destrucción de controles en Xailer:
- New() es el método que se encarga de instanciar e inicializar el objeto que va a alojar al control. Realmente, con sólo ejecutar la función de clase se instancia el objeto, pero la llamada al método New(), además de ser ya una tradición en xbase, nos sirve para indicar el “padre” del control y completar la inicialización del objeto.
- Create() es el método que realmente crea el control. Entre New() y Create() se asignan todas las propiedades que necesitemos para el control, de forma que en el momento de su creación todas las propiedades tienen ya un valor, sea el que hemos asignado o el que tuviera por defecto.
- Destroy() se encarga de destruir el control, pero no libera los recursos que haya utilizado ni destruye el objeto que lo contiene.
- End() es quien libera todos los recursos utilizados por el control (memoria, imágenes, etc.). Por otro lado, actualmente en xbase no se puede destruir el objeto directamente desde él mismo, pero debemos asumir en todo momento que una vez que se ha ejecutado End(), este objeto ya no se puede volver a utilizar.
Bien, esto es para los controles, pero en el caso de los componentes no visuales, muchas veces New() y Create() se pueden utilizar indistintamente, ya que la mayoría de estos componentes no se corresponden con ningún objeto o control específico de windows.
Y en el caso de los formularios también hay una diferencia importante: no hay que llamar nunca a Create(), sino solamente a New(), ya que el método CreateForm(), que veremos después, se encarga de llamarlo.
Bien, una vez que tenemos claro cuales son los métodos implicados en la creación de los formularios y controles veamos paso a paso qué ocurre al ejecutar una línea tan habitual como:
TForm1():New( Application ):Show()
Ya hemos visto que New() se encarga de instanciar e inicializar el objeto. Además, en el caso de los formularios, se llama internamente al método CreateForm(), que reside en el fichero .xfm. Este fichero .xfm es simplemente un fichero fuente con el mismo nombre que el .prg al que corresponde pero con esta extensión, que significa Xailer ForM. La principal razón de que esté separado del .prg es que así el IDE puede tratarlo con mayor facilidad, y a fin de cuentas, al ser código generado por el IDE, no necesitamos tenerlo por ahí en medio estorbando; nos basta con saber lo que es y lo que contiene, y si en algún momento lo abrimos para verlo es por pura curiosidad. Veamos ahora un ejemplo de .xfm:
METHOD CreateForm() CLASS TForm1
Super:CreateForm()
::SetBounds( 220, 120, 450, 300 )
::cText := "Form1"
::oFont := TFont():Create( "MS Sans Serif", 8, 0, 400 )
::nClientWidth := 442
::nClientHeight := 266
::Create()
::oFileOpenDlg1 := TFileOpenDlg():Create( Self )
WITH OBJECT ::oMemo1 := TMemo():New( Self )
:SetBounds( 0, 0, 442, 266 )
:nAlign := alCLIENT
:Value := ""
:Create()
END
RETURN Self
Como ya hemos comentado, solamente contiene el método CreateForm(). También podemos ver cómo se llama a Super:CreateForm() y ::SetBounds(), a continuación se asignan algunas propiedades del formulario para seguir con una llamada a ::Create(). Hasta aquí coincide con lo que ya hemos visto y no hace falta explicar mucho más.
Pero aquí es donde viene el primer evento: OnCreate. Justo en la llamada a Create() se dispara el evento OnCreate del formulario, pero como estamos viendo, aunque el formulario sí se ha creado, todavía no se han creado ninguno de los componentes o controles que va a contener. Por lo tanto, si necesitamos hacer algo en este punto, podemos usar este evento; pero hay que tener muy claro que cualquier intento de acceder a sus componentes, que todavía no existen, producirá un error.
Lo siguiente que podemos ver es la creación de un componente TFileOpenDlg. Tal y como hemos comentado antes, en este caso no hace falta llamar a New() y a Create(), por lo que se está instanciando y creando directamente al llamar a Create().
Hay que aclarar que siempre se van a crear los componentes no visuales antes que los controles. La razón es bien sencilla: algunos de esos componentes son utilizados por los controles, pero no al revés; imaginemos un TDbfDataSource o un TDbfDataSet.
Lo último que encontramos es la creación de un control TMemo(). Aquí si es necesario instanciar el objeto con New(), asignar sus propiedades, y terminar llamando a Create() para crear el control. También al llamar al método Create() del control se dispara su propio evento OnCreate, que podemos utilizar cuando lo necesitemos.
Una vez que se ha terminado de ejecutar el método CreateForm() y ya se han creado tanto el formulario como todos los componentes y controles que contiene, es cuando se dispara el evento OnInitialize del formulario. Por lo tanto, cuando tengamos que hacer algún tipo de inicialización o cualquier otra cosa que necesite que los controles estén ya creados, utilizaremos este evento. Pero hay que destacar también que en este punto el formulario todavía no es visible.
Posteriormente, los eventos que se disparan son OnShow, cuando se hace visible el formulario al llamar a Show() o ShowModal(), y OnActivate, cuando el formulario recibe el foco de teclado. Estos dos eventos no se disparan solamente al crear el formulario, sino que se dispararán siempre que sea necesario.
Bien, con esto ya tenemos todos los pasos que se han dado hasta que el formulario es visible y tiene el foco. Teniendo claro lo que hemos visto aquí ya habremos conseguido aprender una parte importante del funcionamiento de Xailer.
HE ESTADO PROBANDO ESTA HERRAMIENTA DE PROGRAMACION Y REALMENTE ES RAPIDO PARA PROCESAR DATOS.
ANTES DE CONTINUAR DOY MIS RESPESTOS A LOS COLABORADORES DE ESTA HERRAMIENTA YA QUE NO CUALQUIERA TIENE EL TALENTO DE SER BUENOS PROGRAMADORES
Y CONFIRMO UNA VEZ NO NIEGO QUE SEA UNA EXCELENTE HERRAMIENTA.
MI PROBLEMA ES QUE HASTA AHORA ESTOY ACOSTUMBRADO A TRABAJAR CON VISUAL FOXPRO 9.0.
HE DESARROLLADO ALGUNOS SISTEMAS Y LOS CUALES ESTAN FUNCIONANDO PERFECTAMENTE.
ESTE LENGUAJE DE PROGAMACION ES UNA MARAVILLA EN CUESTION DE DESARROLLO, YA QUE ES MUY INTERACTIVO EN CREAR FORMULARIOS, GRIDS, ETC.
PUEDO INTEGRAR VARIAS TABLAS SIN PROBLEMA, CON UNA FORMA QUE SE LLAMA ENTORNO DE DATOS, AHI SOLO AGREGO LAS TABLAS Y LISTO, ENTONCES AL HACER EL GRID ES FACILICIMO.
PERO MI INTENCION ES MIGRAR DE LENGUAJE DE PROGRAMACION POR QUE ESTE LENGUAJE ES LENTO Y SU MOTOR DE BASE DE DATOS NO ES MUY INSEGURA.
PARA LOS CREADORES DE XAILER…
TALVEZ SEA MUCHO PEDIR QUE LE DIERAN UNA PROBADA A ESTE LENGUAJE DE PROGRAMACION Y SI ES POSIBLE HACER QUE XAILER FUERA IGUAL DE INTERACTIVO O MEJOR.
NO QUIERO QUE MAL INTERPRETEN MI OPINION TAMPOCO QUIERO QUE CREAN QUE ESTOY DANDOLE PUBLICIDAD A FOXPRO.
LES PIDO UNA DISCULPA SI OFENDO CON ESTA OPINION.
NOTA.
Y AUN ESTOY PENSANDO ADQUIRIR ESTA HERRAMIENTA XAILER PERO QUIERO ESTAR SEGURO DE INVERTIR MI DINERO.
GRACIAS POR SU COMPRENSION.