我想创建一个可以列出当前项目中所有DFM的Delphi插件。
有没有办法获取当前项目中链接的所有DFM文件(及其路径)的列表?
如果列出了所有DFM,则可以提取有关项目的内容,并且可能仅对当前项目DFM进行搜索,例如解析DFM以查找属性。
我确实找到了this question,但已经回答了,但没有解决如何到达DFM的问题。该解决方案需要更改存储库中的每个.pas
文件,并在运行时提供解决方案。我的问题是关于设计时间。
答案 0 :(得分:3)
以下是使用OpenTools API的快速示例。将此单元添加到新的仅限设计的程序包中,将designide
和vcl
添加到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.