Delphi IDE 확장 개발 마법사

23300 단어
저자: Borland(CnPack에서 번역) 출처: www.CnPack.org
이후 문장에서 나의 오프닝을 쓰지 않았다. 기술 교류, DH가 설명한 것은 모두 전재된 것이다. 작가의 이름을 알면 내가 쓸 것이다. 모르면 어쩔 수 없다.하지만 좋은 글은 꺼내서 여러분과 나눠야 합니다.
 、      

1、    
Delphi IDE               ,          ,            。Delphi7                  ,    CnPack        IDE                   ,       Delphi7 IDE              ,         。 
2、      
                 : 
   (Add-in),      DLL       IDE       。 
   (Wizard),   IOTAWizard   IDE    。 
     (Repository Wizard),        、        。 
  (Package),Delphi            。 
     (Design-time Package),      IDE        。 
     (Runtime Package),      DLL        。 
   (Interface),Delphi    COM     。 
    (Notifier),           IDE             。 
    (Creator),                  、          。 
   (Project),Delphi  Project。 
   (Unit),Delphi  Unit。 
   (Module),      IDE             ,       、       、       。 
    (Editor),IDE             。 
   IDE、DLL、Action、Tools API          ,    。 
 
 、   Delphi IDE 
1、 IDE   
    Open Tools API(     Tools API),           、     、                      IDE。Tools API     100         IDE   ,     、   、 Action        、           、        、                、            、    、    ,      。 
  Tools API        ,              ,                。  Tools API                DLL       IDE 。  ,    Tools API                  。         ,                             。 
 
             Tools API: 
 Tools API   
         
   Tools API   
            
         
 IDE        
2、 Tools API   
   Tools API          :ToolsAPI。   Tools API,      designide   ,          Tools API                 DLL   。        ,        。 
    Tools API        IOTAWizard,    IDE       (Wizards)。        ,C++Builder Delphi       。    Delphi          ,   C++Builder   ,    。             IDE     ,                                。   Tools API,              ToolsAPI             。       Tools API      ,                   ,           IDE  。Tools API      ,              ,              。                 、     、       。                   ,     Tools API  。 
                     ,                   : 
 NTA(native tools API)   Tools API         IDE  , IDE TMainMenu  。        ,      Borland  ,             IDE   。                       DLL 。 
 OTA(open tools API)   Tools API      ,        IDE。    ,      Delphi            AnsiString   Delphi  ,          COM            ,       Tools API       OTA    。         OTA  ,               IDE   DLL。 
Tools API        :                 ,    IDE        。             :     IDE            。               :  (Wizards)、   (Notifiers)     (Creators): 
          ,        IOTAWizard           。 
     Tools API         。IDE                       。                ,   Tools API      ,         、     、    、            ,IDE          。        IDE       。 
                   。Tools API            、     ,             。                      。 
          (Module)    (Editor)。                ,         。                。               IDE        :      (Source Editor)        ,     (Form Designer)       ,        (Project Resource)      。                            。 
3、         
          ,                 。                : 

        
       
IOTAFormWizard          、        
IOTAMenuWizard       Help    
IOTAProjectWizard                。 
IOTAWizard                  

                     : 
      (Menu Wizard)    IDE Help   。          ,IDE       Execute  。            ,                  。 
              ,           (Object Repository) 。                 ,         (    Tools|Repository   )       。             “New Form”   ,    IDE          “File|New Form” ,           。        “Main Form”   ,    IDE                      。              “New Project”   ,     “File|New Application” ,IDE          。 
                       。               ,      ,              。 

Tools API              ,                    。                                   (            )。 
                   : 
        
       

4、        
            IOTAWizard  ,  ,          :IOTANotifier IInterface。                    , :IOTARepositoryWizard、IOTAWizard、IOTANotifier IInterface。 
  IInterfac       Delphi       ,     COM     。 ,QueryInterface      ,_AddRef _Release      。                           。      ,ToolsAPI        ,TNotifierObject,    IOTANotifier          。 
       IOTANotifier,                , IDE          ,          (   TNotifierObject   )。  ,          ,                         ,    TNotifierObject IOTANotifier   。 
5、       
          ,     (Wizard Package)       Register  。(  Register             。) Register   ,    RegisterPackageWizard,           ,                ,    : 
procedure Register; 
begin 
  RegisterPackageWizard(MyWizard.Create); 
  RegisterPackageWizard(MyOtherWizard.Create); 
end; 
 
  ,           、    ,          。 
   ,     Delphi       ,                                    。              :                  。 
    ,               :        Install  。IDE              。       ,IDE           。 
