2012-09-22 67 views
7

我在Delphi XE工作來提供,Windows 7的能「未使用」班班德爾福XE

在一個應用程序,我想啓用不同的報告類型爲我的用戶選擇。 爲此,我有1個基本報告類和每個報告類型的子類(xml,csv,ppt等)。

{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. 

我想要做的就是使用Rtti來檢測所有報告類並列出它們的ReportType。 之後,我想使用Rtti創建所選報告類的實例並調用GenerateReport。總而言之,這不難實現。

但是有一個主要的缺點:我從來沒有對降序類的使用進行硬編碼,所以代碼沒有包含在可執行文件中。

有沒有一種體面的方式來強制鏈接器/編譯器包含這些類?

解決辦法是模擬報告在初始化部分的使用情況,但我寧願不這樣做。 更好的解決方案是使基類持久化並調用'RegisterClass(T * Report)';'在初始化部分。它有效,但我沒有看到任何其他需要讓它們持久存在,所以我再也不想這樣做。另一方面,也許這是做到這一點的唯一方法?

在此先感謝。

回答

5

您可以使用{$STRONGLINKTYPES ON}編譯器指令,在最終的exe文件中包含應用程序的所有符號,請記住,此選項會增加可執行文件的大小,因爲可執行文件中包含的RTTI更多。

+0

這是做到這一點的方法。關於你的最後一點,沒有更多的RTTI作爲更多的代碼 –

+0

我看到STRONGLINKTYPES的範圍是全局的。你知道是否還有本地等價物? – deColaman

+0

剛剛爲我的應用程序打開它以檢查文件大小的增加。 exe從8.3MB增加到9.9MB。雖然這看起來很多,但好處超過我想的額外大小。 – deColaman

7

您可以創建您自己的RegisterClass版本。像RegisterReportClass。在內部,您可以保留自己的可以使用的報告類別列表。您的註冊函數將採用TBaseReport類類型 - 不需要TPersistent。

您的RegisterReportClass方法應在初始化部分調用,確保包含類。

如果你看看圖形單元,你可以看到TFileFormatsList = class(TList)。這是用於保存不同圖形類型的類,可以用作創建自己的TReportFormatsList的示例。 Delphi使用靜態函數TPicture.RegisterFileFormat將項目添加到其內部列表。

+0

雖然這確實是可能的,但它基本上是我在最後提到的總和。此外,它會否定我希望通過Rtti實現的動態部分。 – deColaman

+0

您仍然可以使用RTTI來處理類。但我不確定你爲什麼想這樣做。如果每件事都有一個共同的基類,那麼真的沒有理由使用RTTI。你會用你的內部列表來找到這些類。添加新類時,在使用類列表的代碼中不需要更改。對我來說,跟蹤一個寄存器函數正在發生什麼變得更簡單,然後依賴於編譯器指令。 –