Me parece que no captaste la esencia:
Para crear una forma (u otro objeto) de manera genérica necesitas
referencias de clases mientras que lo que tú tienes son los
nombres de las clases que obtienes de una tabla.
La fábrica mantiene una relación entre las referencias y los nombres:
Código:
+----------+--------+
| Nombre | Clase |
+----------+--------+
| 'TForm1' | TForm1 |
| 'TForm2' | TForm2 |
| 'TForm3' | TForm3 |
| 'TForm4' | TForm4 |
+----------+--------+
Cuando obtienes el nombre de una clase la fábrica te da la referencia de clase necesaria para construir la forma.
A continuación te pongo la unidad que define la fábrica. Puedes copiarla y pegarla completa:
Código:
unit FabForm;
interface
uses
Classes, Forms;
type
TFabrica = class
private
Lista: TStringList;
function GetClase(Nombre: String): TFormClass;
public
constructor Create;
destructor Destroy; override;
procedure Registrar(Clase: TFormClass);
property Clases[Nombre: String]: TFormClass read GetClase;
end;
var
Fabrica: TFabrica;
implementation
constructor TFabrica.Create;
begin
inherited;
Lista := TStringList.Create;
end;
destructor TFabrica.Destroy;
begin
Lista.Free;
inherited;
end;
procedure TFabrica.Registrar(Clase: TFormClass);
var
I : Integer;
begin
I := Lista.IndexOf(Clase.ClassName);
// Registrar si no lo está ya
if I = -1 then Lista.AddObject(Clase.ClassName, TObject(Clase));
end;
function TFabrica.GetClase(Nombre: String): TFormClass;
var
I : Integer;
begin
I := Lista.IndexOf(Nombre);
Assert(I <> -1, 'Clase no registrada');
Result := TFormClass(Lista.Objects[i]);
end;
initialization
Fabrica := TFabrica.Create;
finalization
Fabrica.Free;
end.
En la unidad de cada formulario que desees 'almacenar' en la tabla registras la clase:
Código:
unit Unit1;
interface
type
TForm1 = class(TForm)
...
end;
implementation
uses FabForm;
initialization
Fabrica.Registrar(TForm1);
end.
Finalmente, suponte que NombreForma es una variable
string que contiene el
nombre de una forma obtenido de tu tabla y que ClaseForma es una variable de tipo TFormClass. La asignación
ClaseForma := Fabrica.Clases[NombreForma];
te da la
referencia de clase que necesitas y ahora puedes crear el formulario con:
ClaseForma.Create(nil)
Espero que ahora esté más claro. Si tienes dudas pregunta otra vez.
// Saludos