2012-09-22 7 views
7

Ich arbeite in Delphi XE, windows 7.Kann „ungenutzt“ Klassen in Delphi XE zur Verfügung gestellt werden

In einer Anwendung ich verschiedene Berichtstypen für meine Benutzer auswählen aktivieren möchten. Um dies zu tun, habe ich 1 Base-Bericht-Klasse und eine Unterklasse pro Berichtstyp (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. 

Ich möchte Rtti verwenden, um alle Berichtsklassen zu erkennen und ihren ReportType aufzulisten. Danach möchte ich mit Rtti eine Instanz der gewählten Berichtklasse erstellen und GenerateReport aufrufen. Alles in allem ist dies nicht schwer zu erreichen.

Allerdings gibt es einen großen Nachteil: Ich bin nie hart Codierung der Verwendung der absteigenden Klassen, so wird der Code nicht in der ausführbaren Datei enthalten.

Gibt es eine anständige Möglichkeit, den Linker/Compiler zu zwingen, diese Klassen einzuschließen?

Eine (n hässliche) Arbeit wäre es, die Verwendung der Berichte in ihrem Initialisierungsabschnitt zu simulieren, aber das würde ich lieber nicht tun. Eine bessere Lösung besteht darin, die Basisklasse persistent zu machen und "RegisterClass (T * Report)" aufzurufen. im Initialisierungsabschnitt. Es funktioniert, aber ich sehe keine andere Notwendigkeit, sie hartnäckig zu machen, also würde ich das lieber nicht tun. Auf der anderen Seite, vielleicht ist dies der einzige Weg, es zu tun?

Vielen Dank im Voraus.

Antwort

5

Sie können die Compiler-Richtlinie {$STRONGLINKTYPES ON} verwenden, um alle Symbole Ihrer App in die endgültige exe einzufügen. Denken Sie daran, dass diese Option die Größe der ausführbaren Datei erhöht, da mehr RTTI in der ausführbaren Datei enthalten ist.

+0

Dies ist der Weg, es zu tun. In Bezug auf Ihren Endpunkt, nicht so viel mehr RTTI als mehr Code –

+0

Ich sehe, dass der Geltungsbereich von STRONGLINKTYPES GLOBAL ist. Weißt du, ob es auch eine lokale Entsprechung gibt? – deColaman

+0

Ich habe es gerade für meine Anwendung eingeschaltet, um die Zunahme der Dateigröße zu überprüfen. Die exe wuchs von 8.3MB auf 9.9MB. Obwohl dies viel erscheint, überwiegen die Vorteile die zusätzliche Größe, die ich denke. – deColaman

7

Sie können Ihre eigene Version von RegisterClass erstellen. So etwas wie RegisterReportClass. Intern behalten Sie Ihre eigene Liste von Berichtsklassen, die verwendet werden können. Ihre Registrierungsfunktion übernimmt einen TBaseReport-Klassentyp - TPersistent ist nicht erforderlich.

Ihre RegisterReportClass-Methode sollte im Abschnitt Initialisierung aufgerufen werden, um sicherzustellen, dass die Klassen enthalten sind.

Wenn Sie in der Grafikeinheit nachsehen, können Sie TFileFormatsList = class (TList) sehen. Dies ist die Klasse, die verwendet wird, um die verschiedenen Grafiktypen zu speichern. Sie kann als Beispiel für das Erstellen einer eigenen TReportFormatsList verwendet werden. Delphi verwendet eine statische Funktion TPicture.RegisterFileFormat, um Elemente zu ihrer internen Liste hinzuzufügen.

+0

Obwohl dies in der Tat möglich ist, ist es im Grunde die Summe dessen, was ich am Ende erwähnt habe. Außerdem würde es den dynamischen Teil, den ich durch Rtti erreichen wollte, irgendwie negieren. – deColaman

+0

Sie könnten RTTI weiterhin verwenden, um mit den Klassen zu arbeiten. Aber ich bin mir nicht sicher, warum du das willst. Wenn alles eine gemeinsame Basisklasse hat, gibt es keinen Grund RTTI zu verwenden. Sie würden Ihre interne Liste verwenden, um die Klassen zu finden. Wenn Sie eine neue Klasse hinzufügen, muss im Code, der die Klassenliste verwendet, nichts geändert werden. Für mich ist es einfacher zu verfolgen, was mit einer Registerfunktion vor sich geht, um dann von einer Compiler-Direktive abhängig zu sein. –

Verwandte Themen