我能以什么方式生成项目中使用的DFM列表?

时间:2017-08-16 16:20:02

标签: delphi linker

我想创建一个可以列出当前项目中所有DFM的Delphi插件。

有没有办法获取当前项目中链接的所有DFM文件(及其路径)的列表?

如果列出了所有DFM,则可以提取有关项目的内容,并且可能仅对当前项目DFM进行搜索,例如解析DFM以查找属性。

我确实找到了this question,但已经回答了,但没有解决如何到达DFM的问题。该解决方案需要更改存储库中的每个.pas文件,并在运行时提供解决方案。我的问题是关于设计时间。

1 个答案:

答案 0 :(得分:3)

以下是使用OpenTools API的快速示例。将此单元添加到新的仅限设计的程序包中,将designidevcl添加到requires子句中。编译并安装包。它将在Help \ Help Wizards下添加一个菜单项“List DFM”。单击它将调用下面的Execute方法。

unit ListDfmExample;

interface

uses
  Windows, VCL.Forms, VCL.Dialogs, Classes, SysUtils, ToolsAPI;

type
  TListDfmWizard = class(TNotifierObject, IOTAWizard, IOTAMenuWizard)
    { IOTAWizard }
    function GetIDString: string;
    function GetName: string;
    function GetState: TWizardState;
    procedure Execute;
    { IOTAMenuWizard }
    function GetMenuText: string;
  end;

implementation

function TListDfmWizard.GetIDString: string;
begin
  Result := 'TOndrej.ListDfmWizard';
end;

function TListDfmWizard.GetName: string;
begin
  Result := 'ListDfm';
end;

function TListDfmWizard.GetState: TWizardState;
begin
  Result := [wsEnabled];
end;

procedure TListDfmWizard.Execute;
var
  Project: IOTAProject;
  I, J: Integer;
  ModuleInfo: IOTAModuleInfo;
  Module: IOTAModule;
  Editor: IOTAEditor;
  FormEditor: IOTAFormEditor;
  List: TStringList;
begin
  Project := GetActiveProject;
  if not Assigned(Project) then
    Exit;

  List := TStringList.Create;
  try
    for I := 0 to Project.GetModuleCount - 1 do
    begin
      ModuleInfo := Project.GetModule(I);
      if ModuleInfo.FormName <> '' then
      begin
        Module := ModuleInfo.OpenModule;
        for J := 0 to Module.ModuleFileCount - 1 do
        begin
          Editor := Module.ModuleFileEditors[J];
          if Supports(Editor, IOTAFormEditor, FormEditor) then
            List.Add(FormEditor.FileName);
        end;
      end;
    end;

    ShowMessage(List.Text);
  finally
    List.Free;
  end;
end;

function TListDfmWizard.GetMenuText: string;
begin
  Result := 'List DFM';
end;

initialization
  RegisterPackageWizard(TListDfmWizard.Create);

end.