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.
浙公网安备 33010602011771号