2011-10-12 54 views
3

我想加載TList中當前項目的所有類。如果我像普通文件一樣讀取dpr文件,它將只返回字符串。我想獲得dpr文件中定義的所有類及其名稱。有人知道如何做到這一點?如何在運行時獲取項目中定義的類的列表?

+1

類通常不會在.dpr文件中引用。單位是。 –

+0

確定如何加載單位? –

+1

「當前項目的課程」是什麼意思?如果您指的是編譯到可執行文件中的所有類的列表(假設來自您的[上一個問題](http://stackoverflow.com/questions/7737897/delphi-getclass)),則不存在這樣的列表。您可以使用RegisterClasses或您自己的註冊方案,例如有一個帶有字符串的全局TStringList,持有類名和對象持有TClass引用。 –

回答

6

在Delphi IDE中,所有類都在.dcu文件中可用,對應於每個.pas文件。這些.dcu文件具有專有的二進制演進格式,因此無法在IDE之外使用。

在程序執行,並在exe文件中,沒有列出所有現有的類。您可以使用RTTI功能檢索有關已知班級的信息(請參閱TypInfo.pasthe Embarcadero documentation所述的親屬)。所以在運行時,你可以從給定的類中檢索信息:你可以使用例如anObject.ClassNameanObject.ClassType方法。

但我懷疑你想要檢索項目中定義的所有類,從的源代碼。爲此,您將需要一個源代碼解析器,它將從.pas文件中提取邏輯。簡而言之,解析器將讀取.dpr,然後讀取所有必需的.pas文件源代碼,解釋對象pascal類型定義,並創建單元,類,方法和屬性的列表。有幾個解析器:例如,請參閱PasDoc或我們在SynProject中嵌入的版本。

附加說明 - 有關詳盡列表:如果在編譯期間生成.map文件,則此文本文件將包含可執行文件的所有符號名稱,包括類。你必須解析它,但不會有太多的信息需要處理,因爲沒有簡單的方法來猜測每個符號是類還是記錄,或者有關類繼承或屬性...... .map用於執行調試,而不是RTTI。

相關問題