(  :   DLL     ,         ,   Delphi7       MyWizard   ,      HKEY_CURRENT_USER\Software\Borland\Delphi\7.0\Experts         :MyWizard,  DLL        ) 
6、   Tools API   
          ,      IDE:     、  、    ,          。Tools API       ,   Action      Action  ,              ,           ,  。               : 

Tools API     
       
INTAServices       IDE     :   、Action  、        。 
IOTAActionServices           :  、  、        。 
IOTACodeCompletionServices            ,                 。 
IOTADebuggerServices           。 
IOTAEditorServices                     。 
IOTAKeyBindingServices                。 
IOTAKeyboardServices              。 
IOTAKeyboardDiagnostics        。 
IOTAMessageServices         (Message View)   。 
IOTAModuleServices             。 
IOTAPackageServices                  。 
IOTAServices       。 
IOTAToDoServices     To-Do     ,         To-Do     。 
IOTAToolsFilter           (Tools Filter Notifiers)。 
IOTAWizardServices         。 

       ,   SysUtils         Supports   BorlandIDEServices           。  : 
procedure set_keystroke_debugging(debugging: Boolean); 
var 
  diag: IOTAKeyboardDiagnostics 
begin 
  if Supports(BorlandIDEServices, IOTAKeyboardDiagnostics, diag) then 
    diag.KeyTracing := debugging; 
end; 
 
                  ,                            。 
          Tools API               : 
     IDE   
      
       

7、     IDE   
         IDE    、   、Action       。( :IDE             Tools API   。) 
 IDE        INTAServices     ,                   ,  Action Action  ,         ,           。      Action          。        ,                ,                  ,                              。 
                : 
           
   Action Action   
         
      IDE    TMainMenu、TActionList、TImageList TToolBar  ,                   。              IDE              ,        。                    ,           。 
8、           
                   ,                         。             IDE     ,                Action   ,                。       (Image Editor)      16X16         ,                  : 
constructor MyWizard.Create; 
var 
  Services: INTAServices; 
  Bmp: TBitmap; 
  ImageIndex: Integer; 
begin 
  inherited; 
  Supports(BorlandIDEServices, INTAServices, Services); 
  { Add an image to the image list. } 
  Bmp := TBitmap.Create; 
  Bmp.LoadFromResourceName(HInstance, 'Bitmap1'); 
  ImageIndex := Services.AddMasked(Bmp, Bmp.TransparentColor,  
                                  'Tempest Software.intro wizard image'); 
  Bmp.Free; 
end; 
 
                  ID     。                   。          ,                。 
9、   Action Action   
                           Action,    。    OnExecute OnUpdate  。           OnUpdate        Action,   OnUpdate        ,                ,IDE      。Action OnExecute        Execute  。                    ,        OnExecute    Execute  。 
NewAction := TAction.Create(nil); 
NewAction.ActionList := Services.ActionList; 
NewAction.Caption    := GetMenuText(); 
NewAction.Hint       := 'Display a silly dialog box'; 
NewAction.ImageIndex := ImageIndex; 
NewAction.OnUpdate   := action_update; 
NewAction.OnExecute  := action_execute;  

         Action       Action。                              。       View  ,                   View   。(  ,             :                        。  ,     Delphi            。                       。              。) 
for I := 0 to Services.MainMenu.Items.Count - 1 do 
begin 
  with Services.MainMenu.Items[I] do 
  begin 
    if CompareText(Name, 'ViewsMenu') = 0 then 
    begin 
      NewItem := TMenuItem.Create(nil); 
      NewItem.Action := NewAction; 
      Insert(0, NewItem); 
    end; 
  end; 
end; 
 
  Actoin IDE Action    ,               Action 。      Action              。                 :            Action          OnClick         。          ,               Action      ,      。 
10、         
                   ,       CM_CONTROLCHANGE  。               ,                (     )。        ,       Action    ,             IDE ActionList MainMenu   。 
procedure remove_action (Action: TAction; ToolBar: TToolBar); 
var 
  I: Integer; 
  Btn: TToolButton; 
begin 
  for I := ToolBar.ButtonCount - 1 downto 0 do 
  begin 
    Btn := ToolBar.Buttons[I]; 
    if Btn.Action = Action then 
    begin 
      { Remove "Btn" from "ToolBar" } 
      ToolBar.Perform(CM_CONTROLCHANGE, WPARAM(Btn), 0); 
      Btn.Free; 
    end; 
  end; 
end; 
destructor MyWizard.Destroy; 
var 
  Services: INTAServices; 
  Btn: TToolButton; 
