事件、接口、类---对象数组

来源:互联网 发布:ida pro mac 破解版 编辑:程序博客网 时间:2024/06/04 01:08

VB6 给对象数组如何定义事件?

http://www.cnblogs.com/raylynn/archive/2007/01/29/632978.html

在编程的过程中,可以对一级有的类使用WithEvents关键字。 WithEvents,是在声明对象变量时,表明还希望使用该对象引发的事件。使得,就像窗体上的控件那样还可以再使用对象变量,不同之处在于此为类的应用。

Private WithEvents myObject As SomeClass

同理,也可以把对象变量存放在数组里。当希望简洁地管理多个对象,可以靠数组遍历或者数组下标定位的方法来实现。

Private myObjects() As SomeClass

现在的问题是,将二者结合起来去处理将要发生事情(事件)。也就是既要把对象与待处理事件联系起来,又要和数组联系起来,并根据这许多的对象实例去处理事件。试试这个:

Private WithEvents myObjects() As SomeClass

而且,VB还会给出有用的信息,错误提示和之所以是错误

现在,真的,为什么你不能一个对象数组上使用WITHEVENTS的原因很简单 -如果你有一个单一的事件处理程序的每个对象,你就没有办法知道哪个对象触发事件。你可能已经注意到,事件处理程序控件的控件数组的一部分,将有一个额外的指标参数 -这是因为控件数组是​​COM的前几天发明,它需要一些公平黑客对微软的一部分,Index属性添加到在COM系统控制的事件。同样的黑客无法为对象数组做,因为对象不具有指数特性 - 阵列只需持有引用的每个对象。

文章到此,还不能把一个对象数组用在WithEvents的原因是:假如每个对象只需要处理单独一个事件,还不知道要让哪个对象触发事件。我们注意到,事件在处理控件数组时有一个额外的Index参数。这是因为控件数组出现时还没有COM,而为了控制事件它要求直接访问Index属性。可惜对象数组做不了这事,因为对象数组没有Index属性。对于每个对象,数组只是保持简单的引用。

就此打住吗?不,还是有解决方案的。它听起来复杂,但在现实中(你会看到它的一个例子),它不是太难。以下提供两种解决方案:一方面为自己创建类,另一方面是那些不晓得的来源。

先从容易入手,假设知道了来源。于是,先脱开这所有的事件 -因为这时还不能用它们。暂且代之以RaiseEvent的调用,即调用待处理类\窗体的事件命名的方法,它将形成新的事件处理程序。接下来是处理第一个潜在的问题:刚刚提到的方法可能不存在。为了保证方案可行,不得不要求一个处理类/窗体Implements的事件,它是一个接口类。该类定义了我们所有的活动和他们的参数。实现接口意味着类/窗体必须包含所有的事件处理方法,以保证能消除在真正要触发一个事件时而所需要的事件却不存在的所有可能性。

0 0
原创粉丝点击