如何在Delphi中通过ToolsAPI获得模块的结构?

如何在Delphi中通过ToolsAPI获得模块的结构?,delphi,structure,toolsapi,Delphi,Structure,Toolsapi,我想通过ToolsAPI获得模块(pascal单元)的结构信息。就像IDE的结构视图一样 类、记录、接口、变量/常量等 成员、参数等 已经有一种简单有效的方法来获取这些元数据了吗?AFAIK没有办法查询给定文件的特殊结构化信息 您可以做的是访问结构窗格中的信息。这种方式要求文件是活动模块(可由OTA实现),输出取决于结构窗格设置(工具|选项…->环境选项|资源管理器),如果节点是字段、过程或需要通过图像索引确定的任何内容,则父项 此代码遍历结构窗格 procedure StructureView

我想通过ToolsAPI获得模块(pascal单元)的结构信息。就像IDE的结构视图一样

类、记录、接口、变量/常量等 成员、参数等


已经有一种简单有效的方法来获取这些元数据了吗?

AFAIK没有办法查询给定文件的特殊结构化信息

您可以做的是访问结构窗格中的信息。这种方式要求文件是活动模块(可由OTA实现),输出取决于结构窗格设置(工具|选项…->环境选项|资源管理器),如果节点是字段、过程或需要通过图像索引确定的任何内容,则父项

此代码遍历结构窗格

procedure StructureViewToSL(ASL: TStringList);

  procedure TreeToSL(ANode: IOTAStructureNode; ASL: TStringList; const APrefix: string);
  var
    I: Integer;
  begin
    ASL.Add(APrefix + ANode.Caption);
    for I := 0 to ANode.ChildCount - 1 do
      TreeToSL(ANode.Child[I], ASL, APrefix + '  ');
  end;

var
  StructureView: IOTAStructureView;
  StructureContext: IOTAStructureContext;
  Node: IOTAStructureNode;
  I: Integer;
begin
  StructureView := BorlandIDEServices as IOTAStructureView;
  StructureContext := StructureView.GetStructureContext;
  for I := 0 to StructureContext.RootNodeCount - 1 do
  begin
    Node := StructureContext.GetRootStructureNode(I);
    TreeToSL(Node, ASL, '');
  end;
end;

也许使用a不是个坏主意?

问题是,使用ToolsApi可以看到未编译的模块,因此需要一个“解析器”。Delphi有一个使用IDE运行的(有缺陷的)解析器,但我不知道如何利用它的结果+这是我最后一次选择使用解析器。这可能花费了我很多时间,但buggy…+1&添加问题作为最爱:完全同意Cosmin Prund!谢谢,Uwe Schuster。这种方式出现在我的脑海里。但正如你所说,它只在模块激活时工作。我正在寻找的是一种支持项目组中所有模块的方法。使用OTA,可以枚举项目组中的所有项目和模块,并且可以使每个模块成为活动模块。是的。如果我没有错,每个模块都必须打开并激活。但在我的情况下,这似乎不是最好的方法……鉴于Delphi(Compiler/RTL/Rtti/ToolsAPI)自发布之日起经历了许多变化,有没有办法改进代码?谢谢。我要调查一下。事实上,这是唯一的办法。这正是例如(ModelMaker Code Explorer)和(Delphi内置重构)编写自己的解析器(在Delphi编译器之外)的原因。