Me gustaría crear una instancia de una clase pero solo tengo su nombre en una cadena. ¿Hay alguna manera?¿Hay alguna manera de instanciar una clase por su nombre en delphi?
Respuesta
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;
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.
- 1. clase por su nombre
- 2. ¿Cómo obtener la referencia de tipo de clase por su nombre en Delphi XE?
- 3. ¿Hay alguna manera de crear instancias de objetos a partir de una cadena que contenga su nombre de clase?
- 4. ¿Hay alguna manera de "extender" una clase en SASS?
- 5. ¿Hay alguna manera de anular automáticamente ToString() en una clase?
- 6. Evite instanciar una clase en Java
- 7. ¿Se debe instanciar una clase en C#?
- 8. ¿Hay alguna manera de hacer referencia (en XAML) a un conjunto con espacios en su nombre?
- 9. ¿Hay alguna forma de instanciar un NSManagedObject sin insertarlo?
- 10. ¿Hay alguna manera de anular el constructor vacío en una clase generada por LINQtoSQL?
- 11. ¿Alguna forma de preguntar un método por su nombre?
- 12. ¿Hay alguna manera de crear su propio elemento HTML?
- 13. ¿Cómo puedo instanciar un objeto sabiendo solo su nombre?
- 14. ¿Hay alguna manera de validar un nombre de archivo?
- 15. ¿Puedo usar métodos de una clase sin instanciar esta clase?
- 16. En Scala, ¿hay alguna manera fácil de convertir una clase de caso en una tupla?
- 17. ¿Hay alguna manera de "limpiar" una superficie?
- 18. ¿Hay alguna manera de prohibir la subclasificación de mi clase?
- 19. En Lua, ¿hay alguna función que, dada una función, devuelva su nombre como una cadena?
- 20. ¿Hay alguna manera de restablecer todas las propiedades estáticas de una clase en particular?
- 21. ¿Hay alguna manera de que Ediff no abra su interfaz de navegación en una ventana externa?
- 22. ¿Hay alguna manera de desactivar una etiqueta?
- 23. ¿Hay alguna manera de pausar una CABasicAnimation?
- 24. Cómo instanciar stdClass en su lugar
- 25. Clonación frente a instanciar una nueva clase
- 26. ¿Puedo instanciar una clase de PHP dentro de otra clase?
- 27. instanciar clase del objeto de clase
- 28. ¿Hay alguna manera de reemplazar la clase por otra en Intellij Idea?
- 29. ¿Hay alguna manera de tener argumentos dinámicos por defecto?
- 30. ¿Hay alguna manera de obtener el nombre de la función dentro de una función de C++?
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? –
¿Es posible derivar su clase o uno de sus antepasados de TPersistent? –
No lo creo, ya que implementa una interfaz y tiene que derivarse de TInterfaceObject –