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:
- Removed
ExptIntfandToolsIntffrom source code. - Added
ToolsAPIto the uses clause. - Replaced
TExpertStatewithTWizardState - Replaced
esEnabledwithwsEnabled. - Replaced
RegisterLibraryExpertwithRegisterPackageWizard.
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?
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.