RTX客户端插件开发 for Delphi XE6 (二)
来源:互联网 发布:网络与新媒体专业大学 编辑:程序博客网 时间:2024/06/05 23:08
添加菜单
前面讲了怎么编写一个空的插件, 这里我们实现一些功能, 给<常用联系人>右键添加一个子菜单项, 这里我们需要继承IRTXCUICommand在这里我做了另外的调整重新封装了下,
使用上更习惯Delphi的事件方式.
初始化需要在OnLoad事件中定义, 反向初始化为OnUnload. 首先我们需要在OnLoad中获得IRTXCModuleSite接口, 再通过IRTXCModuleSite获取IRTXCRoot接口, 继续通过
IRTXCRoot接口中的Module方法获取一个标识为RTX_MODULE_IDENTIFIER_CLIENT_OBJS的IClientObjectsModule接口, 再继续通过IClientObjectsModule接口中Object_属性获取一个名为RTX_CLIENT_OBJECTS_IDENTIFIER_MENU的IRTXCMenu接口, 经过以上几步就拿到了菜单接口了, 接口拿到后就可以使用AddItem向菜单中添加子项了
例如 :
LMenu.AddItem(False, -1, RTXC_UI_TYPE_MYCONTACTS_USERDEFINEDGROUP_USER, MENU_INDEX1, FMenuSink, 'Delphi菜单常用联系人', '', RTXC_MENU_ITEM_SEPARATOR_ABOVE_AND_BELOW, 6, False);
菜单添加好后还要有点击事件及设置菜单状态, 这两个都可以在
OnInvoke和OnQueryState中完成, 这里就不进行祥细的说明了, 具体可以参考原c++ demo,
最后记得在OnUnload中删除添加的菜单.
开源地址: http://git.oschina.net/ying32/RTXCPluginForDelphiSDK/
下面为本次插件中主要代码:
//***************************************************************************//// 名称:RTXC.Plugin.pas// 工具:RAD Studio XE6// 日期:2014/11/8 15:11:21// 作者:ying32// QQ :1444386932////---------------------------------------------------------------------------//// 备注:RTX客户端插件类//// 本代码为RTXCMakeTemplate自动生成////***************************************************************************unit RTXC.Plugin;{$WARN SYMBOL_PLATFORM OFF}interfaceuses Windows, ComObj, Comserv, Variants, SysUtils, RTXCMenuDemoPluginLib_TLB, RTXCAPILib_TLB, CLIENTOBJECTSLib_TLB, RTXCModulEinterfaceLib_TLB, RTXC.Event, StdVcl;type TRTXCMenuDemoPlugin = class sealed(TAutoObject, IRTXCModule, IRTXCPlugin) private FRTXRoot: IRTXCRoot; FRTXModuleSite: IRTXCModuleSite; FClientObjectsModule: IClientObjectsModule; FMenuSink: TRTXCUICommand; function getClassNoT: string; inline; function GetClientObjsModule: IClientObjectsModule; protected /// <remarks> /// 接口部分实现 /// </remarks> function Get_Identifier: WideString; safecall; function Get_ModuleSite: IDispatch; safecall; function Get_Name: WideString; safecall; function OnInvoke(Receiver, Parameter, Extra: OleVariant): OleVariant; safecall; procedure OnAccountChange; safecall; procedure OnLoad(const RTXCModuleSite: IDispatch); safecall; procedure OnUnload(Reason: RTXC_MODULE_UNLOAD_REASON); safecall; function Get_Info(Field: RTXC_PLUGIN_INFO_FIELD): WideString; safecall; public function GetModuleObject<T>(const Identifier: string): T; procedure SendMessage(const Receiver, ATitle, AMsg: string); // 菜单相关的两个事件 procedure MenuOnInvoke(UIType: RTXC_UI_TYPE; Id: Integer; Parameter: OleVariant); // MenuOnQueryState函数中Text的参数一定要是var, 自动生成的接口文件中为out,这样会直接 // 造成菜单添加后不会显示文字, 源于out与var关键字的区别 procedure MenuOnQueryState(UIType: RTXC_UI_TYPE; Id: Integer; Parameter: OleVariant; var Text: WideString; var State: RTXC_UI_ITEM_STATE); public property RTXRoot: IRTXCRoot read FRTXRoot; property RTXModuleSite: IRTXCModuleSite read FRTXModuleSite; property ClientObjectsModule: IClientObjectsModule read FClientObjectsModule; end;implementationuses RTXC.Consts;const MENU_INDEX1 = 111;{ TRTXCMenuDemoPlugin }function TRTXCMenuDemoPlugin.Get_Identifier: WideString;begin Result := getClassNoT;end;function TRTXCMenuDemoPlugin.Get_Info(Field: RTXC_PLUGIN_INFO_FIELD): WideString;begin Result := '一个使用Delphi开发的RTX插件Demo';end;function TRTXCMenuDemoPlugin.Get_ModuleSite: IDispatch;begin Result := FRTXModuleSite;end;function TRTXCMenuDemoPlugin.Get_Name: WideString;begin Result := 'Delphi菜单插件Demo';end;procedure TRTXCMenuDemoPlugin.MenuOnInvoke(UIType: RTXC_UI_TYPE; Id: Integer; Parameter: OleVariant);begin case Id of MENU_INDEX1 : begin MessageBox(0, '消息了', '消息', MB_OK); // 添加的菜单调用事件 end; end;end;procedure TRTXCMenuDemoPlugin.MenuOnQueryState(UIType: RTXC_UI_TYPE; Id: Integer; Parameter: OleVariant; var Text: WideString; var State: RTXC_UI_ITEM_STATE);begin case Id of MENU_INDEX1 : begin // 菜单的状态 end; end;end; procedure TRTXCMenuDemoPlugin.OnAccountChange;beginend;function TRTXCMenuDemoPlugin.OnInvoke(Receiver, Parameter, Extra: OleVariant): OleVariant;begin Result := null;;end;procedure TRTXCMenuDemoPlugin.OnLoad(const RTXCModuleSite: IDispatch);var LMenu: IRTXCMenu;begin FMenuSink := TRTXCUICommand.Create; FMenuSink.OnInvoke_ := MenuOnInvoke; FMenuSink.OnQueryState_ := MenuOnQueryState; if RTXCModuleSite = nil then begin FRTXRoot := nil; FRTXModuleSite := nil; Exit; end; FRTXModuleSite := RTXCModuleSite as IRTXCModuleSite; FRTXRoot := FRTXModuleSite.RTXCRoot; FClientObjectsModule := GetClientObjsModule; LMenu := GetModuleObject<IRTXCMenu>(RTX_CLIENT_OBJECTS_IDENTIFIER_MENU); LMenu.AddItem(False, -1, RTXC_UI_TYPE_MYCONTACTS_USERDEFINEDGROUP_USER, MENU_INDEX1, FMenuSink, 'Delphi菜单常用联系人', '', RTXC_MENU_ITEM_SEPARATOR_ABOVE_AND_BELOW, 6, False);end;procedure TRTXCMenuDemoPlugin.OnUnload(Reason: RTXC_MODULE_UNLOAD_REASON);var LMenu: IRTXCMenu;begin LMenu := GetModuleObject<IRTXCMenu>(RTX_CLIENT_OBJECTS_IDENTIFIER_MENU); LMenu.DelItem(RTXC_UI_TYPE_MYCONTACTS_USERDEFINEDGROUP_USER, MENU_INDEX1, FMenuSink); FMenuSink.Free;end; function TRTXCMenuDemoPlugin.getClassNoT: string;begin Result := ToString; Delete(Result, 1, 1);end;function TRTXCMenuDemoPlugin.GetModuleObject<T>(const Identifier: string): T;type PT = ^T;var Obj: Cardinal;begin Obj := Cardinal(Pointer(FClientObjectsModule.Object_[Identifier])); Result := PT(@Obj)^;end;function TRTXCMenuDemoPlugin.GetClientObjsModule: IClientObjectsModule;begin Result := FRTXRoot.Module[RTX_MODULE_IDENTIFIER_CLIENT_OBJS] as IClientObjectsModule;end;procedure TRTXCMenuDemoPlugin.SendMessage(const Receiver, ATitle, AMsg: string);var LData: IRTXCData;begin try LData := FRTXRoot.CreateRTXCData; LData.SetString(RDK_KEY, GUIDToString(TGuid.NewGuid)); LData.SetString(RDK_TITLE, ATitle); LData.SetString(RDK_MSG_CONTENT, AMsg); RTXModuleSite.SendData(Receiver, LData, RTXC_SEND_DATA_FLAG_FILTERING_IS_FORBIDDEN); except end;end; initialization TAutoObjectFactory.Create(ComServer, TRTXCMenuDemoPlugin, CLASS_RTXCMenuDemoPlugin, ciMultiInstance, tmApartment);end.
0 0
- RTX客户端插件开发 for Delphi XE6 (二)
- RTX客户端插件开发 for Delphi XE6 (一)
- Rtx 手机客户端开发
- Delphi XE6 for Android 让手机震动
- Delphi XE6 for Android 官方资源
- Delphi XE6 for Android 用户界面例子
- 插件管理框架 for Delphi(二)
- Delphi XE6 安装flash插件步骤,给新手们看
- VC++开发RTX拨打电话插件
- Delphi xe6 学习过程
- delphi xe6 拨打电话
- Notepad++ 插件for Delphi
- Cordova for iOS-插件开发(二)
- DSPack for Xe6
- Delphi XE6 for Android 我的第一个安卓程序,环境搭建
- Delphi XE6 原生解析json
- Delphi XE6 String转MemoryStream
- DELPHI XE6调用JAVA WEBSERVICE
- VC++编程中为程序加入启动画面功能
- 大学毕业一年多,对互联网创业的思考
- java.lang.IllegalStateException: getOutputStream() has already been called for this response
- Jquery中$.ajax $.post load用法与区别
- UbuntuServer12.04安装MongoDB,开机自启,服务,权限
- RTX客户端插件开发 for Delphi XE6 (二)
- 日语学习之沪江N4基础 20141122 -4
- RTSP流媒体转发服务器源码
- Android ART运行时与Dalvik虚拟机
- 后序和中序建立二叉树或者先序和中序建立二叉树
- 第十三周 项目五:字符串操作(2.3)
- Java笔记005_Multiple markers at this line - key cannot be resolved to a variable - Syntax error, ins
- 第十三周项目一——数组大折腾(5)
- 一些网址收藏