创建一个用户自定义类或子类,并为创建的类或子类指定属性、事件和方法。
语法
DEFINE CLASS ClassName1 AS ParentClass
[OLEPUBLIC]
[[PROTECTED | HIDDEN PropertyName1,
PropertyName2
...]
[Object.]PropertyName =
eExpression ...]
[ADD OBJECT [PROTECTED] ObjectName AS ClassName2
[NOINIT]
[WITH cPropertylist]]...
[[PROTECTED | HIDDEN] FUNCTION | PROCEDURE Name[_ACCESS
| _ASSIGN]
| THIS_ACCESS [NODEFAULT]
cStatements
[ENDFUNC | ENDPROC]]...
ENDDEFINE
参数
ClassName1
指定要创建的类名。
AS ParentClass
指定派生类或子类的父类,父类可以是一个 Visual FoxPro 基类(例如 Form 类)或者是另一个用户自定义的类或子类。
下表列出了 Visual FoxPro 的基类:
基类名
指明当前定义的类将要作为一个用户自定义的 OLE 服务程序 (custom OLEserver)。这个类可以被其他 OLE 客户程序 (OLE client) 访问。
如果一个项目中包含带有 OLEPUBLIC 的类定义,那么,当使用项目管理器(或使用BUILD EXE 或 BUILD DLL 命令)生成 .EXE 或 .DLL 时,.EXE 或 .DLL 文件既自动注册到操作系统中。这时,其他 OLE 客户程序就可使用它了。
有关创建自定义 Automation 服务程序的详细内容,请参阅《Microsoft Visual FoxPro 6.0中文版程序员指南》第十六章“添加 OLE”中的“创建 Automation 服务程序”。
[PROTECTED | HIDDEN PropertyName1, PropertyName2 ...]
PropertyName = eExpression 创建一个类属性或子类属性,并给属性赋默认值。这些属性是类的命名属性,它们为类定义了特性和行为。类和子类可以有多个属性。
可使用“=”为属性赋值。下面示例创建了一个名为 MyClass 的用户自定义类,并创建了两个名为 Name 和 Version 的属性,Name 属性初始化为空字符串,Version 属性初始化为字符串 1.0。
DEFINE CLASS MyClass AS Custom
Name = ''
Version = '1.0'
ENDDEFINE
当用 CREATEOBJECT( ) 函数创建对象后,可以在类或子类的定义之外访问属性:
MyOjbect = CREATEOBJECT('MyClass')
访问属性的语法如下:
ObjectName.Property
在属性名前加 PROTECTED 可以阻止从类定义或子类定义的外部访问和改变这些属性,在类或子类内部定义的方法和事件可以访问被保护属性。
在下面例子中,Version 属性受保护,它禁止在类定义以外访问和修改它。但是,Name 属性不受保护,可以访问和修改它。
DEFINE CLASS MyClass AS Custom
PROTECTED Version
Name = ''
Version = '1.0'
ENDDEFINE
包含 HIDDEN 和属性名称的列表以防止从类定义以外访问和更改属性。只有在类定义中的方法和事件才可以访问隐藏的属性。通过类定义的子类可以被保护的属性,但只有从类定义中才能访问隐藏属性。
ADD OBJECT
从 Visual FoxPro 的一个基类、用户自定义类(子类)或从 OLE 自定义控制向一个类定义或子类定义中添加一个对象。
PROTECTED
禁止从类定义或子类定义的外部访问和修改对象的属性,PROTECTED
关键字必须直接放在 ObjectName 之前,否则 FoxPro 将产生语法错误。
ObjectName
在类定义或子类定义创建一个对象后,ObjectName 指定对象名,并用来从类定义或子类定义内部引用对象。
AS ClassName2
指定类或子类名,该类或子类中包含添加到类定义中的对象。例如,下面的类定义从 CommandButton 基类中添加一个命令按钮,从 ListBox 基类中添加一个列表框。
DEFINE CLASS MyClass AS Custom
ADD OBJECT CB1 AS CommandButton
ADD OBJECT LIST1 AS ListBox
ENDDEFINE
NOINIT
当添加对象时,不执行对象的 Init 方法。
WITH cPropertyList
为添加到类定义或子类定义中的对象指定一列属性和属性值。例如,下面的类定义创建一个名为 MyClass 的类,向类定义中添加一个命令按钮,并为此命令按钮指定 Caption 和 Backcolor 属性:
DEFINE CLASS MyClass AS CUSTOM
ADD OBJECT CB1 AS CommandButton;
WITH Caption = 'Cancel', BackColor = 2
ENDDEFINE
FUNCTION | PROCEDURE Name[_ACCESS | _ASSIGN] | THIS_ACCESS为类(或者子类)创建事件和方法,而事件和方法是作为一组函数或过程来创建的。
可以在类定义或子类定义中创建事件函数或过程去响应一个事件。一个事件是一次活动(例如一次鼠标单击),它可以由类定义或子类定义创建的对象去识别。 有关Visual FoxPro 事件处理的其他内容,请参阅《Microsoft Visual FoxPro 6.0 中文版程序员指南》第四章“深入了解事件模型”中的“为事件指定代码”。
事件可用下面的语法调用:ObjectName.Event
也可以在一个类或子类的定义中创建一个方法。一个方法就是一个过程,它作用于由类或子类定义创建的对象。方法可用下列语法调用:
ObjectName.Method
ACCESS 和 _ASSIGN 前缀可以添加到一个过程或函数名前,以便为具有相同名称的属性创建一个 Access 或 Assign 方法。每当查询该属性时,都执行 Access 方法中的代码。每当更改该属性时,都执行 Assign 方法中的代码。
另外,您可以创建一个 THIS_ACCESS 函数过程,它在您试图更改对象程序或查询对象程序时执行。
有关使用DEFINE CLASS 创建 Access 和 Assign 方法的详细内容,请参阅《MicrosoftVisual FoxPro 6.0 中文版程序员指南》中的三十三章“对编程的改进”。
NODEFAULT
NODEFAULT 会导致 Visual FoxPro 不对它本身的事件和方法进行默认处理。例如,如果 KeyPress 事件发生,而 KeyPress 过程或函数中包含 NODEFAULT,则禁止 Visual FoxPro 将按下的键放入 Visual FoxPro 的键盘缓冲区。这样就允许您自己创建一个 KeyPress 过程,它可在按下键并将键送入键盘缓冲区前先测试按下了哪个键。
NODEFAULT 可以放在事件或方法过程的任何位置。注意,NODEFAULT 也可放在表单设计器的事件或方法过程中。
cStatements
[ENDFUNC | ENDPROC]]...
ENDDEFINE
cStatements 是 Visual FoxPro 命令,当执行一个事件或方法时就执行它。
通过将 PARAMETERS 或 LPARAMETERS 作为函数或过程的第一个可执行语句,可以让事件和方法函数和过程接受参数。
与大多数 Visual FoxPro 关键字不同,不能缩写 ENDFUNC 和 ENDPROC,主要是为了避免与 ENDFOR 和 ENDPRINTJOB 关键字发生冲突。
下列示例演示了如何创建一个当单击命令按钮时显示一条消息的事件过程。这个事件过程会取代命令按钮默认的 Click 事件。
DEFINE CLASS MyClass AS Custom
ADD OBJECT MyButton AS CommandButton
ADD OBJECT MyList AS ListBox
PROCEDURE MyButton.Click
= MESSAGEBOX('This is my click event procedure')
ENDPROC
ENDDEFINE
说明
用户自定义类是放在程序文件中的一组命令,类似一个过程。与过程一样,这些类(或子类)定义后的命令并不执行,它们只定义类(或子类)的属性、事件和方法。
注意在一个程序文件中,在过程后面不能包含普通的可执行程序代码;在程序文件中,在第一个 DEFINE CLASS、PROCEDURE 或FUNCTION 命令之后只能包含类定义、过程和用户自定义函数。
不能在结构化编程命令中使用 DEFINE CLASS 创建类定义或子类定义(例如 IF…DNDIF 或 DO CASE…ENDCASE),它们也不能放在循环语句中(例如 DOWHILE…ENDDO 或 FOR…ENDFOR)。
要根据一个类定义或子类定义创建对象,应发出包含该类名或子类名的CREATEOBJECT()命令。