Распечатать страницу

Классы в Microsoft Visual FoxPro

« Назад

Класс – это абстрактный тип данных описывающий структуру и поведение некоторого множества объектов.

Объект создается как экземпляр (представитель) класса, имеющий уникальное имя.

Библиотека классов – файл, хранящий определения классов. По умолчанию файл имеет расширение VCX.

Команда

DEFINE CLASS ClassName1 AS ParentClass [OF ClassLibrary] [OLEPUBLIC]
                   [IMPLEMENTS cInterfaceName [EXCLUDE]
                   IN TypeLib | TypeLibGUID | ProgID ]
                   [[PROTECTED | HIDDEN PropertyName1, PropertyName2 ...]
                   [[.]Object.]PropertyName = eExpression ...]
                   [ADD OBJECT [PROTECTED] ObjectName AS ClassName2 [NOINIT]
                   [WITH cPropertylist]]
                   [[PROTECTED | HIDDEN] FUNCTION | PROCEDURE Name
                            [_ACCESS |_ASSIGN]
                            ([cParamName | cArrayName[ ] [AS Type] [@]]) [AS Type]
                            [HELPSTRING cHelpString]
                            | THIS_ACCESS(cMemberName) [NODEFAULT]
                            cStatements
                   [ENDFUNC | ENDPROC]]

                   [PEMName_COMATTRIB = nFlags
                            | DIMENSION PEMName_COMATTRIB[5]
                   [PEMName_COMATTRIB[1] = nFlags
                   PEMName_COMATTRIB[2] = cHelpString
        
         PEMName_COMATTRIB[3] = cPropertyCapitalization

                   PEMName_COMATTRIB[4] = cPropertyType
                   PEMName_COMATTRIB[5] = nOptionalParams]]
         ENDDEFINE

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

Определение класса (подкласса) записывается после основной программы (если таковая имеется). После определения класса может располагаться текст определения другого класса или функции, или процедуры. При попытке продолжить написание основной программы VFP генерирует ошибку.

Если класс пределен, то объект класса создается функцией CREATEOBJECT( ) или NEWOBJECT( ).

Замечание. При изменении доступных только для чтения свойств базовых классов генерируется ошибка. Однако если такие свойства изменяются при создании пользовательского класса (подкласса) на основе базового класса, ошибка не генерируется, но может возникнуть при последующей эксплуатации кода.

Опции, параметры и команды:

ClassName1 – имя создаваемого класса.

AS ParentClass – задает родительский класс, на котором базируется создаваемый класс или подкласс. В качестве родительского может быть взят базовый класс VFP, например Form, или произвольный определенный пользовательский класс или подкласс. Базовые классы VFP приведены в табл. 13.2.

Таблица 13.2

Базовые классы VFP

Имя класса

Описание

CheckBox

Флажок

Collection

Коллекция

Column

Столбец сетки

ComboBox

Раскрывающийся список

CommandButton

Кнопка управления

CommandGroup

Группа кнопок управления

Container

Контейнер (объект, который может содержать другие объекты)

Control

Элемент управления, не являющийся контейнером, но способный содержать иные элементы

Cursor

Курсор (объект этого класса создается, когда таблица или вид добавляются в окружение данных формы, набора форм или отчета)

CursorAdapter

Курсор-адаптер. Создает курсоры и управляет ими

Custom

Пользовательский класс

DataEnvironment

Окружение данных (объект этого класса создается, когда открывается форма, набор форм или отчет)

EditBox

Область редактирования

Empty

Пустой класс

Exception

Исключение

Form

Форма

FormSet

Набор форм

Grid

Сетка

Header

Заголовок столбца сетки

Hyperlink

Гиперссылка (позволяет переходить к URL – uniform resource locator)

Image

Образ

Label

Надпись

Line

Линия

ListBox

Список

ActiveX Bound Control
(OLEBoundControl)

Связанный OLE-элемент управления

ActiveX Control
(OLEControl)

OLE-элемент управления (OLE Container Control)

OptionButton

Переключатель

OptionGroup

Группа переключателей

Page

Страница, или вкладка

PageFrame

Блок страниц (объект этого класса содержит несколько страниц)

ProjectHook

Зацепка проекта (объект этого класса обеспечивает программный доступ к событиям проекта)

Relation

Отношение (объект этого класса создается, когда устанавливается связь между таблицами в проектировщике окружения данных Data Environment Designer формы, набора форм или отчета)

ReportListener

Объект этого класса обеспечивает поддержку команд REPORT FORM и LABEL FORM

Separator

