Ver Mensaje Individual
  #6  
Antiguo 23-09-2004
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
Cita:
Empezado por marto
Y como bien se ha comentado, eso no se puede hacer en Delphi.
Bueno, puede hacerse con GetClass pero la clase debe estar previemente registrada con RegisterClass que, a fin de cuentas viene a ser el registro en la fábrica.

Por otro lado la implementación que esboza mamcx no se me hace particularmente complicada o no veo forma de reducirla mucho.

De cualquier manera aprovecho este hilo para copiar la fábrica que menciona Federico del otro hilo:

Código Delphi [-]
unit fab;

interface

uses
  Classes, Forms;

type
  TFabrica = class
  private
   Lista : TStringList;
   function GetClase(Nombre: String): TFormClass;

  public
   property Clases[Nombre: String]: TFormClass read GetClase; default;

   constructor Create;
   destructor Destroy; override;
   procedure Registrar(Clase: TFormClass);
  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.

ya que en el hilo original han aparecido montones de líneas en blanco.

Está pensada para formularios pero se puede adaptar a otras clases base.

// Saludos
Responder Con Cita