2012-01-28 9 views
7

Google es inútil para este tipo de búsquedas, ya que obtiene cientos de millones de resultados absolutamente ninguno relacionado con la pregunta específica.Referencia de clase como propiedad

La pregunta es simplemente esto:

  • ¿Es posible tener una propiedad Referencia Clase en Delphi?
  • Si es así, ¿cómo?

Aquí es lo que he intentado ...

type 

    TMyObject = class 
    // ... 
    end; 

    TMyObjectClass = class of TMyObject 

    TMyObjectA = class(TMyObject) 
    // specifics here 
    end; 

    TMyObjectB =class(TMyObject) 
    // specifics here 
    end; 

    TMyComponent = class(TComponent) 
    private 
    FObjectType: TMyObjectClass; 
    published 
    property ObjectType: TMyObjectClass read FObjectType write FObjectType; 
    end; 

El código anterior compila bien, sin embargo, el inspector de objetos no muestra la propiedad ObjectType en absoluto.

Mi objetivo aquí (si no lo ha adivinado) es hacerlo para poder seleccionar un descendiente de clase de una clase base específica, para hacer que el mismo componente se comporte de una manera diferente.

Quiero hacerlo de esta forma para que el componente no necesite conocer directamente las subclases (debe ser totalmente modular).

Permítanme hacer esto poco claro: no puede utilizar una enumeración que elegir entre los tipos de sub-clase que el componente no puede enlazar directamente a los tipos de sub-clase (Simplemente no es posible en este caso particular)

De todos modos ... gracias de antemano!

+0

El inspector de objetos no muestra la propiedad porque no hay un editor de propiedades registrado para ella. – kludg

Respuesta

5

Puede encontrar todas las clases que descienden de una clase base particular: Delphi: At runtime find classes that descend from a given base class? y hacer de esta una propiedad especial con una lista de valores usando TPropertyEditor.

+0

Marcó su respuesta tan correcta como la primera vez que respondió (y esta es la respuesta correcta, por supuesto). No utilizaré este método porque no quiero usar ningún RTTI en este sistema. Decidió ir con la idea de "componentes entrecruzados" (donde un componente de 'TMyObjectA' o' TMyObjectB' se vincula a una instancia 'TMyComponent' a través de una propiedad. ¡Más fácil de esta manera! – LaKraven

+0

Simon, considere cómo un editor de propiedades de este tipo realmente podría obtener tipos de clases en el contexto de un paquete de tiempo de diseño. –

+0

David, sí ... sería relativamente fácil (usando RTTI) agregar un Editor de propiedades para manejar este tipo de cosas ... pero como dije en mi comentario anterior, no quiero usar el RTTI en el compilado ejecutable (que tendría que hacer para obtener la Clase de su nombre calificado tal como está almacenado en el DFM) – LaKraven

3

Si fuera a hacer esto, entonces necesitaría proporcionar un property editor. El IDE no viene con editores de propiedades para las propiedades de tipo de clase. También necesitaría manejar la persistencia de .dfm. Escribirías el tipo de clase en el archivo .dfm como una cadena y cuando se lea el archivo .dfm, necesitarías corregir la referencia. Nuevo estilo RTTI podría hacer eso.

Sin embargo, no creo que nada de esto sea realmente viable por el siguiente motivo. Su código de tiempo de diseño se ejecuta en un paquete dentro del IDE y no tiene acceso a los tipos de clases en el proyecto activo en el IDE. Esos tipos de clase solo existen cuando se ejecuta ese proyecto. Por lo tanto, la propiedad ObjectType en el código de su pregunta no puede asignarse a nada significativo en el paquete de tiempo de diseño. Bueno, podrías usarlo para las clases definidas en la VCL y en cualquier otro paquete instalado en tu IDE, pero prefiero imaginar que deseas utilizarlo en las clases definidas en el proyecto activo.

Creo que todo esto significa que en su lugar deberías usar una propiedad de cadena simple y corregir las referencias de tipo de clase solo en tiempo de ejecución.

Cuestiones relacionadas