当控件第一次被放入窗体时,它会发生3个事件:Initialize\InitProperties\Resize,而不会发生ReadProperties事件;当被删除时会发生两个事件:WriteProperties\Terminate;当运行时会发生设计时实例的WriteProperties(如果改动一些属性的话)\Terminate,而后发生运行时实例的Initialize\Resize\ReadProperties;当停止运行进会发生Terminate\Initialize\Resize\ReadProperties\WriteProperties事件。
关于ActiveX控件的关键事件:Initialize,initproperties,readproperties,Writeproerties,terminate。这5个事件,分别是初始化事件;读取缺省属性事件——这个事件仅仅当把控件放入窗体时才发生;读取属性事件——相当于窗体的Load事件,它是从保存这个控件的窗体中读取它的属性设置;写入属性事件——相当于窗体的unload事件,这个事件让这个控件把属性存入它所在的窗体文件.frm中;撤消事件。一个控件当在设计时被加入窗体时会产生一个设计时实例,因此会有initialize,InitProperties,Resize 事件;当被删除时,会产生writeproperties,terminate事件;当在工具栏中单击保存时,会产生writeproperties事件,当进入运行时由于会先撤消设计时实例,然后在重新建立运行时实例,所以会以次产生写入,撤消,初始化,改变大小,读取,当停止运行时,会产生撤消(撤消运行时实例),初始化(初始化设计时实例),改变大小,读取。当运行时期的 ShapeLabel 实例被撤消时,将看见一个 Terminate事件(但不是 WriteProperties,为什么不是呢?)。运行时期的控件实例永远不会获得 WriteProperties 事件,因为它并不需要保存其属性值。这主要是出于 ShapeLabel 的未来的考虑。当它被编译成 .ocx 文件时,它会被添加到另一个工程,把一个实例放入窗体,将此工程编译成一个 .exe 文件并使其运行。 关闭该 .exe 文件时,ShapeLabel 实例能够保存其属性值的唯一地方就是该 .exe 文件。 而正常运作的操作系统不能容许这类行为。
VB学习心得之ActiveX控件A
ActiveX控件也是一个进程内部件,它可存在于一个独立的控件工程中,这样它可被编译为一个.ocx文件,这样它可被其它的应用程序使用,但如果它被包含在令外一个EXE工程中,并与这工程一起被编译,件。
为控件加入属性的另一个方法是用属性页,它可设计复杂的属性。
要理解属性页的关键是明白属性页与控件之间的关系:它们是两个不同的模块,并不是说属性页的控件的一部分,它们的关系就像是在标准EXE中的两个窗体,并不是说控件的属性可以在属性页中的创建,这个属性的实际创建还是在控件模块中,而在属性页只不过是通过一种连接来改变控件的属性,它对控件属性的改变性质同用户改变的性质是一样的,只不过它是带有综合性的。那么属性页是如何改变控件的属性的呢,那么就是通过一个集合——SelectedControls,这个集合提供了与属性页相连接的所有控件中被开发者选中的控件,它就是通过这个集合对控件进行引用,进而改变它们的属性。在属性页中有两个重要的事件:SelectionChanged\ApplyChanges事件,无论何时打开属性页均接收一个SelectionChanged事件,它用来给属性页中与控件属性有关的值进行初始化,而当单击了属性而选项卡上的“确定”、“应用”按钮或切换到另一个选项卡上时,将发生ApplyChangds事件,它用来设置控件的属性。最后要把属性页连接到某一控件,需要在控件的属性对话框中选择PropertyPages来进行连接。
当测试时,要使控件运行,只要关闭设计器即可。控件设计器打开后测试工程上的控件实例就变成有阴影的,这叫做非活动,关闭设计器后还原,如果在这过程中改变了代码,还原后,要用右键菜单更新控件。
这里需说明一点,只要是在测试工程上加入一个控件,而后没有删除这个控件,又返回到设计器中进行设计,之后关闭设计器,进入运行模式,那么先前那个控件就被撤消后又建,它会重新执行新的代码。
ActiveX控件是依据容器而存在进而工作的,它的实例不能独立存在,必须放在另一个称之为容器的框架中。开发一个控件实质是开发一个控件类。
进测试时与DLL一样可以加入一测试工程它们共同组成一个工程组。
ActiveX控件有两种行为,一种设计时,一种是运行时,设计时——也就是当客户使用这个控件把它加窗体时,这时控件要执行一些代码。运行时——是当加入控件的应用程序运行时控件要执行的代码。
注意:我发现writeproperties事件有时会发生,有时不会发生(在认为该发生的地方),我想可能是和保存过一次再没有改动的情况下在保存时就不做任何保存相类似。
为控件添加属性:同为其它类添加属性一样,也是用属性过程或公共变量,很简单,但在这里涉及到一样保存属性的问题,如何保存,保存在什么地方,因为控件都是加在窗体上的,所以保存的位置当然就是它所属的那个窗体文件了,要保存就要在WriteProperties事件中写入,用propertybag类型的对象propbag的方法WriteProperty来写入,参数为字符串的属性名,存入的值(我的问题:在控件中的任何位置是不是都可访问它自已的公有属性值),缺省值(extender对象的某一属性或其它自己设置的值),同样有保存就有读取,这是一一对应的,如果只有保存没有读取,就起不到任何的作用,要读取就在ReadProperties事件中执行,用propbag的方法readproperty(参数1,参数2)来实现,第一个参数是字符串类型的属性名,第二个属性是一个缺省值。■有个问题不明白:这个读取事件到底什么时候发生,在第一次加入控件时,它发生不发生——具我实验它不发生,如果它发生它中的代码和设置缺省属性事件中的代码不就重复了吗?■