Where to find an IDE extending code example which do not uses ExptIntf and ToolsIntf? : I'm doing my first tests about extending the IDE but I only find old source codes which uses `ExptInft` and `ToolsIntf`, which are deprecated (Delphi 2007).

I'm looking for a newer example code or help for updating an old example.

**Here's what I did for trying to update an old example:**

I've started from [this][1] example source code:

    unit PanelEd; 
     
    interface 
     
    uses 
      Classes, Forms, Windows, Dialogs, ExptIntf, ToolIntf, 
      FileCtrl, SysUtils, EditIntf, DsgnIntf; 
     
    type 
      TPanelEditExpert = class (TIExpert) 
      public 
        function GetStyle: TExpertStyle; override; 
        function GetName: string; override; 
        function GetAuthor: string; override; 
        function GetComment: string; override; 
        function GetPage: string; override; 
        function GetGlyph: HICON; override; 
        function GetState: TExpertState; override; 
        function GetIDString: string; override; 
        function GetMenuText: string; override; 
        procedure Execute; override; 
      end; 
     
    // custom module for the panel 
    type 
      TPanelModule = class (TCustomModule) 
      public 
        procedure ExecuteVerb(Index: Integer); override; 
        function GetVerb(Index: Integer): string; override; 
        function GetVerbCount: Integer; override; 
        procedure ValidateComponent(Component: TComponent); override; 
      end; 
     
    procedure Register; 
     
    implementation 
     
    uses 
      StdCtrls, ExtCtrls, Buttons; 
     
    // "standard" project expert 
     
    function TPanelEditExpert.GetStyle: TExpertStyle; 
    begin 
      // show up in the Help menu 
      Result := esStandard; 
    end; 
     
    function TPanelEditExpert.GetName: String; 
    begin 
      // official name 
      Result := 'Panel Edit Wizard' 
    end; 
     
    function TPanelEditExpert.GetAuthor: string; 
    begin 
      Result := 'Marco and Tim'; 
    end; 
     
    function TPanelEditExpert.GetComment: String; 
    begin 
      Result := 'TPanelEditExpert Wizard'; 
    end; 
     
    function TPanelEditExpert.GetPage: string; 
    begin 
      Result := ''; 
    end; 
     
    function TPanelEditExpert.GetGlyph: HICON; 
    begin 
      Result := 0; 
    end; 
     
    function TPanelEditExpert.GetState: TExpertState; 
    begin 
      Result := [esEnabled]; 
    end; 
     
    function TPanelEditExpert.GetIDString: String; 
    begin 
      // must be unique 
      Result := 'DDHandbook.PanelEditWizard' 
    end; 
     
    function TPanelEditExpert.GetMenuText: String; 
    begin 
      // the text of the menu item 
      Result := '&Panel Edit Wizard' 
    end; 
     
    procedure TPanelEditExpert.Execute; 
    var 
      ModuleName, FormName, FileName: string; 
      ModIntf: TIModuleInterface; 
    begin 
      ToolServices.GetNewModuleAndClassName ( 
        'Panel', ModuleName, FormName, FileName); 
      ModIntf := ToolServices.CreateModuleEx (FileName, FormName, 
        'Panel', '', nil, nil, 
        [cmNewForm, cmAddToProject, cmUnNamed]); 
      ModIntf.ShowSource; 
      ModIntf.ShowForm; 
      ModIntf.Release; 
    end; 
     
    // custom module methods 
     
    function TPanelModule.GetVerbCount: Integer; 
    begin 
      Result := 1; 
    end; 
     
    function TPanelModule.GetVerb(Index: Integer): string; 
    begin 
      if Index = 0 then 
        Result:= 'Rename...'; 
    end; 
     
    procedure TPanelModule.ExecuteVerb(Index: Integer); 
    var 
      NewName: string; 
    begin 
      if Index = 0 then 
      begin 
        NewName := Root.Name; 
        if InputQuery ('Panel Module Editor', 
            'New panel name:', NewName) then 
          Root.Name := NewName; 
      end; 
    end; 
     
    procedure TPanelModule.ValidateComponent(Component: TComponent); 
    begin 
      if not (Component is TButton) and 
          not (Component is TSpeedButton) then 
        raise Exception.Create ('The panel can host only buttons'); 
    end; 
     
    procedure Register; 
    begin 
      RegisterCustomModule (TPanel, TPanelModule); 
      RegisterLibraryExpert(TPanelEditExpert.Create); 
    end; 
     
    end. 



In the [official documentation][2] I read that I should use a `TNotifierObject` who implements `IOTAWizard` and `IOTAMenuWizard` interfaces (From `ToolsAPI` unit), instead of `ExptIntf` and `ToolsIntf`.

In order to update the example code, I've followed these steps:

1. Removed `ExptIntf` and `ToolsIntf` from source code.
2. Added `ToolsAPI` to the uses clause.
3. Replaced `TExpertState` with `TWizardState` 
4. Replaced `esEnabled` with `wsEnabled`.
5. Replaced `RegisterLibraryExpert` with `RegisterPackageWizard`.

After doing this, I still have undeclared identifier errors on `TExpertStyle` and `ToolServices`.

    function TPanelEditExpert.GetStyle: TExpertStyle; 
    begin
      // show up in the Help menu
      Result := esStandard;
    end;
    
    procedure TPanelEditExpert.Execute; 
    var
      ModuleName, FormName, FileName: string;
      ModIntf: TIModuleInterface;
    begin
      ToolServices.GetNewModuleAndClassName (
        'Panel', ModuleName, FormName, FileName); 
      ModIntf := ToolServices.CreateModuleEx (FileName, FormName,
        'Panel', '', nil, nil,
        [cmNewForm, cmAddToProject, cmUnNamed]);
      ModIntf.ShowSource;
      ModIntf.ShowForm;
      ModIntf.Release;
    end;

How should these parts be updated and/or where can I find an example which don't uses deprecated units?


  [1]: http://read.pudn.com/downloads21/sourcecode/book/71256/Delphi%203%20%E9%AB%98%E7%BA%A7%E5%BC%80%E5%8F%91%E6%8C%87%E5%8D%97/15/COMPS/PANELED.PAS__.htm
  [2]: http://docwiki.embarcadero.com/RADStudio/XE5/en/Implementing_the_Wizard_Interfaces