2009-03-31 25 views

Respuesta

28

Esto es de ayuda Delphi (Delphi 2006, pero también está disponible a partir de al menos Delphi 7):

Sintaxis getClass función (const AClassName: String): TPersistentClass;

Descripción Llame a GetClass para obtener una clase de un nombre de clase. Esta clase se puede usar como un parámetro para las rutinas que requieren una clase. La clase debe estar registrada antes de que GetClass pueda encontrarla. Las clases de formulario y las clases de componente a las que se hace referencia en una declaración de formulario (variables de instancia) se registran automáticamente cuando se carga el formulario. Otras clases pueden registrarse llamando a RegisterClass o RegisterClasses.

Aquí hay un código de muestra. Funciona como tal solo porque TButton es un TControl y, por lo tanto, el encasillado es válido.

procedure TForm1.FormCreate(Sender: TObject); 
begin 
    RegisterClasses([TButton, TForm]); 
end; 

procedure TForm1.Button1Click(Sender: TObject); 
var 
    CRef : TPersistentClass; 
    AControl : TControl; 
begin 
    CRef := GetClass('TButton'); 
    if CRef<>nil then 
    begin 
    AControl := TControl(TControlClass(CRef).Create(Self)); 
    with AControl do 
    begin 
     Parent := Self; 
     Width := 50; 
     Height := 30; 
    end; 
    end; 
end; 
+0

Gran solución. Pero ahora me encontré con otro problema. La clase que me gustaría instanciar es una clase propia que implementa una interfaz. Y registerClass debe llamarse con una clase persistente. ¿Alguna idea? –

+0

¿Es posible derivar su clase o uno de sus antepasados ​​de TPersistent? –

+0

No lo creo, ya que implementa una interfaz y tiene que derivarse de TInterfaceObject –

2

Cuando necesitaba hacer eso, he construido mi propia fábrica de objetos que utiliza una subclase especialmente TStringList, actualmente estoy usando Delphi 7 para la clase lista de cadenas sólo admite adjuntar un objeto a una cadena, entonces yo Llegué a la subclase TStringList para que también me permitiera manejar los tipos de clase, así que ahora puedo crear una instancia de un objeto que acaba de pasar su nombre de clase a la fábrica. Funciona de esta manera:

Primero - Cargar una fábrica de objetos Singleton;
2º - Registra cualquier objeto a la fábrica, podría estar en la sección de inicialización de la unidad;

Los métodos principales de Factory podrían ser: isClassRegistered, registerClass, instantiateClass (ClassName: STring): TObject;

De esta forma puedo instanciar cualquier objeto, o usar un objeto instanciado previamente, o incluso, un subconjunto de ellos.

Prefiero usar un tipo Enumerado en lugar de una cadena para identificar una Clase.

Observaciones: Es un ejemplo muy, muy escueto, un código completamente funcional es más complejo, pero, créanme, no demasiado.

Cuestiones relacionadas