DelPhiIDE嵌入程序

unit UTestMenu;

interface
uses SysUtils, Classes,Menus,ToolsApi,Controls,ImgList,Graphics,
     Forms,ComCtrls,windows;

type
  TMyIDE = class
    Private
      FMainMenu:TMainMenu;
      NewMenu:TMenuItem;
      FImageList:TCustomImageList;
      Imageindex1 : integer;
      IDEHandle:HWND;
    Protected
      Procedure AddMenu;
      Procedure RemoveMenu;
      Procedure RecodeEditer(Sender:Tobject);
      procedure AboutForm(sender:Tobject);
    public
      constructor create;
      destructor  destory;

  end;

  procedure Register;

var
  MyIDE :TMyIDE;

implementation

{ TMyIDE }

procedure Register;
begin
  MyIDE.AddMenu;
end;

procedure TMyIDE.AboutForm(sender: Tobject);
begin
  messagebox(IDEHandle,'This is a test of OTA write by hk.barton','hkTest',MB_ICONINFORMATION);
end;

procedure TMyIDE.AddMenu;
var
 MenuItem:array [0..2] of TMenuItem;
 i:integer;
 Icon1:TIcon;//菜单项一的图标
begin
  FMainMenu:=(BorlandIDEServices as INTAServices).MainMenu;
  //我们用 INTAServices的MainMenu属性直接得到了IDE的主菜单
  FImageList:=(BorlandIDEServices as INTAServices).ImageList;
  //我们用 INTAServices的ImageList属性直接得到了IDE的图象列表
  NewMenu:=TMenuItem.Create(FMainMenu);
  //创建我们的菜单
  NewMenu.Caption:='hk.barton';
  ImageIndex1:=-1;//没有载入图标
  //下面的代码使用for和case来添加两个菜单项有点小题大作,但
  //我们展示了一种更通用的方法使你能够添加更多的菜单项,而不必简单的复制代码。
  for i:=0 to 2 do
  begin
   MenuItem[i]:=TMenuItem.Create(NewMenu);//创建子菜单项
   case i of
     0:
     begin
      MenuItem[i].Caption:='InsertText';
      Icon1:=TIcon.Create;
      try
       Icon1.LoadFromFile('D:\oracle\ora90\BIN\vai.ico');
       //我从硬盘的文件上载入了一个图标作为菜单项一的图标
      except
       On E:Exception do
       begin
        raise Exception.Create(E.Message);
        exit;
       end;
      end;
      ImageIndex1:=FImageList.AddIcon(Icon1);
      //加入那个载入的图标并返回一个ImageIndex
      MenuItem[i].ImageIndex:=ImageIndex1;
      MenuItem[i].OnClick:=ReCodeEditer;//添加事件处理程序
     end;
     1:MenuItem[i].Caption:='-';//当然还有一个分割符号,其实是3个菜单项
     2:
     begin
      MenuItem[i].Caption:='About';
      MenuItem[i].OnClick:=AboutForm;
     end;
   end;
   NewMenu.Add(MenuItem[i]);//添加菜单项
  end;
  FMainMenu.Items.Add(NewMenu);//最后添加我们的菜单到IDE主菜单
end;

constructor TMyIDE.create;
begin
  //通过IOTAServices 接口的 GetParentHandle方法取得IDE的handle;
  IDEHandle:=(BorlandIDEServices as IOTAServices).GetParentHandle;
 // MyIDE := TMyIDE.create;
end;

destructor TMyIDE.destory;
begin
  MyIDE.ReMoveMenu;
 if ImageIndex1<>-1 then
 //如果在前面加载图标的工作出现异常就不释放图标,否则会释放到delphi本身使用的图标
  MyIDE.FImageList.Delete(MyIDE.ImageIndex1);
  inherited;
end;

procedure TMyIDE.RecodeEditer(Sender: Tobject);
var
 Module:IOTAModuleServices;
 CurentMoudle: IOTAModule;
 IntfEditor:IOTAEditor;
 Editor:IOTASourceEditor;
 EditView:IOTAEditView;
 EditWriterPos:IOTAEditPosition;
 i:integer;
begin
 Module:=BorlandIDEServices as IOTAModuleServices;
 CurentMoudle:=Module.CurrentModule;
 //使用IOTAModuleServices的CurrentModule方法得到当前打开的工程模块
 if CurentMoudle=nil then
 begin
  messagebox(IDEHandle,'当前没有打开项目文件','hkTest',MB_ICONINFORMATION);
  exit;
 end;
 //遍历已打开工程中所有的文件
 for i:=0 to CurentMoudle.ModuleFileCount-1 do
 begin
  IntfEditor:=CurentMoudle.ModuleFileEditors[i];
  //IOTAModule的ModuleFileEditors[]属性得到一个IOTAEditor
  if IntfEditor.QueryInterface(IOTASourceEditor,Editor)=S_OK then
  //查看遍历到的文件是否是代码文件并已开始在代码编辑器中编辑。
  //如果是便通过一个out参数Editor得到一个实现IOTASourceEditor的实例
   break;
 end;
 if Editor=nil then
 begin
  messagebox(IDEHandle,'当前没有代码编辑窗口','hkTest',MB_ICONINFORMATION);
  exit;
 end;
 EditView:=Editor.EditViews[i];
 //使用IOTASourceEditor的 EditViews[]属性得到一个IOTAEditView
 EditWriterPos:=EditView.Position;
 //使用IOTAEditView的Position属性最终得到一个IOTAEditPosition
 EditWriterPos.InsertText('{///  This is add by the OTATest of hk.barton,enjoy days!  ///}');
 //IOTAEditPosition的InsertText方法向当前光标位置插入一行代码,这里是一行注释。

end;

procedure TMyIDE.RemoveMenu;
begin
  if assigned(NewMenu) then
   NewMenu.Free;
end;

initialization
 MyIDE:=TMyIDE.Create;

finalization
  MyIDE.Free;

end.

posted on 2004-08-13 20:14  Null  阅读(628)  评论(0)    收藏  举报