2017-08-16 4 views
2

Ich möchte ein Delphi-Plug-in erstellen, das alle DFMs im aktuellen Projekt auflisten kann.Wie kann ich eine Liste von DFMs erstellen, die in einem Projekt verwendet werden?

Gibt es eine Möglichkeit, eine Liste aller im aktuellen Projekt verknüpften DFM-Dateien (und deren Pfade) zu erhalten?

Wenn alle DFMs aufgelistet sind, können Dinge über das Projekt extrahiert werden, und möglicherweise werden nur Suchen in den aktuellen Projekt-DFMs durchgeführt, z. B. die Analyse der DFMs nach einer Eigenschaft.

Ich habe this question gefunden, die beantwortet wurde, aber nicht adressiert, wie man zu den DFMs kommt. Und diese Lösung erfordert das Ändern jeder .pas-Datei im Repository und gibt eine Lösung zur Laufzeit. Meine Frage dreht sich um Design-Zeit.

+1

Sie sagen Plug-in, also nehme ich an, Sie möchten die Formulare zur Entwurfszeit finden? Bitte klären Sie .. –

+3

IDE-Addons werden mit Hilfe der [OpenTools API] (http://docwiki.embarcadero.com/RADStudio/de/Editioning_the_IDE_Using_the_Tools_API) implementiert, die Schnittstellen zum Auflisten der Projekteinstellungen, Formulare, zugehörigen Dateien ('. pas', '.dfm') usw. Sehen Sie sich die' ToolsAPI' und zugehörige Einheiten an, sowie die 'IOTAProjectGroup',' IOTAProject' und 'IOTAModule' Schnittstellen (um nur einige zu nennen) und das' GetActiveProject() 'Standalone-Funktion. Es gibt viele OpenTools-Tutorials, die herumfliegen, wenn Sie sich umsehen. –

+0

Ja, ich möchte die Formulare zur Entwurfszeit finden. Ja, ich benutze IOTA. Aber ich habe gerade gefunden, wie man ein Projekt erstellt, ich konnte kein Tutorial finden, wie man über Daten iteriert. – none

Antwort

3

Hier ist ein kurzes Beispiel mit OpenTools API. Fügen Sie dieses Gerät einem neuen Design-only-Paket hinzu, fügen Sie designide und vcl dem requires-Klausel hinzu. Kompilieren und installieren Sie das Paket. Es wird ein Menüeintrag "DFM-Liste" unter Hilfe \ Hilfe-Assistenten hinzugefügt. Wenn Sie darauf klicken, wird die folgende Methode Execute aufgerufen.

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. 
+0

Dieser Code funktioniert nur bei kleinen Projekten. ein Projekt mit mehr als 100 Formen, könnte es mit Fehler brechen "Fehler beim Erstellen des Formulars System Fehlercode 1158" Gibt es etwas fehlt? – none

Verwandte Themen