How do I update old IDE-extension code so it doesn't use the deprecated ExptIntf and ToolsIntf units?

446 Views Asked by At

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 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 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

There are 1 best solutions below

3
Bruce McGee On

Warren Postma spoke at the local Delphi user group in April about creating IDE plug-ins using the Open Tools API.

His meeting notes are online, including links to his source code.

Note: He was having problems with the parser example, which may or may not be cleaned up in the published sample code.