begin 
  Supports(BorlandIDEServices, INTAServices, Services); 
  { Check all the toolbars, and remove any buttons that use this action. } 
  remove_action(NewAction, Services.ToolBar[sCustomToolBar]); 
  remove_action(NewAction, Services.ToolBar[sDesktopToolBar]); 
  remove_action(NewAction, Services.ToolBar[sStandardToolBar]); 
  remove_action(NewAction, Services.ToolBar[sDebugToolBar]); 
  remove_action(NewAction, Services.ToolBar[sViewToolBar]); 
  remove_action(NewAction, Services.ToolBar[sInternetToolBar]); 
  NewItem.Free; 
  NewAction.Free; 
end;  

11、      
Tools API      IDE              。  ,           ,                 。 
     Tools API     ,           IDE   ,                            ,              。           ,        Delphi   ,        “Run|Parameters…”                 Delphi     (delphi32.exe)  。 
             ,      。      ,       “Run|Run”,           Delphi   。      ,       “Components|Install Package…”          。     Delphi     ,              ,                     。(    ,                 ;         ;                  .bpl         。) 
     ,       VCL、CLX RTL   ,                ,           ,     。 
12、       
             ,  IOTAMessageServices,                      ,  IOTAMessageServices50,       IOTAMessageServices40。                   Delphi         。 
Tools API  COM     ,      GUID      。                    ,Tools API                 。    GUID            ,            GUID。    GUID          。 
Tools API                   。            ,          Tools API          : Borland             。 
    IDE     ,             。                ,                。 
             ,                       ,             ,              。 
        ,Delphi 6         :    。  ,                   。                ,        IOTAMessageServices   ,            IOTAMessageServices50(     5)。  IOTAMessageServices GUID   IOTAMessageServices50 GUID  ,             。 
IOTAIDENotifier               。Delphi 5     overload  :AfterCompile BeforeCompile。    IOTAIDENotifer          ,          ,         ,     IOTAIDENotifier50          。Delphi 6               ,          IOTAIDENotifier50。 
                        。          Delphi         ,             。 
13、            
  Tools API           。        IOTAModule,                     。  ,                     (Unit)。               ,            ,     (.pas)   (.dfm .xfm)  。        IDE     ,                       ,               。 
                     : 
        
         
14、        
       ,       (IOTAModuleServices)  。                   ,                 ,                 。 
         ,        ,    、       。                                     。  ,                 : 
{ Return the current project group, or nil if there is no project group. } 
function CurrentProjectGroup: IOTAProjectGroup; 
var 
  I: Integer; 
  Svc: IOTAModuleServices; 
  Module: IOTAModule; 
begin 
  Supports(BorlandIDEServices, IOTAModuleServices, Svc); 
  for I := 0 to Svc.ModuleCount - 1 do 
  begin 
    Module := Svc.Modules[I]; 
    if Supports(Module, IOTAProjectGroup, Result) then 
      Exit; 
  end; 
  Result := nil; 
end;  

15、         
                。            ,       (.pas)         (.dfm)  。          IOTAEditor  ,                                    。  ,                ,      : 
{ Return the form editor for a module, or nil if the unit has no form. } 
function GetFormEditor(Module: IOTAModule): IOTAFormEditor; 
var 
  I: Integer; 
  Editor: IOTAEditor; 
begin 
  for I := 0 to Module.ModuleFileCount - 1 do 
  begin 
    Editor := Module.ModuleFileEditors[I]; 
    if Supports(Editor, IOTAFormEditor, Result) then 
      Exit; 
  end; 
  Result := nil; 
end;  

                   。                      ,     、  、  、                   ,                   。 
         ,              。     (          )       IOTAComponent  。                 。           ,    IOTAComponent     INTAComponent。                TComponent  。               Class            ,  TFont   ,     NTA          。 
16、         
Delphi                ,            。    (Object Repository)                  ,            ,       。                            。 
                   。  ,        、      ,        ,          ,IDE          。       (Creator)         。 
           IOTACreator      。                 CreateModule  ,IDE                     。 
  ,                 GetExisting   False,    GetUnnamed   True。              (                   )              (                      )。           IDE            (    、     )、               、               。                          ,             。 
       ,                       。     ,        IOTAFile     。                   ,         IOTAFile        nil。 
  ,                          ,               ,                        。      ,                          。 
                      。            、           ,   Tools API                    。  GetCreatorType     Tools API           :      。     ,  sUnit,     ,  sForm。      ,                        ,                 ,  GetCreatorType         。  ,  NewImplSource  NewIntfSource             。 
TCreator = class(TInterfacedObject, IOTAModuleCreator) 
public 
  constructor Create(const CreatorType: string); 
  { IOTAModuleCreator } 
  function GetAncestorName: string; 
  function GetImplFileName: string; 
  function GetIntfFileName: string; 
  function GetFormName: string; 
  function GetMainForm: Boolean; 
  function GetShowForm: Boolean; 
  function GetShowSource: Boolean; 
  function NewFormFile(const FormIdent, AncestorIdent: string): IOTAFile; 
  function NewImplSource(const ModuleIdent, FormIdent, AncestorIdent: string): IOTAFile; 
  function NewIntfSource(const ModuleIdent, FormIdent, AncestorIdent: string): IOTAFile; 
  procedure FormCreated(const FormEditor: IOTAFormEditor); 
  { IOTACreator } 
  function GetCreatorType: string; 
  function GetExisting: Boolean; 
  function GetFileSystem: string; 
  function GetOwner: IOTAModule; 
  function GetUnnamed: Boolean; 
private 
  FCreatorType: string; 
end; 
 
TCreator        0、nil     。Boolean       True,  GetExisting,    False。       GetOwner,                  ,         nil。                      。    ,GetOwner           ,         ,            ,  GetOwner            。  ,                ,            nil。 
function TCreator.GetOwner: IOTAModule; 
var 
  I: Integer; 
  Svc: IOTAModuleServices; 
  Module: IOTAModule; 
  Project: IOTAProject; 
  Group: IOTAProjectGroup; 
begin 
  { Return the current project. } 
  Supports(BorlandIDEServices, IOTAModuleServices, Svc); 
  Result := nil; 
  for I := 0 to Svc.ModuleCount - 1 do 
  begin 
    Module := Svc.Modules[I]; 
    if Supports(Module, IOTAProject, Project) then 
    begin 
      { Remember the first project module} 
      if Result = nil then 
        Result := Project; 
    end 
    else if Supports(Module, IOTAProjectGroup, Group) then 
    begin 
      { Found the project group, so return its active project} 
      Result := Group.ActiveProject; 
      Exit; 
    end; 
  end; 
end;  

    NewFormSource   nil,            。        NewImplSource NewIntfSource,       IOTAFile             。 
TFile    IOTAFile  ,   -1       (          ),            。    TFile ,            ,TFile        。 
TFile = class(TInterfacedObject, IOTAFile) 
public 
  constructor Create(const Source: string); 
  function GetSource: string; 
  function GetAge: TDateTime; 
private 
  FSource: string; 
end; 
constructor TFile.Create(const Source: string); 
begin 
  FSource := Source; 
end; 
  function TFile.GetSource: string; 
begin 
  Result := FSource; 
end; 
  function TFile.GetAge: TDateTime; 
begin 
  Result := TDateTime(-1); 
end;  

            ,          ,         ,                  。           ,        。                  :  FormIdent,     ,         ,          。             IDE       (            ),                。 
function TCreator.NewImplSource( 
                    const ModuleIdent, FormIdent, AncestorIdent: string): IOTAFile; 
var 
  FormSource: string; 
begin 
  FormSource :=  
  '{ ----------------------------------------------------------------- ' +   #13#10 +  
  '%s - description'+   #13#10 +  
  'Copyright © %y Your company, inc.'+   #13#10 + 
  'Created on %d'+   #13#10 +  
  'By %u'+   #13#10 + 
  ' ----------------------------------------------------------------- }' +   #13#10 +   #13#10; 
  return TFile.Create(Format(FormSource, ModuleIdent, FormIdent, 
                         AncestorIdent)); 
}  

             :    sUnit     ,     sForm。          ,      INTAServices       File|New          。    OnClieck           Execute  。 
              ,    IDE      。  ,                ,   IDE             Check In   ,                       。 
17、 IDE        
                        IDE       。   ,                            ,       。     ,         ,               。 
                   。           ,    Tools API       ,          ,IDE     。 
            IOTANotifier,            ,  IOTANotifier          。             ,                。 

      
       
IOTANotifier             
IOTABreakpointNotifier                 
IOTADebuggerNotifier             ,   /     
IOTAEditLineNotifier                  
IOTAEditorNotifier            ,           
IOTAFormNotifier      ,            (     ) 
IOTAIDENotifier      ,   ,       IDE   
IOTAMessageNotifier                 (   ) 
IOTAModuleNotifier    、         
IOTAProcessModNotifier              
IOTAProcessNotifier                  
IOTAThreadNotifier               
IOTAToolsFilterNotifier          
 

          ,                  。           ,                       。              ,                      。      ,                      ,          。 
      ,          。    CreateModule       ,            。           ,           ,                ,        ,AfterSave            。      ModuleRenamed,                IDE     。           : 
