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

Объекты в Microsoft Visual FoxPro

« Назад

В общем случае объект обладает, свойствами, методами и может распознавать различные события, например Load или Init (первое возникает перед созданием объекта, а второе – при его создании).

Свойство – это компонент объекта. Совокупность всех свойств и их значений характеризует состояние объекта.

Метод – это действие, которое может выполнять объект.

Событие – это действие, распознаваемое объектом, например щелчок мышью или нажатие клавиши. Событие является методом, вызываемым объектом.

Функция

CREATEOBJECT(ClassName [, eParameter1, eParameter2, ...])

создает объект как экземпляр класса ClassName. Создаваемый объект может быть объектом Автоматизации (OLE-объектом).

Функция возвращает ссылку на созданный объект. Тип возвращаемого значения – Object.

Параметры:

ClassName – класс VFP или класс OLE-объекта, на базе которого создается новый объект.

При создании объекта VFP ищет класс или OLE-объект в следующем порядке:

базовые классы VFP;

классы, определенные в текущей программе посредством DEFINE CLASS;

классы в VCX-библиотеках классов, открытых SET CLASSLIB;

классы в файлах с процедурами, открытых SET PROCEDURE;

классы в последовательности исполняемых программ;

OLE-регистр, если SET OLEOBJECT установлен в ON.

Замечание. Такой же порядок поиска библиотеки классов VFP использует и при выполнении команды ADD OBJECT в DEFINE CLASS, метода AddObject и функции NEWOBJECT( ). Если описание класса не может быть найдено, то VFP генерирует ошибку.

При создании OLE-объекта для ClassName используется следующий синтаксис:

ApplicationName.Class

Пример. Создается книга Microsoft Excel и в каждом листе книги его первая ячейка получает значение 100.

&& Не забываем установить SET OLEOBJECT в ON

set oleobject on

oleApp = CreateObject("Excel.Application")

oleApp.WorkBooks.Add

oleWkb = oleApp.Workbooks.Item(1)

for each sheet in oleWkb.Sheets

sheet.Cells(1, 1).Value = 100

next

oleApp.Visible = .T.           && Запускаем Microsoft Excel

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

oleWkb.Sheets.Item(1).Cells(1, 1).Value = 100

Замечание. Параметр ClassName не может быть OLE Container Control базовым классом.

eParameter1, eParameter2, ... – необязательные параметры, используемые для передачи значений процедуре-обработчику события Init. Параметры используются, как правило, для инициализации объекта. Число параметров eParameter не может быть более 25.

Возвращаемое функцией CREATEOBJECT( ) значение содержит ссылку на созданный объект. Полученная ссылка присваивается переменной или элементу массива.

Завершив работу с объектом, переменную, хранящую ссылку на объект, можно удалить из памяти, употребив команду RELEASE.

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

Пример. Создается объект (форма) как экземпляр VFP-базового класса Form. После создания формы:

1) изменяются ее размеры (свойства Height и Width формы);

2) задается заголовок формы (свойство Caption);

3) устанавливается в качестве текущего зеленый цвет (свойство ForeColor);

4) рисуется окружность (вызывается метод Circle формы);

5) форма открывается модально (метод Show вызывается с аргументом 1).

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

oForm = CreateObject('Form')

&& Изменяем его размеры

oForm.Height = 150

oForm.Width = 200

&& Заголовок формы

oForm.Caption = "Окружность"

&& Задаем текущий цвет (зеленый)

oForm.ForeColor = RGB(0, 255, 0)

&& Чертим окружность в центре формы; радиус окружности равен 50

oForm.Circle(50, oForm.Width / 2, oForm.Height / 2)

&& Открываем форму модально

oForm.Show(1)

&& Удаляем из памяти переменную oForm после закрытия формы

release oForm

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

185.1.-Форма-oForm

Рис. 13.3. Форма oForm

Замечание. Значение свойства ForeColor сформировано функцией RGB( ), принимающей в качестве параметров значения отдельных компонентов цвета – красного, зеленого и синего.

Команда

SET OLEOBJECT ON | OFF

задает, будет ли VFP искать объект в OLE-регистре, если объект не найден в доступных классах. Порядок поиска объекта см. в описании функции CREATEOBJECT( ).

Поиск выполняется, если команда установлена в ON (по умолчанию), и не выполняется, если – в OFF.

Объект может быть создан функциями CREATEOBJECT( ), GETOBJECT( ) и NEWOBJECT( ).

Перед поиском объекта в регистре VFP загружает поддержку COM-объектов и увеличивает объем отводимой под VFP памяти. Если приложению COM-поддержка не нужна, то для его оптимизации SET OLEOBJECT следует установить в OFF.

Установка SET OLEOBJECT не влияет на COM-объекты в формах и general-полях. VFP всегда загружает COM-поддержку, когда открывается форма с COM-объектом (для модификации или исполнения) или когда открывается таблица с general-полем.

Функция

NEWOBJECT(cClassName [, cModule [, cInApplication
                   [, eParameter1, eParameter2, ...]]])

создает новый объект на основе базового класса VFP или класса VCX-файла библиотеки визуальных классов, или программного файла VFP, не открывая файл, или класса OLE-объекта.

Функции возвращает ссылку на созданный объект, имеющую тип Object.

Параметры:

cClassName – имя класса, на основе которого создается объект.

cModule – имя VCX-файла или VFP программного файла (PRG, FXP, MPR, APP, EXE и т. д.), содержащего класс или объект, заданный cClassName. По умолчанию, если не указано расширение, берется VCX-файл. Если библиотека классов имеет псевдоним, то его можно использовать для задания cClassName, предваряя псевдонимом и точкой имя класса.

Если параметр cModule опущен, то VFP ищет класс в порядке, приведенном при описании функции CREATEOBJECT( ).

cInApplication – приложение VFP (APP- или EXE-файл), содержащее VCX-файл, заданный в cModule. В случае APP-файла нужно задать расширение. Параметр игнорируется, если параметр cModule опущен или если cInApplication – это пустая строка или NULL-значение. Параметр cInApplication может быть использован, только если в качестве cModule указан VCX-файл.

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

При обращении к NEWOBJECT( ) VFP выполняет SET CLASSLIB или SET PROCEDURE для 2-го или 3-го параметра функции, используя опцию ADDITIVE, или, если параметры уже имеются в списке SET CLASSLIB или SET PROCEDURE, устанавливают их в его начало. После поиска класса, создания объекта и вызова Init-обработчика VFP возвращается к оригинальному списку SET CLASSLIB или SET PROCEDURE, если он не был изменен программно в процессе создания объекта.

При создании OLE-объекта для ClassName используется такой же, что и в случае CREATEOBJECT( ) синтаксис.

Пример 1. Используется функция NEWOBJECT( ) вместо CREATEOBJECT( ).

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

oForm = NewObject('Form')

&& Далее см. пример для CREATEOBJECT( )

Пример 2. Создается объект на основе класса _arrayLib библиотеки c:\Program Files\Microsoft Visual FoxPro 9\Ffc\_utility.vcx. Этот класс в частности имеет метод

DelAItem(@aArray, wziRow)

удаляющий из массива aArray, элемент с номером wziRow.

В примере этот метод употребляется для удаления 3-го элемента массива someArray.

&& Создаем одномерный массив из 5-и элементов

declare someArray(5)

store 9 to someArray

&& Инициализация массива someArray

someArray(3) = –4

display memory like someArray

&&

&& Массив someArray до удаления 3-го элемента: 9  9   –4  9  9

&&

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

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

oArray = NewObject('_arrayLib', vcxFile)

&& Обеспечиваем передачу параметра someArray по ссылке

set udfparms to reference

&& Удаляем 3-й элемент массива someArray

oArray.DelAItem(someArray, 3)

display memory like someArray

&&

&& Массив someArray после удаления 3-го элемента: 9  9  9  9

&&

&& Удаляем из памяти переменную oArray

release oArray

Пример 3. Файл d:\MessFile.prg содержит определение класса SendMess, имеющего свойство MessText и метод MessToYou. В текущей программе создается объект этого класса, определяется значение его свойства и вызывается его метод.

&& Файл d:\MessFile.prg

&& Определяем класс с одним свойством и одним методом

define class SendMess as Custom

                                            && Свойство MessText

                                            MessText = ""

                                            &&

                                            && Метод MessToYou

                                            procedure MessToYou

                                               MessageBox(This.MessText)

                                            endProc

endDefine

Код исполняемой программы:

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

oMess = NewObject('SendMess', 'd:\MessFile.prg')

&& Определяем значение свойства MessText и выводим сообщение,

&& вызывая метод MessToYou; выводимое сообщение см. на рис. 13.4

oMess.MessText = 'Пример для NewObject.'

oMess.MessToYou

&& Удаляем из памяти переменную oMess

release oMess

185.2.-Сообщение-объекта-oMess

Рис. 13.4. Сообщение объекта oMess

Функция

COMPOBJ(oExpression1, oExpression2)

сравнивает свойства двух объектов и возвращает .T., если свойства и их значения совпадают.

Параметры:

oExpression1, oExpression2 – ссылки на сравниваемые объекты. Тип параметров – Object.

Функция

ADDPROPERTY(oObjectName, cPropertyName, [, eNewValue])

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

Новое свойство всегда добавляется как Public.

Свойство может быть добавлено объектам, созданным на основе классов VFP, COM-классов и командой SCATTER NAME; также oObjectName может быть ссылкой на системные переменные _VFP и _SCREEN.

Функция вернет .T., когда свойство успешно добавлено, или .F. – в противном случае.

Параметры:

oObjectName – ссылка на объект, в который добавляется свойство. Тип параметра – Object.

cPropertyName – имя добавляемого свойства. Свойство может быть как скаляром, так и массивом. Может совпадать с именем уже существующего свойства.

eNewValue – значение, которое получает свойство.

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

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

Если новое свойство – это свойство-массив и оно уже существует, функция изменяет форму массива в соответствии в установкой cPropertyName. Если задан параметр eNewValue, то все элементы массива получат значение eNewValue, если параметр eNewValue опущен, то все элементы будут равны .F.

Если новое свойство – это скаляр, а существующее с тем же именем свойство – это массив, то форма массива не меняется. Значение его элементов будет равно либо, eNewValue, если этот параметр задан, либо .F. – в противном случае.

Если новое свойство совпадает с существующим и последнее является Hidden или Protected или имеет статус "только для чтения", то в первом случае VFP генерирует ошибку "Property name is not found (Error 1734)", а во втором – "Property name is read-only (Error 1743)".

Если объект является экземпляром класса VFP и его встроенный метод AddProperty является Hidden или Protected, то функция ADDPROPERTY( ) не создаст нового свойства и вернет .F. Если метод AddProperty является Public (по умолчанию), то функция ADDPROPERTY( ) добавит свойство и вернет .T.

Функция ADDPROPERTY(Var, …) не работает внутри цикла FOR EACH Var, использующего в качестве параметра цикла Var ссылку на объект, однако метод AddProperty может быть в таком цикле использован.

Примеры см. в описании функции REMOVEPROPERTY( ).

Функция

REMOVEPROPERTY(oObjectName, cPropertyName)

удаляет из объекта oObjectName на этапе исполнения программы его свойство cPropertyName. Тип первого параметра – Object, второго – Character.

Функция вернет .T., если действие выполнено успешно, или .F. – в противном случае.

Параметр oObjectName может быть ссылкой на объект, основанный на классе VFP, COM-классе, созданный командой SCATTER NAME, а также именем системной переменной _VFP или _SCREEN.

Удаляемое свойство должно быть добавлено в экземпляр объекта на этапе исполнения либо функцией ADDPROPERTY( ), либо методом AddProperty, либо командой SCATTER NAME. Такие свойства, напомним, являются Public.

Свойства, заданные в определении класса, функцией REMOVEPROPERTY( ) не удаляются.

Пример 1. Добавляется и удаляется свойство объекта, созданного командой SCATTER NAME.

select Books

scatter name oBook

AddProperty(oBook, "SomeProperty")

RemoveProperty(oBook, "SomeProperty")

Пример 2. Добавляется свойство-массив. Изменяется значение его второго элемента. Затем свойство-массив удаляется.

oMyForm = CreateObject('Form')

AddProperty(oMyForm, 'MyArray(2)', 1)

oMyForm.MyArray(2) = "Два"

? oMyForm.MyArray(1)     && Напечатает: 1

? oMyForm.MyArray(2)     && Напечатает: Два

RemoveProperty (oMyForm, 'MyArray')

release oMyForm

Команда

WITH ObjectName [AS Type [OF ClassLibrary]]
                   [.cStatements]
         ENDWITH

позволяет задать значения нескольких свойств объекта.

Параметры:

ObjectName – ссылка на объект, свойства которого задаются.

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

Смысл опций и параметров [AS Type [OF ClassLibrary]] см. в описании конструкции FOR EACH ... ENDFOR.

Внутри конструкции WITH ... ENDWITH могут выполняться также и методы.

Пример (приводится в справке VFP):

oEmployee = CreateObject('Employee')

with oEmployee

                                            .First_Name = 'John'

                                            .Last_Name = 'Smith'

                                            .Address = '16 Maple Lane'

                                            .HireDate = {^1998–0 2–16}

endWith

&&

clear

? oEmployee.First_Name + ' ' + oEmployee.Last_Name

? oEmployee.Address

? oEmployee.HireDate 

define class Employee as Custom

                                            First_Name = Space(20)

                                            Last_Name = Space(20)

                                            Address = Space(30)

                                            HireDate = { – – }

endDefine

Печатаемый результат:

John Smith

16 Maple Lane

02.16.1998

Замечание. Конструкция WITH ... ENDWITH может быть вложенной. Пример см. в разд. 2.5.4.3.

Метод

Object.AddObject(cName, cClass [, cOLEClass] [, aInit1, aInit2 ...])

добавляет на этапе исполнения объект в объект-контейнер.

Параметры:

cName – строка, содержащая имя нового объекта.

cClass – класс добавляемого объекта.

cOLEClass – OLE-класс добавляемого объекта.

aInit1, aInit2 – параметры, передаваемые событию Init нового объекта.

Вызов AddObject приводит к возникновению события Init добавляемого объекта. Если в набор форм добавляется форма, то перед событием Init происходит событие Load.

При добавлении объекта его свойство Visible принимает значение .F., поэтому задание других свойства объекта, например определяющих его размер, положение или цвет, осуществляется без отображения промежуточных состояний объекта.

Если метод AddObject используется для добавления ActiveX-элемента управления, для употребления которого требуется наличие лицензии, то на компьютере, не имеющем такой лицензии, приложение функционировать не сможет.

Избежать подобных проблем можно, предварительно создав соответствующий подкласс с нужным элементом управления в VCX-библиотеке классов, а затем применять AddObject, добавляя на этапе исполнения объект созданного подкласса. При этом не следует забывать, что ActiveX-элемент управления может использовать для своих целей другие файлы.

Пример 1. В форму добавляется счетчик. Показание счетчика используется для задания размера радиуса окружности, выводимой методом Circle формы.

public oForm

oForm = CreateObject('Form')

oForm.AddObject('Spn', 'SpinnerClass')

oForm.Show                       && Отображаем форму

&& Располагаем счетчик по центру формы

oForm.Spn.Top = oForm.Height / 2 – oForm.Spn.Height / 2

oForm.Spn.Left = oForm.Width / 2 – oForm.Spn.Width / 2

oForm.Spn.Visible = .T.

&& Первая окружность. Результат см. на рис. 13.5

oForm.Spn.InteractiveChange 

define class SpinnerClass as Spinner

                                            && Размер счетчика

                                            Height = 26

                                            Width = 60

                                            && Шаг и граничные значения счетчика

                                            Increment = 10

                                            SpinnerHighValue = 120

                                            SpinnerLowValue = 50

                                            KeyboardHighValue = 120

                                            KeyboardLowValue = 50

                                            && Начальное значение счетчика

                                            Value = 50

                                            && Прежнее значение счетчика; используется, если перед выводом новой

                                            && окружности нужно удалять существующую окружность

                                            ValueOld = This.Value

                                            &&

                                            && При изменении значения счетчика выводится очередная окружность

                                            && с радиусом равным показанию счетчика

                                            procedure InteractiveChange

                                               && Окружность рисуется, когда ее радиус кратен 10

                                               if Mod(This.Value, This.Increment) = 0 then

                                               ThisForm.Circle(This.Value, ThisForm.Width / 2, ThisForm.Height / 2)

                                            endif

                                            endProc

endDefine

185.3.-Счетчик-добавленный-в-форму-на-этапе-исполнения  

Рис. 13.5. Счетчик, добавленный в форму на этапе исполнения

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

&& Всегда имеется одна окружность

&&

procedure InteractiveChange

                                            && Окружность рисуется, когда ее радиус кратен 10

                                            if Mod(This.Value, This.Increment) = 0 then

                                               && Задаем текущий цвет, совпадающим с цветом фона

                                               oForm.ForeColor = oForm.BackColor

                                               && Удаляем изображение окружности

                                            ThisForm.Circle(This.ValueOld, ThisForm.Width / 2, ThisForm.Height / 2)

                                            && Текущий цвет – черный

                                               oForm.ForeColor = RGB(0, 0, 0)

                                               && Новая окружность

                                            ThisForm.Circle(This.Value, ThisForm.Width / 2, ThisForm.Height / 2)

                                            && Запоминаем значение радиуса выведенной окружности

                                            This.ValueOld = This.Value

  endif

endProc

Пример 2 (приводится в справке VFP). В форму добавляются линия и три кнопки. Две кнопки (CmdUp и CmdDown) управляют наклоном (ориентацией) линии, а третья (CmdQuit) закрывает форму. Обработчик события Unload формы oForm введен для того, чтобы завершить обработку событий при закрытии формы не по кнопке CmdQuit, а, например, в результате нажатия Ctrl+F4.

oForm = CreateObject('SomeForm')

&& Добавляем в форму линию и кнопки

oForm.AddObject('ShpLine', 'Line')

&& Имена кнопок и их классов одинаковы

oForm.AddObject('CmdUp', 'CmdUp')

oForm.AddObject('CmdDown', 'CmdDown')

oForm.AddObject('CmdQuit', 'CmdQuit')

&& Свойства линии. Начальное положение линии см. на рис. 13.6

oForm.ShpLine.Top = 20

oForm.ShpLine.Left = 125

oForm.ShpLine.Visible = .T.

&& Делаем кнопки видимыми

oForm.CmdUp.Visible =.T.

oForm.CmdDown.Visible =.T.

oForm.CmdQuit.Visible =.T.

&& Показываем форму

oForm.Show

&& Начинаем обработку событий

read events 

&& Определения классов

define class SomeForm as Form

                                            procedure Unload

                                               && Прекращаем обработку событий

                                               clear events

                                            endProc

endDefine 

define class CmdUp as CommandButton

                                            && Заголовок и положение кнопки

                                            && Кнопка CmdUp активизируется при нажатии на клавишу U клавиатуры

                                            Caption = 'Slant \<Up'

                                            Left = 50

                                            Top = 100

                                            Height = 25

                                            &&

                                            procedure Click

                                               && Линия невидима

                                               ThisForm.ShpLine.Visible = .F.

                                               && Уклон линии вверх

                                               ThisForm.ShpLine.LineSlant = '/'

                                               && Линия видима

                                               ThisForm.ShpLine.Visible = .T.

                                            endProc

endDefine 

define class CmdDown as CommandButton

                                            Caption = 'Slant \<Down'

                                            Left = 200

                                            Top = 100

                                            Height = 25

                                            &&

                                            procedure Click

                                               ThisForm.ShpLine.Visible = .F.

                                               && Уклон линии вниз

                                               ThisForm.ShpLine.LineSlant ='\'

                                               ThisForm.ShpLine.Visible = .T.

                                            endProc

endDefine 

define class CmdQuit as CommandButton

                                            Caption = '\<Quit'

                                            && Форма будет закрываться при нажатии на Esc

                                            Cancel = .T.

                                            Left = 125

                                            Top = 150

                                            Height = 25

                                            &&

                                            procedure Click

                                               && Прекращаем обработку событий, закрываем форму

                                               clear events

                                            endProc

endDefine

185.4.-Начальное-положение-линии

Рис. 13.6. Начальное положение линии

Метод

Object.RemoveObject(cObjectName)

удаляет на этапе исполнения программы из контейнера объект, заданный строкой cObjectName, содержащей имя удаляемого объекта.