我是Delphi的新手,我正在尝试创建一个应用程序,我将作为输入提供.dpr文件,应用程序将创建一个包含此.dpr使用的所有.pas文件的列表...我还是找不到Delphi中的函数或者读取.dpr的用法,以便通过文件系统导航到这些pas文件并阅读它们的用途等等......有没有人对如何实现有任何想法此?
答案 0 :(得分:3)
这并不简单:您不仅需要阅读.dpr
文件,还需要解析.dproj
和注册表以获取搜索路径。如果您正在尝试执行此操作,则还必须将.dpr
和.pas
文件解析为代码文件,以便您可以找到uses语句,处理{$I '...'}
包含,{{1阻止,{$IFDEF}
与interface
部分等等。
所有这一切,您可能希望了解开源CnPack和GExperts项目的灵感。他们两个都解决了这个问题,你可以利用他们的工作解决你想要解决的任何问题。
答案 1 :(得分:0)
我想更新此问题以获取可能的答案以供将来参考。
创建一个单独的单元文件(PhonyObject.pas)
unit PhonyObject;
interface
uses
System.Classes, FMX.Forms, FMX.Dialogs;
type
TPhonyObject = class(TObject)
end;
TPhonyClass = class of TPhonyObject;
procedure FindUnitName(anObject: TObject);
var
PhonyName: string;
PhonyClass: TPhonyClass;
PhonyInstance: TObject;
PhonyClassName: procedure(anObject: TObject) = FindUnitName; //function: String = FindUnitName;
implementation
uses System.TypInfo;
procedure FindUnitName(anObject: TObject);
begin
if anObject <> nil then PhonyName := anObject.UnitName
else if not (TObject.UnitName <> 'System') then
begin
if TypInfo.GetTypeData(anObject.ClassInfo) <> nil then PhonyName := String(GetTypeData(anObject.ClassInfo)^.UnitName);
end else PhonyName := TObject.UnitName;
//FreeAndNilProperties
end;
initialization
PhonyClass := TPhonyObject;
PhonyInstance := PhonyClass.Create;
ShowMessage('Unit Name =' + PhonyInstance.UnitName);
PhonyInstance.Free;
finalization
PhonyClass := nil; //PhonyClass.Free;
end.
为了在另一个(多个)单元中使用它,这是我到目前为止使用的代码,但我希望稍后更新它。我把它出现在手工制作的“控制台”里面,在TMemo中有黑色背景和白色文字。如果有人想要TMemo的代码(它不是众所周知的),或者如何在调试窗口内显示所有这些,那么你只需要告诉我。这是迄今为止我得到的最好的,但我需要更好地理解子/父对象/类
unit AnotherUnit;
interface
uses
System.Classes, PhonyObject;
type
TPhonyObj = class(TPhonyObject)
end;
//var
implementation
{$R *.fmx}
uses ...;
initialization
PhonyClass := TPhonyObj;
PhonyInstance := PhonyClass.Create;
ShowMessage('UnitName= ' + PhonyInstance.UnitName + ' (AnotherUnit)'); // PhonyClass.UnitName // PhonyClassName(PhonyInstance);
PhonyInstance.Free;
finalization
PhonyClass := nil;
end;
我使用单位名称和类名称的唯一,因为我可以,我意识到我实际上并没有使用任何对象,直到最后,它应该解决任何问题。请评论是否有更好的想法,但我认为这是Delphi编程的一个强大功能,当您可以预测某些单位名称何时会突然出现时。以及如何预测它们。
答案 2 :(得分:0)
如果让Delphi创建.map文件(链接器选项),它将包含该项目中使用的所有source和dcu文件的列表。 GExperts使用一个简单的解析器来处理地图文件,该文件取自我的dzlib https://sourceforge.net/p/dzlib/code/HEAD/tree/dzlib/trunk/src/u_dzMapFileReader.pas