Разделитель (пространство между элементами панели управления)

Session

Сессия (объект этого класса предназначен для управления сессией данных)

Shape

Обрамление в виде прямоугольника, окружности или эллипса

Spinner

Счетчик

TextBox

Поле ввода

Timer

Таймер (объект этого класса предназначен для выполнения кода через заданный промежуток времени)

ToolBar

Панель инструментов

XMLAdapter

XML-адаптер

XMLTable

XML-таблица

XMLField

XML-поле

Если для ParentClass задано значение Custom, то VFP создает невизуальный пользовательский класс.

Пример. Создается подкласс MyForm, основанный на базовом классе Form, содержащий метод Click, отображающий сообщение при ударе по форме мышью.

define class MyForm as Form

         procedure Click

                   MessageBox('По форме MyForm ударили мышью!')

         endproc

endDefine

Если для ParentClass задано значение Session, то VFP создает невизуальный пользовательский класс, обслуживающий частную сессию данных пользователя. Session-объект не является контейнером, поэтому опция AddObject недоступна.

При переходе к частной пользовательской сессии данных (команда SET DATASESSION) команды SET EXCLUSIVE, SAFETY и TALK устанавливаются в OFF независимо от текущих установок, например:

oUserSession = CreateObject("Session")

? oUserSession.DataSession  && Напечатает: 2

? oUserSession.Application.Name  && Напечатает: Microsoft Visual FoxPro

set talk on  && SET TALK в ON

set datasession to oUserSession.DataSessionID

? Set("TALK")                    && Напечатает: OFF

Если для ParentClass задано значение Session и вдобавок задана опция OLEPUBLIC, то библиотека типа, генерируемая для EXE или DLL будет содержать только добавленные пользователем методы и свойства. Все встроенные свойства, методы и события базового класса Session в библиотеку типа включены не будут.

OF ClassLibrary – имя библиотеки классов для ParentClass с указанием или без указания пути. В качестве ClassLibrary можно задать библиотеку класса (расширение VCX), программу (PRG) или откомпилированный программный файл (FXP).

Порядок поиска файла с библиотекой класса рассмотрен в разд. 13.3 при описании функции CREATEOBJECT( ). Если библиотека классов ClassLibrary при создании экземпляра объекта не найдена, то генерируется ошибка "Class definition <ClassLibrary> is not found".

Если в опции OF в качестве ClassLibrary задано имя программного файла programfile, то оно должно иметь расширение FXP.

VFP автоматически добавит ClassLibrary в проект во время его построения, если в нем есть программа, в которой команда задания класса содержит опцию OF ClassLibrary.

OLEPUBLIC – указывает, что классом может пользоваться клиент Автоматизации.

Если опция OLEPUBLIC задана в программе, принадлежащей проекту, и создается исполняемый EXE-файл или DLL-файл динамической библиотеки (команда BUILD EXE | DLL | MTDLL), то определения классов автоматически регистрируются системном регистре и в списке Server Classes вкладки Project Information диспетчера проекта; зарегистрированные классы доступны, в принципе, любому клиенту Автоматизации.

[PROTECTED | HIDDEN PropertyName1, PropertyName2 ...]
                   [[.]Object.]PropertyName = eExpression ... – создает свойство класса или подкласса и присваивает свойству значение по умолчанию. Число свойств неограниченно.

Пример. Создается класс MyClass с двумя свойствами cName и Version.

define class MyClass as Custom

         cName = 'Some name'

         Version = '1.0'

endDefine

Значение свойства может быть переопределено после создания объекта, например:

myObject = CreateObject('MyClass')

myObject.Name = 'New name'

Префикс Object означает для VFP, что значение свойства устанавливается для элемента управления ActiveX.

Пример. В форму добавляется ActiveX-элемент управления Outline. Object используется для задания свойства элемента управления Outline до его создания.

public frmOLETest

frmOLETest = CreateObject('Form')

frmOLETest.Visible = .T.

&&

frmOLETest.AddObject('OCXTest', 'GreyOLEControl', 'MSOutl.Outline')

frmOLETest.OCXTest.AddItem('Item One')

frmOLETest.OCXTest.AddItem('Item Two')

&& Форма с ActiveX-элементом управления Outline приведена на рис. 13.1 

define class GreyOLEControl as OLEControl

         && Задаем значение свойства элемента управления ActiveX

         && Светло-серый цвет фона

         .Object.Backcolor = RGB(230, 230, 230)

         && Задаем значения свойств элемента управления OLE Container

         Visible = .T.

         Height = 100

         Width = 200

