Tema: Formas
Ver Mensaje Individual
  #12  
Antiguo 09-11-2003
Avatar de roman
roman roman is offline
Moderador
 
Registrado: may 2003
Ubicación: Ciudad de México
Posts: 20.269
Reputación: 10
roman Es un diamante en brutoroman Es un diamante en brutoroman Es un diamante en bruto
Ahora que tienes una noción de las referencias de clases, desmenucemos lo que te escribí en mi primer mensaje de este hilo. Voy a suponer que TMiForma es una de las clase de formularios que te interesa "guardar" en la base de datos".

El primer punto a notar, como lo dije en su momento, es que lo más conveniente es guardar no el nombre del formulario, sino de la clase del formulario ya que este último es el que te sirve para crear dinámicamnete formularios de dicha clase. En otras palabras, en lugar de guardar la cadena "MiForma" en la base de datos, lo que guardas es "TMiForma".

Normalmente, para crear un formulario de tipo TMiForma basta que pongas:

Código:
var
  Forma: TMiForma;

begin
  Forma := TMiForma.Create(...);
end;
Pero esto sólo lo puedes hacer cuando estás escribiendo el código y no durante la ejecución del programa, simple y sencillamente porque Delphi es un lenguaje compilado y no interpretado como VB. En VB podrías poner en un Edit la cadena

"TMiForma.Create(...)"

y pasársela a alguna función de tipo Eval o como quiera que se llame en VB para ejecutar la instrucción.

Para suplir esta limitación, Delphi implementa las referencias de clase y crea una tabla que asocia nombres de clases con las clases en sí:

Código:

'TButton'  | TButton
'TEdit'    | TEdit
'TListBox' | TListBox

etc.
La función GetClass recibe el nombre de una clase, busca este nombre en la columna izaquierda y, si lo encuentra, regresa lo que haya en la columna derecha, por ejemplo:

GetClass('TEdit') -> TEdit

Entonces, para que GetClass funcione, el nombre de la clase debe estar en dicha tabla, es decir, debe estar registrada. Delphi registra algunas clases automáticamnete pero otras debe uno mismo registrarlas. Ese es el caso de TMiForma y para ello se usa

RegisterClass(TMiForma)

Este registro puede hacerse en cualquier momento pero para poder crear formularios de tipo TMiForma en cualquier momento lo que conviene es que el registro se haga apenas comience el programa, esto es, en la sección initializatio del formulario.

Posteriormente, para crear tus formularios dinámicamente es que usas las referencias de clase. No puedes, como vimos, usar la instrucción

Forma := TMiForma.Create(...)

pero sí puedes sustituir TMiForma por una referencia de clase:

Código:
var
  FormaClase: TFormClass;

...

Forma := FormaClase.Create(...);
pero FormaClase debe inicializarse en algún momento anterior. ¿De dónde sacas el valor correcto? Pues de la tabla de registro mediante

GetClass(NombreClase)

donde NombreClase es una variable de tipo String cuyo valor es el que obtienes de la consulta SQL.

Ahora bien, como GetClass es una función genérica lo que regresa es una referencia de clase para la clase TPersistent que está muy arriba en la jerarquía de clases de Delphi. Esto es así porque GetClass no puede saber qué descendientes habrá.

Si tu usas:

Código:
var
  FormaClase: TFormClass;

...

FormaClase := GetClass(NombreClase);
el compilador protesta porque devuelve una referencia de TPersistent que está por arriba en la jerarquía que TForm.

Pero por el momento no te confundas con esta parte y sabe simplemente que debes hacer un "type casting"

FormaClase := TFormClass(GetClass(NombreClase));

Con esto ya tienes la referencia de clase que necesitas. Si por alguna razón la clase no quedó registrada entonces GetClass devuelve nil y por ello hay que verificar el valor de regreso:

Código:
if FormaClase <> nil then
Pero si el registro fue correcto el valor de FormaClase será TMiForma y podrás hacer

Forma := FormaClase.Create(...);

------------

Yo sé que esto es largo y no para entenderse a la primera pero creo que te puede dar una mejor idea de lo que está pasando y cómo usar correctamente el ejemplo que te dí al mero principio del hilo.

Lee esta información sin tratar de digerir todo de un jalón y concrétate al ejemplo del mero principio del hilo. Haz pruebas omitiendo en un principio el uso de las consultas SQL, simplemente registra la clase de un sólo formulario y entiende un código como:

Forma := FormaClase('TMiForma');

así, directa la cadena sin variables intermedias.

Siguiente paso, registra dos clases de formularios y trata de construir instancias de ellos tomando el nombre de su clase de un Edit.

Sólo hasta que estos ejemlos los tengas bien maduros es que intentas hacerlo ya tomando los nombres de la base de datos.

Es decir, "paso a pasito"

// Saludos

Última edición por roman fecha: 09-11-2003 a las 04:30:26.
Responder Con Cita