Создает определяемый пользователем класс или подкласс и определяет свойства, события, и методы для класса или подкласса.
Предостережение: |
---|
Изменение свойств "только для чтения" базовых классов генерирует сообщение об ошибке. |
Полный синтаксис для основного предложения 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 Команда
Команды