endDefine

184.1.-Форма-с-ActiveX-элементом-управления-Outline

Рис. 13.1. Форма с ActiveX-элементом управления Outline

PROTECTED – запрещает доступ и изменение перечисленных после опции свойств за пределами определения класса ClassName1. Методы и события класса доступ к PROTECTED-свойствам имеют. Также к PROTECTED-свойствам имеют доступ подклассы, созданные на основе класса ClassName1.

Пример. Значение свойства Version не может быть изменено за пределами описания класса в результате присваивания

oObject.Version = 'New version'

но может быть изменено в результате вызова метода ChangeVersion. Печать нового значения свойства обеспечивается методом ShowVersion.

myObject = CreateObject('MyClass')

myObject.ChangeVersion('1.1')

&& При следующем употреблении метода ShowVersion круглые скобки необходимы:

? myObject.ShowVersion( )   && Напечатает: 1.1

&&

&& Недопустимое изменение защищенного свойства Version

myObject.Version = '1.2'        && Генерируется ошибка 

define class MyClass as Custom

         protected Version

         cName = 'Some name'

         Version = '1.0'

         &&

         procedure ChangeVersion(newVersion)

                  This.Version = newVersion    && Изменяем значение свойства Version

         endProc

         &&

         function ShowVersion

                   return This.Version       && Возвращаем значение свойства Version

         endFunc

endDefine

HIDDEN – запрещает доступ и изменение перечисленных после опции свойств за пределами определения класса ClassName1. Методы и события класса доступ к HIDDEN-свойствам имеют.

В отличие от PROTECTED-свойств, подклассы, созданные на основе класса ClassName1, доступ к HIDDEN-свойствам не имеют.

ADD OBJECT – добавляет объект в определение класса. Объект может быть основан на VFP-базовом классе, пользовательском классе (подклассе) или ActiveX-элементе управления.

PROTECTED – запрещает доступ и изменение свойств объекта за пределами определения класса. Опция, если указывается, должна быть размещена сразу после ObjectName в противном случае VFP генерирует ошибку.

ObjectName – имя добавляемого объекта.

AS ClassName2 – класс (подкласс) объекта ObjectName.

Пример. Добавляются 2 объекта CB1 и LIST1 базовых классов CommandButton и ListBox.

define class MyForm as Form

         add object CB1 as CommandButton

         add object LIST1 as ListBox

endDefine

NOINIT – при добавлении объекта не выполняется событие Init.

WITH cPropertyList – задает список свойств и их значений объекта, добавляемого в определение класса.

Пример. В определение класса MyForm добавляется кнопка CB1.

public oForm

oForm = CreateObject('MyForm')

oForm.Visible = .T.

&& Открытая форма приведена на рис. 13.2 

define class MyForm as Form

         add object CB1 as CommandButton ;

                   with Caption = 'Cancel', Height = 8

endDefine

184.2.-Форма-с-кнопкой-Cancel

Рис. 13.2. Форма с кнопкой Cancel

FUNCTION | PROCEDURE Name [_ACCESS | _ASSIGN] | THIS_ACCESS – создает событие или метод класса. События и методы создаются как наборы процедур и функций. В качестве событий могут браться только встроенные в базовый класс события, а в качестве методов – как встроенные, так и пользовательские.

Синтаксис вызова события или метода SomeName следующий:

myObject = CreateObject('MyClass')

myObject.SomeName

_ACCESS | _ASSIGN – суффикс, указывающий, что добавляется Access- или Assign-метод свойства с тем же именем Name. Код Access-метода выполняется, когда запрашивается значение свойства, а код Assign-метода, – когда осуществляется попытка изменить значение свойства. Assign-метод должен иметь параметр, например tAssign, принимающий новое значение свойства. Access- и Assign-методы защищены (PROTECTED) по умолчанию и поэтому не могут быть изменены за пределами определения класса.

Код Access- и Assign-методов можно наблюдать в Trace-окне отладчика, эти методы не могут быть запущены на исполнение в его Watch- и Local-окнах.

Массивы передаются Access- и Assign-методам по так же, как и другим функциям и процедурам VFP. Весь массив передается, если SET UDFPARMS установлен в REFERENCE или если перед именем массива-фактического параметра употреблен символ @. Если же SET UDFPARMS установлен в VALUE или имя массива-фактического параметра заключено в круглые скобки, то передается только первый элемент массива.

THIS_ACCESS – обеспечивает выполнение процедуры или функции при любом обращении к объекту или его компоненту.