TModuleIdentifier = class(TNotifierObject, IOTAModuleNotifier) 
public 
  constructor Create(const Module: IOTAModule); 
  destructor Destroy; override; 
  function CheckOverwrite: Boolean; 
  procedure ModuleRenamed(const NewName: string); 
  procedure Destroyed; 
private 
  FModule: IOTAModule; 
  FName: string; 
  FIndex: Integer; 
end;  

                         ,            。          ,        ,IDE   Destroyed  。  ,                      。IDE           ,                     。  ,            :              。 
constructor TModuleNotifier.Create( const Module: IOTAModule); 
begin 
  FIndex := -1; 
  FModule := Module; 
  { Register this notifier. } 
  FIndex := Module.AddNotifier(self); 
  { Remember the module's old name. } 
  FName := ChangeFileExt(ExtractFileName(Module.FileName), ''); 
end; 
destructor TModuleNotifier.Destroy; 
begin 
  { Unregister the notifier if that hasn't happened already. } 
  if Findex >= 0 then 
    FModule.RemoveNotifier(FIndex); 
end; 
procedure TModuleNotifier.Destroyed; 
begin 
   { The module interface is being destroyed, so clean up the notifier. } 
  if Findex >= 0 then 
  begin 
    { Unregister the notifier. } 
    FModule.RemoveNotifier(FIndex); 
    FIndex := -1; 
  end; 
  FModule := nil; 
end;  

         ,IDE       ModuleRenamed  。               ,             。         ,            。           ,                ,            。 
procedure TModuleNotifier.ModuleRenamed(const NewName: string); 
var 
  ModuleName: string; 
  I: Integer; 
  Editor: IOTAEditor; 
  Buffer: IOTAEditBuffer; 
  Pos: IOTAEditPosition; 
  Check: string; 
begin 
  { Get the module name from the new file name. } 
  ModuleName := ChangeFileExt(ExtractFileName(NewName), ''); 
  for I := 0 to FModule.GetModuleFileCount - 1 do 
  begin 
   { Update every source editor buffer. } 
    Editor := FModule.GetModuleFileEditor(I); 
    if Supports(Editor, IOTAEditBuffer, Buffer) then 
    begin 
      Pos := Buffer.GetEditPosition; 
      { The module name is on line 2 of the comment. 
        Skip leading white space and copy the old module name, 
        to double check we have the right spot. } 
      Pos.Move(2, 1); 
      Pos.MoveCursor(mmSkipWhite or mmSkipRight); 
      Check := Pos.RipText('', rfIncludeNumericChars or rfIncludeAlphaChars); 
      if Check = FName then 
      begin 
        Pos.Delete(Length(Check));    // Delete the old name. 
        Pos.InsertText(ModuleName);   // Insert the new name. 
        FName := ModuleName;          // Remember the new name. 
      end; 
    end; 
  end; 
end;  

                      ?       ,       ,                      。     ,    IOTAEditLineNotifier IOTAEditLineTracker  。 
              ,                       。  ,                   ,       ,                  。         ,        ,IDE    。  ,               ,                   。    ,           ,           Destroyed  ,                           ,                          
     Execute       。          ,              ,                 (TInterfaceList)。 
procedure DocWizard.Execute; 
var 
  Svc: IOTAModuleServices; 
  Module: IOTAModule; 
  Notifier: IOTAModuleNotifier; 
begin 
  { Return the current project. } 
  Supports(BorlandIDEServices, IOTAModuleServices, Svc); 
  Module := Svc.CreateModule(TCreator.Create(creator_type)); 
  Notifier := TModuleNotifier.Create(Module); 
  list.Add(Notifier); 
end; 
 
                          。                    ,  IDE         。     IDE                 。      ,                       。        ,                      。 
destructor DocWizard.Destroy; override; 
var 
  Notifier: IOTAModuleNotifier; 
  I: Integer; 
begin 
  { Unregister all the notifiers in the list. } 
  for I := list.Count - 1 downto 0 do 
  begin 
    Supports(list.Items[I], IOTANotifier, Notifier); 
    { Pretend the associated object has been destroyed. 
      That convinces the notifier to clean itself up. } 
    Notifier.Destroyed; 
    list.Delete(I); 
  end; 
  list.Free; 
  FItem.Free; 
end; 
 
             、               。 

좋은 웹페이지 즐겨찾기