2012-09-22 20 views
7

estoy trabajando en Delphi XE, ventanas 7.clases "no utilizados" se pondrá a disposición en Delphi XE

En una aplicación Deseo habilitar diferentes tipos de informes para mis usuarios a seleccionar. Para hacer esto, tengo 1 clase de informe base y una subclase por tipo de informe (xml, csv, ppt, etc.).

{Just an illustrating example} 
TBaseReport = class 
public 
    constructor Create; 
    procedure GenerateReport; virtual; abstract; 
    class function ReportType: string; virtual; abstract; 
end; 

T*Report = class(TBaseReport); 
//Etcetera. 

Lo que quiero hacer es usar Rtti para detectar todas las clases de informes y enumerar sus ReportType. Después de eso, quiero usar Rtti para crear una instancia de la clase de informe elegida y llamar a GenerateReport. En general, esto no es demasiado difícil de lograr.

Sin embargo, hay un inconveniente importante: nunca me resulta difícil codificar el uso de las clases descendentes, por lo que el código no se incluye en el ejecutable.

¿Hay alguna forma decente de forzar al enlazador/compilador a incluir estas clases?

Un problema sería simular el uso de los informes en su sección de inicialización, pero prefiero no hacerlo. Una mejor solución es hacer que la clase base sea persistente y llamar a 'RegisterClass (T * Report);' en la sección de inicialización. Funciona, pero no veo ninguna otra necesidad para que sean persistentes, así que de nuevo, prefiero no hacer eso. Por otro lado, ¿tal vez esta es la única forma de hacerlo?

Gracias de antemano.

Respuesta

5

Puede utilizar la Directiva del compilador {$STRONGLINKTYPES ON}, para incluir todos los símbolos de su aplicación en el exe final, recuerde que esta opción aumenta el tamaño del ejecutable, ya que se incluye más RTTI en el ejecutable.

+0

Esta es la manera de hacerlo. En cuanto a su punto final, no tanto RTTI como más código –

+0

Veo que el alcance de STRONGLINKTYPES es GLOBAL. ¿Sabes si también hay un equivalente local disponible? – deColaman

+0

Solo lo activé para que mi aplicación verifique el aumento en el tamaño del archivo. El exe creció de 8.3MB a 9.9MB. Aunque esto parece mucho, los beneficios superan el tamaño extra, creo. – deColaman

7

Puede crear su propia versión de RegisterClass. Algo así como RegisterReportClass. Internamente, mantienes tu propia lista de clases de informes que se pueden usar. Su función de registro tomará un tipo de clase TBaseReport - No necesita TPersistent.

Su método RegisterReportClass debe llamarse en la sección de Inicialización asegurándose de que las clases estén incluidas.

Si mira en la unidad de gráficos, puede ver TFileFormatsList = class (TList). Esta es la clase que se utiliza para contener los diferentes tipos de gráficos y podría usarse como ejemplo para crear su propia TReportFormatsList. Delphi usa una función estática TPicture.RegisterFileFormat para agregar elementos a su lista interna.

+0

Aunque esto es de hecho posible, es básicamente la suma de lo que mencioné al final. Además, negaría la parte dinámica que esperaba lograr a través de Rtti. – deColaman

+0

Aún podría utilizar RTTI para trabajar con las clases. Pero no estoy seguro de por qué querrías hacer eso. Si todo tiene una clase base común, realmente no hay ninguna razón para usar RTTI. Utilizarías tu lista interna para encontrar las clases. Cuando agrega una nueva clase, no es necesario cambiar nada en el código que usa la lista de clases. Para mí, es más simple rastrear lo que está pasando con una función de registro y luego depender de una directiva de compilación. –

Cuestiones relacionadas