Пример 1. Определяется свойство MyProperty и его Access- и Assign-методы. Кроме того, поскольку в методе закомментирован оператор

This.MyProperty = tAssign

значение свойства MyProperty изменить нельзя.

myObject = CreateObject('MyClass')

? myObject.MyProperty         && Напечатает: 100

&& Значение свойства MyProperty не изменится, поскольку в методе

&& MyProperty_Assign не выполняется оператор This.MyProperty = tAssign

myObject.MyProperty = 20

? myObject.MyProperty         && Напечатает: 100 

define class MyClass as Custom

         && Определенное пользователем свойство

         MyProperty = 100        

         && Метод, вызываемый при доступе к свойству MyProperty

         procedure MyProperty_Access

                   wait window 'Это сообщение Access-метода'

                   return This.MyProperty

         endProc

         &&

         && Метод, вызываемый при изменении свойства MyProperty

         procedure MyProperty_Assign

                   && Параметр необходим для получения нового значения

                   lparameters tAssign

                   wait window 'Это сообщение Assign-метода'

                   && После устранения следующего комментария значение свойства

                   && MyProperty можно будет изменять

                   && This.MyProperty = tAssign

         endProc

endDefine

Пример 2. Добавляется Assign-метод к встроенному свойству Left формы. Метод выполняет проверку назначаемого значения.

define class SomeForm as Form

         &&

         && Метод, вызываемый при изменении свойства Left

         procedure Left_Assign

                   && Параметр необходим для получения нового значения

                   lparameters tAssign

                   do case

                   case tAssign < 0  && Недопустимое значение свойства

                   wait window 'Значение должно быть неотрицательным'

                   otherwise

                   && Изменяем значение свойства

                   This.Left = tAssign

                   endCase

         endProc

endDefine

Access- и Assign- методы не поддерживаются для встроенных свойств, событий и методов ActiveX-элементов управления, но поддерживаются для свойств, событий и методов VFP OLE Container, содержащего ActiveX-элемент управления.

cParamName [AS Type][@] – имя параметра процедуры или функции и его тип. Задание символа @ означает, что параметр передается по ссылке. Число параметров произвольно.

Опция AS Type используется в информативных целях для IntelliSense и определения класса; сохраняется в библиотеке типа (OLEPUBLIC). VFP не выполняет проверку типа во время компиляции и исполнения программы. Строгое типизация также рекомендуется для интерфейсных методов, задаваемых при наличии опции IMPLEMENTS.

Чтобы параметры и их синтаксис отобразился в библиотеке классов, необходимо задавать параметры в списке, расположенном после имении функции (процедуры), а не использовать команду LPARAMETERS, например:

function Publisher_ShowPrice(Bookid as Integer, Bookprice as String)

Пример:

myObject = CreateObject('F1')

? myObject.MyMethod(1)      && Напечатает: 1

? myObject.MyMethod(1, '2') && Напечатает: 2.00 

define class F1 as Custom OLEPUBLIC

         protected MyProp

         function MyMethod (parm1 as Integer@, parm2 as String) as Integer

                   if Empty(parm2) then

                   return parm1

         else

                   return Val(parm2)

         endif

         endFunc

endDefine

AS VOID – используется для указания типа результата, когда метод ничего не возвращает. Это требуется, например, для компонентов Microsoft COM+ Services Queued.

VFP автоматически преобразовывает тип Type, когда класс используется COM-серверами. Правила преобразования типа приведены в табл. 6.2.

Кроме того, VFP предоставляет информацию для COM-серверов в IntelliSense Quick Info. Ее можно просмотреть в диспетчере IntelliSense, открываемом в меню Tools – IntelliSense Manager.

cArrayName[ ] [AS Type] [@] – имя параметра-массива и его тип. Задание cArrayName[ ] AS Type @ позволяет выполнить строгую типизацию массива, и он может быть корректно записан как SAFEARRAY-массив в библиотеку типа.

Пример:

define class Foo 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

Строгая типизация употребляется для библиотеки типа; проверка типа во время компиляции и исполнения программы в VFP не выполняется.

Указываемый тип должен быть одним из типов табл. 6.2. Также тип может ссылаться на COM CoClass ProgID, такой как ADODB.RecordSet.

Если опция AS Type задана для параметра-массива, то VFP создает SAFEARRAY-массив с заданным типом. Если опция не задана или указан несуществующий тип, то для SAFEARRAY-массива будет установлен тип Variant.

Замечание. При задании параметра-массива необходимо употреблять квадратные скобки. Круглые скобки DEFINE CLASS не приемлет.

