Ver Mensaje Individual
  #4  
Antiguo 02-08-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
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

Última edición por roman fecha: 02-08-2003 a las 04:56:54.
Responder Con Cita