Delphi中通过CreateObject创建的 COM 对象如何获取事件

转载请注明出处:http://blog.csdn.net/jh_zzz/archive/2006/12/21/1451693.aspx

QQ 群中有人提到这个问题,我到网上搜了一下,居然没有找到相关的文章,后来在台湾一个bbs上发现了一个工具,在此以 MS Agent Control 为例和大家分享一下具体的做法。

1. Delphi Event Sink Generator 下载地址:http://www.techvanguards.com/products/eventsinkimp/

2. 安装后会在开始菜单生成新的程序组,运行EventSinkImp,这里我选了 Microsoft Agent Control (version 2.0),设置好Output folder,点Import(如果出现错误就点Option,然后设置一下tlibimp.exe的位置,在delphi安装目录的bin下):

3. 程序会生成两个.pas文件,运行delphi点Component->Install Component,分别安装这两个组件,默认会安装在ActiveX栏

4. 假设我们要对Agent控件Click事件进行编程,一般情况下我们就从组件面板中选择Agent组件,在当前设计窗口上放一个,然后像其他控件一样添加OnClick事件代码

5. 但是如果这个对象是用CreateObject创建的,这样做就不行了,这样写编译都通不过:

var
  agtobj : OleVariant;
begin
  agtobj := CreateOleObject('Agent.Control.2');
  agtobj.Click := AgentObjectsAgentEvents1Click;

6. 别忘了刚才是生成了两个组件,从ActiveX组件面板中选择刚才的AgentObjectsAgentEvents,放一个到当前的设计窗口上

7. 编写代码创建 MS Agent 对象:

agtobj := CreateOleObject('Agent.Control.2');
if not VarIsEmpty(agtobj) then
begin
  agtobj.Connected := True;
  agtobj.Characters.Load('Merlin', 'Merlin.acs');
  agtobj.Characters.Character('Merlin').Show(False);
end;

8. 创建与MS Agent对象的连接:

AgentObjectsAgentEvents1.Connect(agtobj);
ShowMessage('Now click on the agent will get inform');

9. 现在方便了,像其他控件一样对AgentObjectsAgentEvents的Click事件编写代码就行了:

procedure TForm1.AgentObjectsAgentEvents1Click(Sender: TObject;
  const CharacterID: WideString; Button, Shift, x, y: Smallint);
begin
  ShowMessage('Get Click');
end;


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
可以使用以下代码创建对象的工具类: ```java import java.lang.reflect.Constructor; import java.lang.reflect.InvocationTargetException; public class ReflectionUtil { /** * 通过类名创建对象 * @param className 类名 * @return 创建对象 */ public static Object createObject(String className) throws ClassNotFoundException, IllegalAccessException, InstantiationException { Class<?> clazz = Class.forName(className); return clazz.newInstance(); } /** * 通过类名和构造函数参数创建对象 * @param className 类名 * @param args 构造函数参数 * @return 创建对象 */ public static Object createObject(String className, Object... args) throws ClassNotFoundException, NoSuchMethodException, IllegalAccessException, InvocationTargetException, InstantiationException { Class<?> clazz = Class.forName(className); Class<?>[] parameterTypes = new Class[args.length]; for (int i = 0; i < args.length; i++) { parameterTypes[i] = args[i].getClass(); } Constructor<?> constructor = clazz.getConstructor(parameterTypes); return constructor.newInstance(args); } } ``` 其,`createObject(String className)` 方法通过类名创建对象,`createObject(String className, Object... args)` 方法通过类名和构造函数参数创建对象。使用时,只需要传入类名和参数即可。注意,如果类的构造函数是私有的,需要使用 `getDeclaredConstructor()` 方法获取构造函数,并设置 `setAccessible(true)` 来允许访问私有构造函数。
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值