Массив не может быть указан в качестве типа результата функции (процедуры). Следующий код задаст тип результата VARIANT, а не SAFEARRAY.

procedure GetWidgets( ) as aWidgets[ ]

endProc

Пример. Используется cArrayName[ ] AS Type @ для задания комплексной строгой типизации путем определения типа, основанного на COM-классе.

define class Foo as Session OLEPUBLIC

         reference "ADODB.Recordset"

         procedure GetRS( ) as ADODB.RecordSet

                   x = CreateObject("ADODB.RecordSet")

                   return x

         endProc

         procedure SetRS(oRS[ ] as ADODB.RecordSet @)

                   oRS = CreateObject("ADODB.RecordSet")

         endProc

endDefine

Если в качестве параметра Type опции AS берется COM CoClass ProgID, то VFP включит его в библиотеку типа. Например, метод

procedure Test(oRS[ ] as ADODB.RecordSet @) AS ADODB.RecordSet

создает следующий вход в библиотеке типа:

Recordset Test([in, out] Recordset** oRS);

Нельзя задать ссылку на ProgID, который генерируется самой библиотекой типа. Так, нельзя ссылаться на класс того же COM-сервера.

При написании имени ProgID могут употребляться кавычки.

HELPSTRING cHelpString – строка, добавляемая в библиотеку типа, отображаемая браузером объекта или IntelliSense в качестве описания назначения метода.

IMPLEMENTS InterfaceName – указывает, что определение класса реализует интерфейс COM-объекта. Один класс может включать несколько опций IMPLEMENTS.

Пример:

define class MyClass as Custom OLEPUBLIC

         implements Publisher in "myBookStore.dll"

         procedure Publisher_ShowPrice(Bookid as Integer, Bookprice as String) as Short

         endProc

endDefine

EXCLUDE – не включает интерфейсы, заданные опциями IMPLEMENTS, в библиотеку типа.

IN TypeLib | TypeLibGUID | ProgID – задает расположение интерфейса.

Параметром TypeLib может быть задан COM-объект, библиотека типа COM-объекта; параметром TypeLibGUID – GUID библиотеки типа; параметром ProgID – программа, инициализирующая COM-объект.

Пример:

myObject = CreateObject('MyBooks')

myObject.Publisher_ShowPrice(220, "125.54 руб.")

&& Напечатает: 220 – 125.54 руб. 

define class MyBooks as Custom OLEPublic

         implements Publisher in "myBookStore.dll"

         function Publisher_ShowPrice(BookId as Integer, BookPrice as String) as Short

                   ? Transform(BookId) + " – " + BookPrice

         endFunc

endDefine

Замечание. Более наглядный пример употребления IMPLEMENTS-интерфейсов см. в описании функции EVENTHANDLER( ).

Если используется параметр TypeLibGUID, то его значение передается с указанием старшей и младшей версий обозначения, например:

implements IDict1 in {04BCEF93-7A77-11D0-9AED-CE3E5F000000}#1.0

Параметр Typelib – самый нерекомендуемый способ указания библиотеки типа, поскольку задаваемое имя может быть другим на ином компьютере. В тиражируемой DLL лучше употреблять TypeLibGUID или ProgID.

Когда реализуется IMPLEMENTS-интерфейс, в определение класса должны быть включены все методы этого интерфейса. Так как VFP не использует строгую типизацию, то контроль за правильностью употребления типов осуществляется пользователем. Имя интерфейса используется в качестве префикса метода, например Publisher_ShowPrice. Это, в частности, позволяет избежать конфликтов, когда разные интерфейсы содержат одноименные методы (используется несколько опций IMPLEMENTS). Если имени интерфейса в библиотеке классов предшествует символ подчеркивания, то он может быть опущен.

Если в библиотеке типа свойства хранятся как 2 метода (PropertyPut и PropertyGet), то они должны быть включены в определение класса.

Замечание. Перетащить определение интерфейса в создаваемое определение класса можно, употребляя VFP Object Browser, вызываемом из меню Tools – Object Browser или в результате выполнения команды DO (_ObjectBrowser). Определение класса, опция IMPLEMENTS и все внедряемые методы будут автоматически добавлены в разрабатываемый код. Пример см. в описании функции EVENTHANDLER( ).

Некоторые технологии, например события Microsoft COM+, требует при внедрении интерфейса класса связывание событий COM-компонента. Детали см. описании функции EVENTHANDLER( ).

