Команда DEFINE CLASS

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

Синтаксис:

DEFINE CLASS ClassName1 AS ParentClass
	[[PROTECTED PropertyName1, PropertyName2 ...]
		PropertyName = eExpression ...]
	[ADD OBJECT [PROTECTED] ObjectName AS ClassName2 [NOINIT]
		[WITH cPropertylist]]...
	[[PROTECTED] FUNCTION | PROCEDURE Name
		[NODEFAULT]
		cStatements
	[ENDFUNC | ENDPROC]]...
ENDDEFINE

Параметры:
ClassName1
Задает имя класса, который предстоит создать.
AS ParentClass
Задает родительский класс, по которому строится данный класс или подкласс. В качестве родительского класса можно указать базовый класс Visual FoxPro, такой как Form, или другой определенный пользователем класс или подкласс.
В следующей таблице перечислены базовые классы Visual FoxPro.

Имена базовых классов

CheckBox		Label
Column		Line
ComboBox		ListBox
CommandButton	OLEControl
CommandGroup	OLEBoundControl
Container		OptionButton
Control		OptionGroup
Cursor		Page
Custom		PageFrame
DataEnvironment	Relation
EditBox		Separator
Form		Shape
FormSet		Spinner
Grid		TextBox
Header		Timer
Image		ToolBar

Для создания невизуального пользовательского класса нужно задать Custom в качестве cBaseClass.
В следующем примере создается подкласс MyForm на основе базового класса Form. В нем создается метод Click, отображающий диалоговое окно при щелканьи MyForm.

DEFINE CLASS MyForm AS Form
	PROCEDURE Click
		= MESSAGEBOX('MyForm has been clicked!')
	ENDPROC
ENDDEFINE

[PROTECTED PropertyName1, PropertyName2 ...]
PropertyName = eExpression ...
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

ADD OBJECT
Добавляет объект в определение класса или подкласса, взятый из базового класса Visual FoxPro, класса или подкласса, определенного пользователем, или из специальных элементов управления OLE.
PROTECTED
Запрещает обращение к свойствам объекта и его изменение извне определения класса или подкласса. Ключевое слово PROTECTED должно стоять непосредственно перед ObjectName, в противном случае FoxPro сгенерирует синтаксическую ошибку.
ObjectName
Задает имя объекта и используется для ссылки на объект извне определения класса или подкласса после того, как объект создан согласно определению класса или подкласса.
AS ClassName
Задает имя класса или подкласса, который содержит объект, добавляемый в определение класса. Например, в следующем определении класса добавляется командная кнопка из базового класса CommandButton и поле ввода со списком из базового класса ListBox.

DEFINE CLASS MyClass AS Custom
	ADD OBJECT CB1 AS CommandButton
	ADD OBJECT LIST1 AS ListBox
ENDDEFINE

NOINIT
Указывает, что метод объекта Init не выполняется при добавлении объекта.
WITH cPropertyList
Задает список свойств и их значений для объекта, добавляемого в определение класса или подкласса. Например, в следующем определении класса создается класс MyClass, в него добавляется объект CommandButton и для этого объекта определяются свойства Caption и BackColor.

DEFINE CLASS MyClass AS CUSTOM
	ADD OBJECT CB1 AS CommandButton;
		WITH Caption = 'Cancel', BackColor = 2
ENDDEFINE

[PROTECTED] FUNCTION | PROCEDURE Name [NODEFAULT] cStatements [ENDFUNC | ENDPROC ...]
Предложения FUNCTION Name и PROCEDURE Name создают события и методы для класса или подкласса. Они создаются в виде набора функций или процедур.
Вы можете создать в определении класса или подкласса функцию или процедуру события, реагирующую на некоторое событие. Событие представляет собой определенное действие (например щелканье мышью), которое распознается объектом, созданным в этом классе или подклассе. Подробнее об обработке событий Visual FoxPro см. тему Основные события и главу 4 "Основы событийно-ориентированной модели" Руководства разработчика.
Для назначения событиям имен используется следующий синтаксис:

ObjectName.Event

В определении класса или подкласса можно также создать функцию или процедуру метода. Метод представляет собой процедуру, которая воздействует на объект, созданный в том же определении класа или подкласса. Для назначения методам имен используется следующий синтаксис:

ObjectName.Method

Ключевое слово NODEFAULT запрещает Visual FoxPro выполнять предусмотренную по умолчанию обработку событий и методов Visual FoxPro. Например, если происходит событие KeyPress, то использование NODEFAULT в процедуре или функции KeyPress приводит к тому, что Visual FoxPro не будет вводить нажатую клавишу в буфер клавиатуры Visual FoxPro. Тем самым вы можете создать процедуру KeyPress, которая позволит проверять, какая клавиша была нажата, прежде чем передавать ее в буфер клавиатуры.
NODEFAULT можно вставлять в любом месте внутри процедуры события или метода. Заметьте, что NODEFAULT тоже можно вставить в процедуру события или метода в конструкторе форм.
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

Комментарии:
Определенные пользователем классы - это наборы команд, помещенные в файл программы, аналогично процедуре. Как и в процедуре, команды, следующие за определением класса или подкласса, не выполняются, они только определяют свойства, события и методы для данного класса или подкласса.
Чтобы создать объект на основе определения класса или подкласса, выдайте функцию CREATEOBJECT( ) с именем класса или подкласса.
Описания классов и подклассов, создаваемые с помощью команды DEFINE CLASS, нельзя вставлять внутри команд структурного программирования, таких как IF ... ENDIF или DO CASE ... ENDCASE. Их нельзя помещать и в циклы, такие как DO WHILE ... ENDDO или FOR ... ENDFOR.

Пример:

* В следующем примере команда DEFINE CLASS и функция CREATEOBJECT( )
* используются для создания двух нестандартных классов, FormChild и
* FormGrandChild, на основе базового класса Form системы Visual FoxPro.
* Функция ACLASS( ) создает массив gaNewarray, содержащий имена
* классов, которые затем выводятся на экран.

CLEAR
frmMyForm = CREATEOBJECT("FormGrandChild")
FOR nCount = 1 TO ACLASS(gaNewarray, frmMyForm) 	&& Creates an array
	? gaNewarray(nCount)  && Displays the names of the classes
ENDFOR
RELEASE frmMyForm

DEFINE CLASS FormChild AS FORM
ENDDEFINE

DEFINE CLASS FormGrandChild AS FormChild
ENDDEFINE

Предыдущий Шаг | Следующий Шаг | Оглавление
Автор Каев Артем.