以编程方式获取Delphi中dpr中使用的所有单元

时间:2014-10-09 19:57:57

标签: delphi delphi-xe4

我是Delphi的新手,我正在尝试创建一个应用程序,我将作为输入提供.dpr文件,应用程序将创建一个包含此.dpr使用的所有.pas文件的列表...我还是找不到Delphi中的函数或者读取.dpr的用法,以便通过文件系统导航到这些pas文件并阅读它们的用途等等......有没有人对如何实现有任何想法此?

3 个答案:

答案 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