NODEFAULT – предотвращает выполнение заданного по умолчанию события или метода. Например, NODEFAULT в процедуре KeyPress предотвратит при нажатии на клавишу (событие KeyPress) записи кода нажатой клавиши в буфер клавиатуры. Это, в частности, дает возможность создать процедуру KeyPress, проверяющую, какая клавиша нажата, а затем принять решение о передачи ее кода в буфер клавиатуры (команда KEYBOARD).

NODEFAULT можно разместить в любом месте функции (процедуры).

cStatements – операторы, выполняемые при вызове метода или возникновении события. Команда PARAMETERS или LPARAMETERS должна быть первым исполняемым оператором метода или события.

Пример. Определяется процедура, обрабатывающая событие Click – нажатие на левую кнопку мыши.

public frmObject

frmObject = CreateObject('MyForm')

frmObject.Visible = .T. 

define class MyForm as Form

         add object MyButton as CommandButton

         procedure MyButton.Click

                   MessageBox('Нажата левая кнопка мыши!')

         endProc

endDefine

Имена команд ENDFUNC и ENDPROC не сокращаются, чтобы избежать конфликтов с ENDFOR и ENDPRINTJOB.

PEMName_COMATTRIB – создает массив, специфицирующий атрибуты для PEMName-свойства или метода. Эта опция применяется только с OLEPUBLIC-классами и используется для задания дополнительной информации (например описание или задание атрибута "только для чтения") о свойстве или методе, который записывается в библиотеку типа.

PEMName_COMATTRIB может быть либо скаляром, либо массивом. В первом случае задается только флаг атрибута. Во втором PEMName_COMATTRIB создается как одномерный массив, например командой DIMENSION или DECLARE. Число элементов в _COMATTRIB-массиве не может быть больше 5.

Информация, передаваемая элементами _COMATTRIB-массива, приведена в табл. 13.3.

Таблица 13.3

Описание элементов массива PEMName_COMATTRIB

Элемент
_COMATTRIB

Обозначение

Описание

Тип

1

nFlags

Флаги атрибута

Number

2

cHelpString

Строка помощи

String

3

cProperty
Capitalization

Правило употребления прописных букв

String

4

cPropertyType

Тип свойства

String

5

nOptionalParms

Число параметров; если задается значение меньшее фактического числа параметров, то параметры с номерами большими заданного значения являются необязательными

Number

Если элементу массива задается неверное значение, то VFP генерирует ошибку. В случае пустого элемента используется значение по умолчанию.

Свойства, задаваемые _COMATTRIB, автоматически помечаются как скрытые и недоступны в VFP. Они обрабатываются VFP в процессе выполнения команды BUILD при записи в COM-библиотеку типа.

Значения элементов _COMATTRIB-массива:

nFlags – флаги атрибута. Описаны в табл. 13.4.

Таблица 13.4

Флаги атрибута

Значение

#DEFINE

Описание

0x1 (1)

COMATTRIB_RESTRICTED

Свойство (метод) не будет доступно в программах, написанных на языке высокого уровня. Флаг назначается для функций системного уровня или функций, не отображаемых браузером типа

0x40 (64)

COMATTRIB_HIDDEN

Свойство (метод) не доступно для пользователя

0x400 (1024)

COMATTRIB_NONBROWSABLE

Свойство (метод) появляется в браузере объекта, но не появляется в браузере свойств

0x100000
(1048576)

COMATTRIB_READONLY

Свойство доступно только для чтения. Флаг эквивалентен PropertyGet

0x200000
(2097152)

COMATTRIB_WRITEONLY

Свойство доступно только для записи. Флаг эквивалентен PropertyPut

Величина nFlags задается как сумма приведенных в столбце 1 или 2 значений. Указанные в столбце 2 константны определены в файле FoxPro.h.

Одновременное задание двух последних значений равносильно их отсутствию в nFlags.

Компоненты (свойства, методы) с флагом COMATTRIB_RESRICTED интерпретируются как _HIDDEN, например таким средством, как Visual Basic, с тем отличием, что с ними нельзя связать код.

Свойство (метод) с COMATTRIB_HIDDEN не будет отображаться браузером объекта, свойства и т. д. Флаг полезен для удаления компонента из визуального представления модели. С ним может быть связан код, но пользователь не будет знать о существовании компонента.

Раннее и позднее связывания предполагают различные ограничения доступа. В случае раннего связывания клиенты не смогут изменять свойства с флагом "только для чтения" и читать свойство с флагом "только для записи" (поскольку отсутствует вход в таблицу виртуальных функций). При позднем связывании клиенты имеют возможность употреблять PropertyPut или PropertyGet для свойств соответственно с PEMName-флагом "только для чтения" и "только для записи".

