Создает определяемый пользователем класс или подкласс и определяет свойства, события, и методы для класса или подкласса.
Предостережение: |
|---|
| Изменение свойств "только для чтения" базовых классов генерирует сообщение об ошибке. |
Полный синтаксис для основного предложения DEFINE CLASS выглядит следующим образом:
DEFINE CLASS ClassName1 AS ParentClass [OF ClassLibrary] [OLEPUBLIC]
[[PROTECTED | HIDDEN] PropertyName1, PropertyName2 ...]
[[.]Object.]PropertyName = eExpression ...]
[PEMName_COMATTRIB = nFlags | DIMENSION PEMName_COMATTRIB[numElements]
[PEMName_COMATTRIB[1] = nFlags
PEMName_COMATTRIB[2] = cHelpString
PEMName_COMATTRIB[3] = cPropertyCapitalization
PEMName_COMATTRIB[4] = cPropertyType
PEMName_COMATTRIB[5] = nOptionalParams]]
[ADD OBJECT [PROTECTED] ObjectName AS ClassName2 [NOINIT] [WITH cPropertylist]]
[IMPLEMENTS cInterfaceName [EXCLUDE] IN TypeLib | TypeLibGUID | ProgID ]
[[PROTECTED | HIDDEN] FUNCTION | PROCEDURE Name[_ACCESS |_ASSIGN]
([cParamName | cArrayName[] [AS Type][@]]) [AS Type]
[HELPSTRING cHelpString] | THIS_ACCESS(cMemberName) [NODEFAULT]
cStatements
[ENDFUNC | ENDPROC]
ENDDEFINE
|
Замечания
Следующий код демонстрирует резюме основных предложений:
Скопировать код | |
|---|---|
DEFINE CLASS Clause [Property_Definition_Clause] [PEMName_COMATTRIB Clause] [ADD OBJECT Clause] [IMPLEMENTS Clause] [Function_Procedure_Definition_Clause] ENDDEFINE | |
Следующие разделы описывают детальный синтаксис и параметры для каждого предложения DEFINE CLASS команда:
- DEFINE CLASS Предложение
- Предложение Определения Свойства
- PEMName_COMATTRIB Предложение
- ADD OBJECT Предложение
- IMPLEMENTS Предложение
- Предложение Определения Функции или Процедуры
Код для определяемых пользователем классов сохраняется в программном файле (.prg), подобным процедурному.
Обратите внимание: |
|---|
| Вы не можете располагать процедуры в файле .prg с обычно выполняемым программным кодом. Только определения класса, другие процедуры, и определяемые пользователем функции могут следовать за первой инструкцией DEFINE CLASS , PROCEDURE или FUNCTION в файле. Для подробной информации, см. Пользовательские Процедуры и Функции . |
Вы не можете разместить определения класса, созданные командой DEFINE CLASS в пределах команд структурного программирования, например, IF ... ENDIF или DO CASE ... ENDCASE , или в циклах, типа DO WHILE ... ENDDO или FOR ... ENDFOR .
Для создания экземпляра класса, который Вы определили, используйте функцию CREATEOBJECT( ) . Вы можете обратиться к глобальным свойствам и вызвать метод или событийную функцию и процедуру вне определения класса как показано в следующем примере:
Скопировать код | |
|---|---|
myObject = CREATEOBJECT('MyClass')
myObject.myPropertyName =
myObject.myMethodName( argument1, argument2, ... )
myObject.myEventName
| |
Защищенные или скрытые свойства, методы, и события ограничивают доступ как определено ключевыми словами PROTECTED и HIDDEN . Для подробной информации, см. DEFINE CLASS Команда - Предложение Определения Свойства и DEFINE CLASS Команда - Предложение Определения Функции или Процедуры .
Visual FoxPro конвертирует значение предложение AS Type автоматически, когда другие COM серверы используют их. Когда Вы задаете предложение AS в коде, IntelliSense Visual FoxPro выводит информацию о типе для COM серверов.
Следующая таблица показывает информации о типе данных, которая выводится.
| VFP defined type | COM Typelib conversion | IntelliSense displays |
|---|---|---|
|
Array |
SAFEARRAY(type) |
Array |
|
BinaryMemo |
VARIANT |
- |
|
Boolean |
VARIANT_BOOL |
Logical |
|
Byte |
unsigned char |
Number |
|
Character * |
BSTR |
String |
|
Currency * |
CURRENCY |
Currency |
|
Date |
DATE |
Date |
|
DateTime |
DATE |
Date |
|
Decimal * |
wchar_t |
Number |
|
Double |
double |
Number |
|
Float |
VARIANT |
- |
|
Integer |
long |
Number |
|
Logical |
VARIANT_BOOL |
Logical |
|
Long |
long |
Number |
|
Memo |
VARIANT |
- |
|
Number |
double |
Number |
|
Object |
IDispatch* |
Object |
|
Short |
long |
Number |
|
Single * |
single |
Number |
|
String |
BSTR |
String |
|
Variant |
VARIANT |
- |
|
Void |
void |
VOID |
Вы можете просмотреть код для методов Access и Assign в окне Trace окна Debugger. Однако, Вы не можете выполнить методы Access и Assign из окон Watch И Local окна Debugger. Для подробной информации, см. методы Access и Assign , Окно Trace , и Окно Debugger .
Безопасный массив - одно - или многомерный массив единственного типа данных, который может иметь тип VARIANT, разрешая Вам создать массивы смешанных типов. Безопасный массив хранит свое меньшее значение, которое не должно быть нулевым, и свой размер. Безопасные массивы разрешают блокирование и деблокирование, поэтому Вы можете быть уверены, что указатель, который Вы получаете к данным, является допустимым.
Примеры
Пример 1
Следующий пример создает класс по имени MyForm от базового класса Form и создает защищенное свойство по имени Version. Класс также содержит другое свойство по имени Caption, который не защищен. Определение класса инициализирует значения по умолчанию для Version и Caption строками "1.0 " и "My Form", соответственно.
Скопировать код | |
|---|---|
DEFINE CLASS MyForm AS Form PROTECTED Version Version = "1.0" Caption = "My Form" ENDDEFINE | |
Пример 2
Следующий пример создает форму frmOLETest от базового класса Form и использует метод AddObject для добавления объекта по имени OCXTest основанный на классе BlueOLEControl, созданном командой DEFINE CLASS и описывающим OLE класс для элемента управления ActiveX Listview . Ключевое слово Object используется, чтобы определить значение для свойства BackColor элемента управления прежде, чем он будет создан.
Скопировать код | |
|---|---|
PUBLIC frmOLETest
frmOLETest = CREATEOBJECT('Form')
frmOLETest.Visible = .T.
frmOLETest.AddObject('OCXTest', 'BlueOLEControl', 'MSComctlLib.ListViewCtrl')
frmOLETest.OCXTest.View = 2
frmOLETest.OCXTest.ListItems.Add(1,'one','Item One')
frmOLETest.OCXTest.ListItems.Add(2,'two','Item Two')
DEFINE CLASS BlueOLEControl AS OLEControl
* Set property for Outline ActiveX control.
.Object.Backcolor = 16776960
* Set properties for the OLE Container control.
Visible = .T.
Height = 100
Width = 200
ENDDEFINE
| |
Для подробной информации, см. AddObject Метод .
Пример 3
Следующий пример демонстрирует, как определить массив атрибутов библиотеки типов, используя DIMENSION PEMName _COMATTRIB предложение:
Скопировать код | |
|---|---|
#INCLUDE foxpro.h DEFINE CLASS myOLEClass AS Custom OLEPUBLIC MyProperty = 5.2 * Set COM attributes for MyProperty. DIMENSION MyProperty_COMATTRIB[4] myProperty_COMATTRIB[1] = COMATTRIB_READONLY myProperty_COMATTRIB[2] = "Help text displayed in object browser" myProperty_COMATTRIB[3] = "MyProperty" && Proper capitalization. myProperty_COMATTRIB[4] = "Float" && Data type ENDDEFINE | |
Однако, если Вы хотите установить только элемент nFlags , Вы не должны создать массив:
Скопировать код | |
|---|---|
#INCLUDE foxpro.h DEFINE CLASS myOLEClass AS Custom OLEPUBLIC MyProperty = "Test" * Set the only the nFlags attribute for MyProperty. myProperty_COMATTRIB = COMATTRIB_READONLY ENDDEFINE | |
Пример 4
Следующий пример создает класс по имени MyForm от базового класса Form и добавляет кнопку от базового класса CommandButton и переключатель от базового класса CheckBox :
Скопировать код | |
|---|---|
DEFINE CLASS MyForm AS Form ADD OBJECT cmdButton1 AS CommandButton ADD OBJECT chkBox1 AS CheckBox ENDDEFINE | |
Как другой пример, следующий код создает класс по имени MyForm, добавляет кнопку и переключатель к классу, и определяет значения для свойств Caption кнопки и переключателя.
Скопировать код | |
|---|---|
DEFINE CLASS MyForm AS Form ADD OBJECT cmdButton1 AS CommandButton WITH Caption = "Yes" ADD OBJECT chkBox1 AS CheckBox WITH Caption = "Click Me" ENDDEFINE | |
Пример 5
Следующий пример создает класс по имени MyPublisherClass как настраиваемый класс Custom , использует ключевое слова OLEPUBLIC , чтобы определить, что клиенты Автоматизации могут обратиться к классу когда он включен в сервер Автоматизации, использует предложение IMPLEMENTS , чтобы наследовать определение класса из определения класса Publisher в библиотеке типов MyBookStore.dll, и включает метод ShowPrice интерфейса Publisher.
Скопировать код | |
|---|---|
DEFINE CLASS MyPublisherClass AS Custom OLEPUBLIC IMPLEMENTS Publisher IN "MyBookStore.dll" PROCEDURE Publisher_ShowPrice(cGetID AS Long) AS Short ENDPROC ENDDEFINE | |
Пример 6
Следующий пример создает класс по имени MyForm от базового класса Form и содержит процедуру для определения события Click . Форма, созданная от класса содержит метод Click , который выводит диалоговое окно, когда Вы щелкаете на форме.
Скопировать код | |
|---|---|
DEFINE CLASS MyForm AS Form
PROCEDURE Click
= MESSAGEBOX('MyForm has been clicked!')
ENDPROC
ENDDEFINE
| |
Как другой пример, следующий код содержит процедуру для одного из объектов, помещенного в класс. Эта процедура обработки события отменяет заданное по умолчанию событие Click для кнопки:
Скопировать код | |
|---|---|
DEFINE CLASS MyForm AS Form
ADD OBJECT MyButton AS CommandButton
ADD OBJECT chkBox1 AS CheckBox
PROCEDURE MyButton.Click
= MESSAGEBOX('This is my click event procedure')
ENDPROC
ENDDEFINE
| |
Пример 7
Следующий пример показывает, как Вы можете задать использование строгой типизации, используя предожение PROCEDURE cArrayName [] [AS Type ][@][AS Type ] так, чтобы массивы могли быть правильно написаны как безопасные массивы для библиотеки типов:
Скопировать код | |
|---|---|
DEFINE CLASS mySession AS Session OLEPUBLIC
PROCEDURE GetWidgets1(aWidgets[])
ENDPROC
PROCEDURE GetWidgets2(aWidgets[] AS Integer)
ENDPROC
PROCEDURE GetWidgets3(aWidgets[] AS Integer @)
ENDPROC
PROCEDURE GetRS(oRS[] AS ADODB.Recordset @)
ENDPROC
ENDDEFINE
| |
Как и другой пример, следующий код демонстрирует, как Вы можете задать строгое сложное типирование, определяя тип, основанный на COM классе:
Скопировать код | |
|---|---|
DEFINE CLASS mySession AS Session OLEPUBLIC
PROCEDURE GetRS() AS ADODB.Recordset
x=CREATEOBJECT("ADODB.Recordset")
RETURN X
ENDPROC
PROCEDURE SetRS(oRS AS ADODB.Recordset @)
oRS=CREATEOBJECT("ADODB.Recordset")
ENDPROC
ENDDEFINE
| |
См. Также
Другие Ресурсы
:: Scope Resolution ОператорADD CLASS Команда
CREATE CLASS Команда
CREATE CLASSLIB Команда
DODEFAULT( ) Функция
EVENTHANDLER( ) Функция
GETOBJECT( ) Функция
MODIFY CLASS Команда
RELEASE CLASSLIB Команда
Команды
Предостережение:
Обратите внимание: