Visual FoxPro 9.0 предоставляет для членов класса расширенные атрибуты метаданных. Благодаря новой модели расширяемости, у вас теперь есть возможность расширять функциональность свойств и методов класса, что позволит вам создавать улучшения в design-time, например такие, как приведенные ниже:

Модель расширяемости MemberData

Расширяемость обеспечивается с помощью MemberData, который использует XML-строку для указания установок метаданных для свойств и методов класса.

Настройки, которые вы вводите в _MemberData действуют как на уровне класса, так и на глобальном уровне. Уровень класса всегда замещает глобальный уровень. На уровне класса поддержка обеспечивается с помощью свойства _MemberData. Это свойство содержит XML-строку с реальными метаданными члена. Будучи свойством, оно наследуется и переписывается субклассами. На глобальном уровне, MemberData указывается в специальных записях таблицы Foxcode.dbf.

Наследование MemberData

Структура наследования для MemberData перемещается по следующему пути:

  Скопировать код
Class -> Container -> Global

Поведение наследования схоже (но не тоже самое) со стандартным наследованием в объектно-ориентированном программировании. Visual FoxPro сначала будет искать MemberData на уровне класса вплоть до родителя, от которого класс наследует. Если конкретный атрибут или тэг MemberData не найден, тогда исследуется иерархия внутри контейнера (от внутреннего контейнера к внешнему). И, наконец, если поиск не дал результата на уровне контейнеров, тогда MemberData ищется на глобальном уровне (в таблице, указанной в системной переменной _FOXCODE). Важно понять, что поиск осуществляется для конкретного атрибута или тэга внутри XML-строки MemberData (а не просто существования MemberData самого по себе). Вследствие этого, имеется возможность иметь MemberData, который охватывает множество размещений. Приведенный ниже пример иллюстрирует это.

Форма (Myform) содержит страничный фрейм (Mypageframe), в котором имеется командная кнопка (Mycmd), которая наследует из класса _commandbutton, определенного в библиотеке _base.vcx (помещенной в каталог FFC/), который в свою очередь имеет свойство, определенное как “Myprop” c ассоциированными с ним метаданными, размещенными в MemberData. Иерархия MemberData для Myprop выражается следующим образом:

  Скопировать код
** Уровень класса - Mycmd (Myclasses.vcx)
<memberdata name="Myprop" display="MYProp" type="property"/>

** Уровень родительского класса - _commandbutton (_base.vcx)
<memberdata name="Myprop" display="MYPROP" type="property"/>

** Уровень внутреннего контейнера - mypageframe (myclasses.vcx)
<memberdata name="Myprop" favorites="True" display="myPRop" type="property"/>

** Уровень внешнего контейнера - myform (myclasses.vcx)
<memberdata name="Myprop" favorites="False" helpfile="Myhelp.chm" type="property"/>

** Глобальный уровень - foxcode.dbf
<memberdata name="Myprop" type="property" display="MYPROP" script="DO (_CODESENSE) WITH 'RunPropertyEditor','','MYPROP'"/>

Основанное на приоритете (Class -> Container -> Global), текущее значение установок MemberData для Myprop является следующим:

  Скопировать код
display="MYProp"
favorites="True"
script="DO (_CODESENSE) WITH 'RunPropertyEditor','','myprop'"
helpfile="myhelp.chm"   &&(замечание: это атрибут, определенный пользователем)

Замечания

MemberData может содержать XML-строку со структурой, определяемой с помощью схемы MemberData XSD Schema описанной ниже.

MemberData является регистро-чувствительным (case-sensitive). Атрибуты, такие как Favorites должны быть указаны как “favorites.” Значения также являются регистро-чувствительной (case-sensitive) (например, favorites=”True”).

Не требуется, чтобы MemberData было установлено для каждого определенного атрибута или тэга. Если конкретный запрашиваемый атрибут или тэг MemberData не найден на текущем уровне, ищутся прочие MemberData вдоль пути наследования.

Если XML выражение MemberData содержит установленным в True атрибут Override, то дополнительный поиск вдоль пути наследования останавливается на этой точке.

Если MemberData содержит недействительное XML выражение, то оно игнорируется целиком и поиск продолжается вдоль пути наследования.

Если вход в MemberData не содержит действительной (в смысле- правильной) величины (например, favorites=”123”), то этот вход игнорируется. Однако и поиск на этом прекращается (аналогично, как если бы имели атрибут Override установленный в True).

FOXCODE.dbf, Глобальное хранилище

FOXCODE.dbf, глобальное хранилище, представляет собой таблицу Visual FoxPro, которая хранит информацию для IntelliSense. Если свойство или метод определенный в свойстве _MEMBERDATA не может быть найден в дереве наследования, то поиск продолжается в FOXCODE.dbf. Так как FOXCODE.dbf является глобальным хранилищем, любая установка свойства или метода применяется ко всем свойствам и методам Visual FoxPro, за исключением случая, когда свойство _MEMBERDATA используется отмены, игнорирования или замещения установок, прописанных в таблице FOXCODE.dbf.

Замечание:
Для событий, единственным распознаваемым атрибутом является атрибут "favorites". Атрибут "favorites" определяет - будет ли свойство, метод или событие отображено на закладке "Favorites" окна "Properties".

FOXCODE.dbf MEMBERDATA формат

Приведенная ниже таблица описывает формат, в котором информация для MemberData хранится в таблице FOXCODE.dbf. Каждый вход в MemberData требует единичной записи с типом поля Type установленным в "E."

Имя поля Значение Описание

Type

E

 

Abbrev

<name>

Имя поля, события1, или метода.

Cmd

{command}

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

Tip

 

MemberData XML-строка для свойства или метода.

Data

 

Содержит скрипт для запуска пользовательского (custom) редактора свойства.

1 Для событий хранится только атрибут favorites. Атрибут определен в MemberData XML-строке в поле Tip.

Определения для содержания MemberData XML

Приведенная ниже таблица перечисляет зарезервированные элементы и атрибуты XML распознаваемые Visual FoxPro 9.0.

Замечание:
Вы можете включить MemberData XML со своими собственными элементами и атрибутами, которые Visual FoxPro будет хранить, но в то же время игнорировать.

Элемент Аттрибут Родитель Description

VFPData

 

 

Корневой элемент обозначающий метаданные для класса.

memberdata

 

VFPData

Элемент, содержащий метаданные для определенного члена. Член определен, как свойство или метод.

memberdata

name

 

Имя члена (например, Caption или MyProperty).

memberdata

type

 

Property или Method.

memberdata

display

 

Визуальное представление члена. Эта установка воздействует на отображение имени как в окне "Properties", так и в IntelliSense.

memberdata

favorites

 

True или False.

memberdata

override

 

True или False.

memberdata

script

 

Скрипт метода для исполнения.

MemberData XSD Schema

Ниже приведена схема MemberData XSD schema, которую использует Visual FoxPro. В схему включено описание специальных атрибутов.

Note:
Схема VFP MemberData, показанная ниже включает два варианта документа MemberData: последовательность элементов memberdata поддерживаемых для использования с классами Visual FoxPro и последовательность элементов reportdata поддерживаемых для использования в системе производства отчетов Visual FoxPro. Visual FoxPro не использует элементы reportdata напрямую, но параллельная разработка документа позволяет вам использовать похожий механизм для разбора обоих типов расширений и хранения их в общем глобальном хранилище. Подобно memberdata класса, MemberData для отчетов может быть использовано как в среде разработки (design time) так в run time. Для получения подробной информации обратитесь к статье Расширения XML MemberData отчета.

  Скопировать код
<?xml version="1.0" encoding="utf-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" 
  elementFormDefault="qualified" attributeFormDefault="unqualified">
 <xs:element name="VFPData">
  <xs:complexType>
   <xs:choice>
    <xs:sequence>

     <xs:element name="reportdata" maxOccurs="unbounded">
      <xs:complexType>
       <xs:attributeGroup ref="Common"/>
       <xs:attributeGroup ref="ReportTemplate"/>
       <xs:anyAttribute processContents="lax"/>
      </xs:complexType>
     </xs:element>
    </xs:sequence>
    <xs:sequence>
    
     <xs:element name="memberdata" maxOccurs="unbounded">
      <xs:complexType>
       <xs:attributeGroup ref="Common"/>
       <xs:attributeGroup ref="PropertySheet"/>
       <xs:anyAttribute processContents="lax"/>
      </xs:complexType>
     </xs:element>

    </xs:sequence>
   </xs:choice>
  </xs:complexType>
 </xs:element>
 
 <xs:annotation>
  <xs:documentation>
  Вы может добавить атрибуты расширения, если потребуется.
  </xs:documentation>
  <xs:documentation>
Используйте атрибуты name и ref в группе Common attribute для декларирования 
что определенные строки "принадлежат" вам. Используйте атрибут script 
группы Common attribute для исполнения в среде разработки (design-time scripting).
  </xs:documentation>
   </xs:annotation>
   
 <xs:attributeGroup name="Common">
  <xs:attribute name="name" type="xs:string" use="required"/>
  <xs:attribute name="type" type="xs:string"/>
  <xs:attribute name="script" type="xs:string"/>
 </xs:attributeGroup>

<xs:annotation>
<xs:documentation>
Относящиеся к ReportTemplate атрибут execute представляет собой скрипт, исполняемый в
runtime (с помощью Listeners), тогда как атрибуты Common script исполняются, по возможности,
инструментами среды разработки (design-time). Атрибуты declass и declasslib 
предназначены для поиска информации в заголовочных записях шаблонов, 
и не конкретных записей, относительно объекта DataEnvironment.
Атрибуты class и classlib attributes в заголовочной записи не используются,
и могут быть по желанию использованы как средство для пользовательского вспомогательного класса
предназначенного для построителя отчета или listeners. 
Атрибуты class и classlib attributes в объектах раскладки являются средством
для использования в подготовке шаблонов в run-time и design-time. 
Вы можете использовать эти шаблоны классов для строительства пользовательских
объектов разбора в runtime или присвоить атрибуты общего стиля в design-time
или обоих. 
</xs:documentation>
 </xs:annotation>

 <xs:attributeGroup name="ReportTemplate">
  <xs:attribute name="class" type="xs:string"/>
  <xs:attribute name="classlib" type="xs:string"/>
  <xs:attribute name="declass" type="xs:string"/>
  <xs:attribute name="declasslib" type="xs:string"/>
  <xs:attribute name="execute" type="xs:string"/>
  <xs:attribute name="execwhen" type="xs:string"/>
 </xs:attributeGroup>
 
 
 <xs:attributeGroup name="PropertySheet">
  <xs:attribute name="override" type="xs:boolean"/>
  <xs:attribute name="display" type="xs:string"/>
  <xs:attribute name="favorites" type="xs:boolean"/>
 </xs:attributeGroup>

</xs:schema>

Пример MemberData

Приведенное ниже является примером MemberData XML-строки, которая демонстрирует использование зарезервированных Visual FoxPro 9.0 XML элементов и атрибутов. Первая секция добавляет свойство BorderStyle в закладку "Favorites" в окне "Properties" и отображает имя свойства в верхнем регистре.

Вторая секция создает пользовательское свойство, именованное как "MyProperty", которое также вводится в закладку "Favorites" в окне "Properties". Скрипт, названный MyPropertyScript исполняется, когда производится щелчок по кнопке с тремя точками или когда производится двойной щелчок на свойстве в окне "Properties".

  Скопировать код
<?xml version="1.0" encoding="Windows-1252" standalone="yes"?>
<VFPData>
<memberdata name="borderstyle" type="property" favorites="True" display="BORDERSTYLE"override="False"/>
<memberdata name="MyProperty" type="property" display="MyProperty" favorites="True" override="False" script="MyPropertyScript"/>
</VFPData>

Пользовательские (Custom) редакторы свойства

В Visual FoxPro 9.0 вы можете создать свой собственный (custom) редактор свойства. Ваш собственный редактор может быть запущен либо выбором свойства в окне "Properties" с последующим щелчком по кнопке (…), либо путем производства двойного щелчка по свойству. Если свойство представляет собой пользовательское свойство, то в окне "Properties" отображается только кнопка с тремя точками.

Visual FoxPro поддерживает редакторы пользовательских свойств следующим образом:

  • Когда окно "Properties" открыто, Visual FoxPro ищет свойство _MemberData и его дерево наследования. Если значение для атрибута "script" существует для выбранного свойства и сам скрипт является действительным, то отображается кнопка с тремя точками.

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

  • Пользовательские (custom) и родные свойства Visual FoxPro могут иметь пользовательские редакторы. Для родных свойств Visual FoxPro, скрипт должен вернуть соответствующий тип данных и значение для свойства, в противном случае будет сгенерирована ошибка.

  • Пользовательский (custom) редактор свойства не будет принимать во внимание наличие родного редактора Visual FoxPro (например, использования Color Picker для установки свойства ForeColor).

  • Подобно приложениям построителей Visual FoxPro, пользовательский редактор свойства ответственен за установку корректной величины для значения свойства. Пользовательский редактор свойств должен использовать функцию ASELOBJ( ) для получения ссылки на выбранный объект или объекты. Пользовательский редактор свойств должен работать схожим образом с приложениями построителей Visual FoxPro, и должен прятать окно "Properties" если оно не состыковано с другими окнами или инструментами. Для получения подробной информации о приложениях пользовательских построителей обратитесь к статье Как: указать приложение построителя с помощью Builder.dbf.

Перехватчики событий меню редактора пользовательского свойства (Custom Property Editor Menu Hooks)

Вы можете запустить свой собственный (custom) редактор свойства, когда вы выбираете опцию "MemberData Editor…" из системного меню "Form" или когда вы производите щелчок по правой клавише мыши на свойстве, событии или методе с последующим выбором опции "Add to Favorites…" в контекстном меню.

Когда вы выбираете опцию "MemberData Editor…" из системного меню Form, приложению, указанному в системной переменной _BUILDER, посылаются четыре параметра. В приведенной ниже таблице описываются типы данных, посылаемых приложению построителя в качестве параметров.

Номер параметра Описание

1

Ссылка на объект (контейнер) верхнего уровня.

2

Текстовая строка "MemberData".

3

Численное значение, 0 - для дизайнера класса, 1 - для дизайнера формы.

4

Имя свойства, события или метода, выбранное как строка текста.

Например, выбор опции "MemberData Editor…" из системного меню Form идентично исполнению следующей команды:

  Скопировать код
DO (_BUILDER) WITH oForm, "MemberData", 1

Если ни одно свойство не выбрано или окно "Properties" закрыто, последний параметр будет содержать пустую строку. Если окно "Properties" закрыто, то в качестве первого параметра будет послан базовый объект. Если выбрано несколько объектов, только первый из них посылается в качестве первого параметра.

Когда вы выбираете опцию "Add to Favorites…" из контекстного меню, то приложению, указанному в системной переменной _BUILDER посылается четыре параметра. Приведенная ниже таблица описывает тип данных, посылаемых в качестве параметров приложению построителя.

Параметр Описание

1

Ссылка на объект (контейнер) верхнего уровня.

2

Текстовая строка "MemberData".

3

Численное значение, 10 - для дизайнера класса, 11 - для дизайнера формы.

4

Имя свойства, события или метода, выбранного как строка текста.

Например, выбор опции "Add to Favorites…" из контекстного меню, в случае если выбрано свойство "Caption" в окне "Properties" идентично выполнению следующей команды:

  Скопировать код
DO (_BUILDER) WITH oForm, "MemberData", 11, "Caption"
Note:
Опция "Add to Favorites…" контекстного меню недоступна в случае, если окно "Properties" открыто для системной переменной приложения _SCREEN Visual FoxPro.

MemberDataEditor.app

Visual FoxPro включает в себя приложение Member Data Editor - MemberDataEditor.app, которое позволяет вам легко редактировать метаданные членов для свойств, событий и методов. Когда окно "Properties" открыто, вы можете запустить приложение MemberDataEditor.app выбором опции "MemberData Editor…" из системного меню Form.

Приложение MemberDataEditor.app позволяет вам сделать следующее:

  • Создать MemberData для свойства или метода.

  • Определить, является ли MemberData глобальной (MemberData прописан в таблице FoxCode.dbf).

  • Определить, будет ли MemberData замещать глобальные атрибуты MemberData.

  • Определить, будет ли использоваться поведение по умолчанию для неопределенных атрибутов свойств и методов.

  • Добавлять свойства, события и методы в закладку "Favorites" окна "Properties".

  • Создавать скрипт (программный код Visual FoxPro) для свойства или метода.

  • Определять, как будет свойство или метод будут отображаться в окне "Properties" и определять отображение по умолчанию.

  • Определять, как были сформатированы элементы XML.

За более подробной информацией обратитесь к статье Редактор MemberData.

Перехватчики событий скриптов Foxcode.dbf

В таблицу FoxCode.dbf, определяемую системной переменной _FOXCODE, содержащую специальные скрипты (программные коды Visual FoxPro), вызываемые во время разработки приложений (design time) может быть добавлено несколько новых записей скриптов.

Замечание:
Эти записи скриптов не включены в таблицу, используемую по умолчанию и определяемую системной переменной _FOXCODE. Вы можете найти скрипты для меню Visual FoxPro в приложении "Solution Samples" в ветке "New in Visual FoxPro 9.0". За получением подробной информации обратитесь к статье Как: запустить образцы решений Visual FoxPro.

Скрипт _GetMemberData

Скрипт _GetMemberData может быть использован в качестве пользовательского редактора для добавления свойства _MEMBERDATA контейнеру или элементам (controls) когда они открыты в дизайнерах формы или класса. Скрипт вызывается для следующих событий:

  • Когда открывается дизайнер формы или класса.

  • Когда вводится новый элемент (control) в дизайнере формы или класса.

  • Когда элемент (control) выбран в дизайнере формы или класса или в контейнере, на нем был выполнен щелчок мышью для его выбора.

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

Имя поля Значение Описание

Type

E

Определяет что предмет записи представляет собой свойство или метод, которые имеют метаданные члена.

Abbrev

_GETMEMBERDATA

Указывает, что это запись для скрипта _GetMemberData.

Data

 

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

Скрипт _GetMemberData не получает никаких параметров.

Замечание:
Скрипт _GetMemberData может использовать функцию ASELOBJ для получения ссылка на объект текущего выбранного элемента (control) или контейнера.

Скрипт MenuHit

Скрипт MenuHit вызывается в случае, если совершен выбор из системного меню Visual FoxPro. Он может быть использован для замещения существующего диалогового блока Visual FoxPro пользовательским диалоговым блоком.

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

Имя поля Значение Описание

Type

S

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

Abbrev

MENUHIT

Указывает, что это запись для скрипта MenuHit.

Data

 

Собственно скрипт (программный код Visual FoxPro) для запуска пользовательского диалогового блока.

Скрипт MenuHit получает два параметра в виде символьных строк:

Параметр Описание

UserTyped

Внутренний (имя системного меню Visual FoxPro) титул системного меню, из которого был выбран пункт. В случае, если меню представляет собой контекстное меню (shortcut menu) параметры посылается пустая строка.

MenuItem

Внутреннее (имя системного меню Visual FoxPro) имя выбранного пункта меню.

Смотри статью Имена системного меню (System Menu Names), в которой перечислены внутренние имена системного меню Visual FoxPro.

Для того чтобы не допустить обработку меню самим Visual FoxPro, установите параметр для свойства ValueType объекта в значение V или L.

Замечание:
Поскольку _Foxcode поддерживает только одну запись скрипта для MenuHit и, в принципе, возможно, что вы пожелаете обрабатывать множественные пункты меню вашим собственными пользовательскими скриптами, рекомендуется, чтобы вы создали запись обработчика MenuHit, который будет использоваться по умолчанию и который сможет вызывать другие записи скриптов. Образец решения "Foxcode menu scripts" содержит рекомендованный общий скрипт Menuhit, который вы можете использовать для своих целей.

Ниже приведен пример скрипта для записи MenuHit, который вы можете использовать для поиска других записей в _Foxcode, у которых Type field = "M", поле Abbrev содержит имя меню и поле Data содержит скрипт для исполнения. Это один и тот же скрипт, который используется в качестве скрипта как для MenuHit, так и для MenuContext в образце решения "Foxcode menu scripts".

  Copy Code
LPARAMETERS toParameter

LOCAL lnSelect, lcCode, llReturn, lScriptHandled, lcSaveUdfParms
TRY
* First try FoxCode lookup for Type="M" records
lnSelect = SELECT()
SELECT 0
USE (_FOXCODE) AGAIN SHARE ORDER 1
IF SEEK('M' + PADR(UPPER(toParameter.MenuItem), LEN(ABBREV)))
lcCode = DATA
ENDIF
USE
SELECT (lnSelect)
IF NOT EMPTY(lcCode)
llReturn = EXECSCRIPT(lcCode, toParameter)
lScriptHandled=.T.
ENDIF

* обработка путем направления к внешней процедуре, как указано в поле Tip
IF !lScriptHandled
lcProgram = ALLTRIM(toParameter.Tip)
IF FILE(lcProgram)
lcSaveUdfParms=SET("Udfparms")
SET UDFPARMS TO REFERENCE
DO (lcProgram) WITH toParameter,llReturn
SET UDFPARMS TO &lcSaveUdfParms
ENDIF
ENDIF

* Пользовательский скрипт удачен, а поэтому запретим природное поведение
IF llReturn
toParameter.ValueType = 'V'
ENDIF
CATCH
ENDTRY

RETURN llReturn

Скрипт MenuContext

Скрипт MenuContext может быть использован для замещения существующего контекстного меню Visual FoxPro пользовательским контекстным меню и он вызывается как раз до отображения контекстного меню Visual FoxPro. Контекстное меню (shortcut menu) отображается путем щечка по правой клавише мыши на окне или объекте.

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

Имя поля Значение Описание

Type

S

Указывает что предмет записи представляет собой скрипт.

Abbrev

MENUCONTEXT

Указывает, что это скрипт записи MenuContext.

Data

 

Собственно скрипт (программный код Visual FoxPro) запускаемый для пользовательского контекстного меню (shortcut menu).

Скрипту MenuContext посылается единственный параметр, представляющий собой объект, содержащий свойства, которые с помощью скрипта могут быть доступны как ссылки, включая следующие:

Параметр Описание

Items

Массив пунктов контекстного меню.

UserTyped

Указывает дополнительную информацию, если она доступна, связанную с содержанием контекстного меню.

MenuItem

Внутренний ID меню Visual FoxPro для контекстного меню.

Для подавления отображения контекстного меню Visual FoxPro, установите параметр свойства ValueType объекта в V или L. Вы можете использовать команду DEFINE MENU с опцией SHORTCUT для создания своего пользовательского контекстного меню.

Замечание   Поскольку _Foxcode поддерживает только одну запись скрипта для MenuContext и, в принципе, возможно, что вы пожелаете обрабатывать множественные контекстные меню вашим собственными пользовательскими скриптами, рекомендуется, чтобы вы создали запись обработчика MenuContext, который будет использоваться по умолчанию и который сможет вызывать другие записи скриптов. Образец решения "Foxcode menu scripts" содержит рекомендованный общий скрипт MenuContext, который вы можете использовать для своих целей. Вернитесь к секции, описывающей скрипт MenuHit и посмотрите на приведенный там программный код

Смотри также