cHelpString – строка, с текстом подсказки, указываемая для свойств. Для методов следует использовать опцию HELPSTRING cHelpString.

cPropertyCapitalization – по умолчанию VFP запишет имя свойства в библиотеку типа прописными буквами. Значение задается в виде соответствующей записи имени свойства (метода), например:

MyProperty_COMATTRIB[3] = "MyProperty"         && Прописные и строчные буквы

или

MyProperty_COMATTRIB[3] = "myproperty" && Только строчные буквы

cPropertyType – задается только для свойств. Принимает те же значения, что и параметр Type опции AS.

nOptionalParms – число обязательных параметров. Так, если значение равно 2, а всего параметров 5, то 3 последних являются необязательными. Для поздно связываемых клиентов по умолчанию значение необязательных параметров равно .F., а функция PCOUNT( ), если употреблена, вернет число переданных параметров. Для рано связываемых клиентов по умолчанию значение необязательных параметров равно "", а PCOUNT( ) всегда вернет общее число параметром метода. Применяется только для методов.

Пример 1. Употребляется _COMATTRIB-массив.

&& Включаем FoxPro.h для использования константы COMATTRIB_READONLY

#include FoxPro.h

define class MyClass as Custom OLEPUBLIC

         && Задаем свойство класса

         MyProperty = 5.2

         && Устанавливаем значения COM-атрибутов для свойства MyProperty

         dimension MyProperty_COMATTRIB[4]

         MyProperty_COMATTRIB[1] = COMATTRIB_READONLY

         MyProperty_COMATTRIB[2] = "Текст справки, отображаемый браузером объекта"

         && Прописные и строчные буквы

                                                           MyProperty_COMATTRIB[3] = "MyProperty"

         && Тип данных

         MyProperty_COMATTRIB[4] = "Float"

endDefine

Пример 2. _COMATTRIB употребляется как скалярная величина. Команда DIMENSION не используется.

#include FoxPro.h

define class MyClass as Custom OLEPUBLIC

         && Задаем свойство класса

         MyProperty = 5.2

         && Устанавливаем только значение атрибута nFlags

         MyProperty_COMATTRIB = COMATTRIB_READONLY

endDefine

Команда

ADD CLASS ClassName [OF ClassLibraryName1]
                   TO ClassLibraryName2 [OVERWRITE]

добавляет определение класса в библиотеку классов.

Опции и параметры:

ClassName – имя класса, определение которого добавляется в библиотеку.

OF ClassLibraryName1 – имя библиотеки из которой берется определение класса. Может содержать полный путь и расширение. По умолчанию берется расширение VCX.

Если опция OF опущена, то ClassName ищется в библиотеках, открытых командой SET CLASSLIB. Если определение ClassName не найдено, то генерируется ошибка.

TO ClassLibraryName2 – имя библиотеки, в которую добавляется определение класса ClassName. Если библиотека не существует, то она будет создана.

OVERWRITE – существующее в библиотеке ClassLibraryName2 определение класса ClassName будет перезаписано. Если опция опущена, а библиотека классов уже содержит определение класса ClassName, то будет сгенерирована ошибка.

Команда

MODIFY CLASS ClassName [OF ClassLibraryName1]
                   [AS cBaseClassName [FROM ClassLibraryName2]]
                   [NOWAIT] [METHOD MethodName] [SAVE]

открывает проектировщик класса для интерактивного изменения определения существующего класса или создания определения нового класса.

Опции и параметры (см. также табл. 1.6):

ClassName – имя изменяемого или создаваемого класса.

OF ClassLibraryName1 – имя файла библиотеки, хранящей определение класса.

Если библиотека ClassLibraryName1 не существует, то она будет создана.

AS cBaseClassName – класс, на котором основано определение класса ClassName. Можно задать имя любого базового класса VFP, кроме Column и Header, а также имя пользовательского класса, если задана опция FROM ClassLibraryName2.

Если создается новый класс и опция AS опущена, то в качестве cBaseClassName берется VFP-базовый класс FormSet.

FROM ClassLibraryName2 – имя библиотеки классов, содержащей определение пользовательского класса, заданного параметром cBaseClassName. Может содержать полный путь и расширение. По умолчанию берется расширение VCX.

METHOD MethodName – имя события или метода, окно редактирования кода которого открывается при открытии проектировщика класса. При указании имени MethodName используется применяемый с объектами синтаксис, например при выполнении команды

modify class MyClass of MyClassLibrary method TxtFirstName.Click

