Создает определяемый пользователем класс или подкласс и определяет свойства, события, и методы для класса или подкласса.

Предостережение:
Изменение свойств "только для чтения" базовых классов генерирует сообщение об ошибке.

Полный синтаксис для основного предложения 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 команда:

Код для определяемых пользователем классов сохраняется в программном файле (.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

См. Также