открывается окно редактирования события Click элемента управления TxtFirstName класса MyClass библиотеки MyClassLibrary. Если в имени MethodName не будет префикса, то откроется окно редактирования события Click класса MyClass:

modify class MyClass of MyClassLibrary method Click

Замечания:

1. Если имя библиотеки классов имеет пробелы, то оно заключается в кавычки, например:

modify class _folder of "c:\Program Files\Microsoft Visual FoxPro 9\Ffc\_controls"

2. Опции OF и FROM можно опустить, а нужные библиотеки классов открыть командой SET CLASSLIB.

Команда

CREATE CLASS ClassName | ? [OF ClassLibraryName1 | ?]
                   [AS cBaseClassName [FROM ClassLibraryName2]] [NOWAIT]

открывает проектировщик класса для интерактивного создания нового класса. Если вместо ClassName употребляется знак ?, то будет открыт диалог New Class.

Опции и параметры описаны при рассмотрении команды MODIFY CLASS.

Команда

CREATE CLASSLIB ClassLibraryName

создает новую пустую библиотеку классов ClassLibraryName. Имя библиотеки может содержать путь и расширение. По умолчанию берется расширение VCX.

Определение класса добавляется в библиотеку посредством команд ADD CLASS, CREATE CLASS и MODIFY CLASS.

Команда

RENAME CLASS ClassName1 OF ClassLibraryName TO ClassName2

изменяет в библиотеке классов ClassLibraryName имя класса ClassName1 на имя ClassName2.

Если имеются классы, ссылающиеся на имя ClassName1, то эти ссылки нужно не забыть переправить на имя ClassName2.

Команда

REMOVE CLASS ClassName OF ClassLibraryName

удаляет определение класса ClassName из библиотеки ClassLibraryName.

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

Команда

CLEAR CLASS ClassName

удаляет определение класса ClassName из памяти. Определение класса сохраняется в памяти после создания экземпляра объекта. После удаления из памяти экземпляра объекта определение класса все еще остается в памяти. Чтобы его удалить, используется команда CLEAR CLASS.

Команда

CLEAR CLASSLIB ClassLibraryName

удаляет из памяти все определения классов, содержащиеся в библиотеке ClassLibraryName. Если, однако, существует экземпляр какого-либо класса библиотеки, то определение этого класса из памяти удалено не будет. Команда автоматически выполняет команду CLEAR CLASS для каждого класса библиотеки ClassLibraryName. Ошибки, которые могут возникнуть при освобождении класса (например класс используется) игнорируются.

Команда

SET CLASSLIB TO ClassLibraryName [IN APPFileName | EXEFileName]
                   [ADDITIVE] [ALIAS AliasName]

открывает VCX-библиотеку классов, содержащую определения классов.

Опции и параметры:

TO ClassLibraryName – задает имя открываемой VCX-библиотеки классов. Если ClassLibraryName не содержит полного пути, то VFP ищет файл в директории по умолчанию (задается командой SET DEFAULT), а затем в директориях, установленных командой SET PATH.

Выполнение SET CLASSLIB TO без параметра ClassLibraryName, закрывает все открытые библиотеки классов.

IN APPFileName | EXEFileName – задает APP- или EXE-файл, содержащий библиотеку классов.

ADDITIVE – открывает библиотеку классов, не закрывая ранее открытые VCX-файлы. При отсутствии опции все ранее открытые библиотеки будут закрыты.

ALIAS AliasName – задает псевдоним библиотеки классов. Порядок использование псевдонима иллюстрирует следующий пример:

vcxFile = 'c:\Program Files\Microsoft Visual FoxPro 9\Ffc\_utility.vcx'

&& Используем в SET-команде выражение с именем (VcxFile)

set classlib to (VcxFile) alias Util

&& Создаем объект на базе класса _arraylib

oArray = NewObject('util._arraylib')

Команда

RELEASE CLASSLIB ClassLibraryName1 | ALIAS AliasName1
                   [, ClassLibraryName2 | ALIAS AliasName2 …]

                   [IN APPFileName | EXEFileName]

закрывает библиотеку классов.

Смысл опций и параметров см. в описании команды SET CLASSLIB.

Пример:

&& Создаем библиотеку классов

create classlib MyClassLib

&&

&& Открываем проектировщик класса. После создания определение класса

&& можно записать в библиотеку MyClassLib.vcx

create class MyForm of MyClassLib as "Form"

&&

&& Открываем библиотеку классов MyClassLib.vcx

set classlib to MyClassLib additive

&& Закрываем библиотеку классов MyClassLib.vcx

release classlib MyClassLib