Тема: Использование пользовательских классов

Цель:Изучить создание и работу с пользовательскими классами

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

В VFP пользовательские классы объединяются в библиотеки классов и хранятся в файлах с расширением VCX. Допускается подключение в проект произвольных библиотек классов, написанных на любом языке программирования, в том числе и на самом VFP. Подключенные в проект библиотеки классов можно просмотреть/отредактировать во вкладке Classes окна менеджера проекта (рис. 1).

Тема: Использование пользовательских классов - student2.ru Рис. 1. Просмотр библиотек классов, подключенных в проект

В случае создания проекта мастером, базовая структура библиотек классов генерируется автоматически. Все библиотеки, имена которых начинаются с подчерка, являются системными и изменять их не рекомендуется. Так же не рекомендуется редактировать содержимое библиотеки с именем проекта и добавленным «_APP», т.к. в ней хранятся основные классы, используемые мастерами построений и базовый класс самого приложения.

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

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

Все визуальные классы в VFP, в обязательном порядке, должны базироваться на каком–либо стандартном классе, при этом базовым может быть как класс, уже определенный в системе, так и внешний класс, сохраненный в файле VCX. Изначально, пользовательский класс наследует все свойства и методы родительского класса, которые впоследствии могут редактироваться. Допускается добавление программистом собственных свойств и методов, но только в пользовательский класс.

Наиболее простым методом создания пользовательского класса является использование визуального построителя. Для создания нового класса необходимо перейти в менеджере проекта во вкладку Classes и нажать New, при этом появится диалоговое окно задания базовых параметров класса (рис. 2).

Тема: Использование пользовательских классов - student2.ru

Рис. 2. Диалоговое окно создания класса

В появившемся диалоговом окне, в поле Class Name необходимо указать имя класса, которое будет в дальнейшем использоваться для доступа к объекту этого класса. При помощи ниспадающего списка в поле Based On указывается базовый класс. Используя элемент управления, расположенный правее списка можно выбрать произвольную библиотеку классов, расположенную на внешнем носителе. При использовании внешней библиотеки классов в поле From отображается полный путь к ней. В поле ввода Store In указывается путь к библиотеке, куда будет сохранен создаваемый класс.

После нажатия кнопки OK, созданная библиотека добавиться в проект, и откроется окно редактирования класса (рис. 3).

Тема: Использование пользовательских классов - student2.ru

Рис. 3. Диалоговое окно редактирования класса

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

По завершению редактирования окно следует закрыть, что приведет к автоматическому сохранению всех изменений в библиотеке класса. Для использования созданного класса на экранной форме достаточно открыть форму на редактирование и мышкой перетащить класс из вкладки Classes менеджера проекта на редактируемую форму. Однако технология Drag&Drop не всегда удобна, особенно если форма большая, а классов много. В окне Form Controls существует элемент View Classes, позволяющий выбрать библиотеку классов, элементы которой будут отображены в самом окне (рис. 4).

Тема: Использование пользовательских классов - student2.ru

Рис. 4. Выбор отображаемых классов в окне Form Controls

В появившемся контекстном меню, при помощи пункта Add… можно выбрать произвольную библиотеку классов. При этом ее имя появится в списке, а так же изменится содержимое самого окна Form Controls (рис. 5). Работа с появившимися компонентами проводится так же, как и со стандартными системными компонентами при редактировании форм. Для возврата к стандартному виду следует выбрать пункт Standard.

Тема: Использование пользовательских классов - student2.ru

Рис. 5. Окно Form Controls, отображающее компоненты пользовательской библиотеки классов

Цветной выключатель

Рассмотрим более подробно пример создания пользовательского класса, основанного на простом выключателе. Предположим, что от стандартного объекта он должен отличаться цветом надписи, когда выключатель включен, надпись должна быть красной, а когда выключен – синей. Организовать такое отображение объекта на форме достаточно просто и в программном коде методов стандартного компонента, но что делать, если таких объектов будут десятки? Гораздо удобнее разработчику один раз создать новый класс, учитывающий отличия от стандартного, а затем просто тиражировать экземпляры данного класса на любой форме в произвольном количестве.

На первом шаге необходимо создать новый класс, базирующийся на стандартном классе CheckBox. Для этого необходимо перейти во вкладку Classes окна менеджера проекта и нажать кнопку New. При этом на экране появится диалоговое окно создания нового класса (рис. 6). Укажите в поле ввода новое имя для создаваемого класса (на рисунке это MyClass). В поле ввода Store In укажите имя библиотеки, в которой класс будет храниться (на рисунке указана новая библиотека My_lib1.vcx). В качестве базового класса в поле Based On выберите класс CheckBox. После указания всех необходимых данных и нажатия кнопки OK на экране должно появиться диалоговое окно редактирования класса (см. рис. 3).

Тема: Использование пользовательских классов - student2.ru

Рис. 6. Окно создания нового класса, базирующегося на стандартном классе CheckBox

Для просмотра свойств и методов созданного класса следует в окне редактирования класса щелкнуть правой кнопкой мыши на объекте и выбрать пункт Properties (рис. 7), при этом откроется окно свойств, в заголовке которого указывается имя библиотеки и имя класса, который редактируется в настоящий момент (рис. 8).

Тема: Использование пользовательских классов - student2.ru

Рис. 7. Вызов окна свойств для редактируемого класса

В окне свойств доступны для редактирования все свойства и методы, унаследованные от базового класса. Кроме того, разработчик может добавлять свои свойства и методы, используя команды пункта главного меню Class | New property и Class | New metod. Добавление новых свойств и методов к существующему классу полностью аналогично добавлению таковых к форме в редакторе экранных форм. Следует помнить, что независимо от присваиваемых имен, все пользовательские свойства и методы появляются в окне свойств в самом конце списка и их значения выделяются ярко красным цветом (хотя это и зависит от цветовой палитры, примененной в системе VFP).

Тема: Использование пользовательских классов - student2.ru

Рис. 8. Окно свойств пользовательского класса

Для организации изменения цвета надписи элемента необходимо прописать программный код, осуществляющий это. Следует учесть, что программный код должен отрабатывать не только при изменении значения самого выключателя, но так же и при первом запуске формы, на котором этот выключатель будет расположен. Для этого следует отредактировать методы Init и InteractiveChange созданного класса. Для этого перейдите во вкладку Methods окна свойств и добавьте в указанные методы следующую пользовательскую программу

*если значение текущего элемента 0, т.е. выключено

*то устанавливаем цвет надписи на красный

*в противном случае – на синий

IF this.Value=0 then

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

ELSE

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

ENDIF

*перерисовываем элемент на экране

this.Refresh()

Обратите внимание, что для указания элемента используется служебное слово this, т.к. разработчик не может заранее знать какое именно имя будет у элемента на форме. Кроме того, если таких элементов будет несколько, то и имена у них будут разные и, соответственно, заранее невозможно организовать управление поведением объекта используя какое-либо конкретное имя. (Используя указатель this разработчик дает указание системе обрабатывать тот элемент, который является текущим с точки зрения системы).

Таким образом, в приведенном программном коде проверяется значение свойства Value текущего элемента (в нашем случае это сам выключатель). Если значение равно нулю (т.е. элемент выключен), то для надписи устанавливается красный цвет, иначе – синий. Для указания цвета надписи используется свойство ForeColor. Свойству присваивается не просто цвет, а значение цветовой палитры в формате RGB (Red, Green, Blue). Преобразование тройки чисел, определяющих интенсивность основных цветов, осуществляется функцией RGB(nRedValue, nGreenValue, nBlueValue). В скобках, через запятую, обязательно указываются интенсивности трех основных цветов! Последняя строка программного кода перерисовывает объект на экране. При этом обновление внешнего вида происходит только для данного объекта, а не для всей формы, что существенно ускоряет работу.

По завершению редактирования методов закройте окно редактирования класса. Затем создайте новую форму конструктором. В панели Form Controls выберите созданную библиотеку (см. рис. 4), при этом в панели должен появиться только один элемент. Добавьте два экземпляра этого элемента на форму и поменяйте у них свойство Caption на нечто разумное (рис. 9). Не обращайте внимание на то, что надпись в редакторе форм отображается черным цветом, изменения проявятся после запуска формы.

Тема: Использование пользовательских классов - student2.ru

Рис. 9. Окно редактора форм с вынесенным пользовательским классом

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

Создайте еще две формы, на каждой из которых разместите по пять объектов созданных на базе нового класса. Запустите все три формы с новыми выключателями на исполнение и расположите их так, чтобы они не перекрывали друг друга. В произвольном порядке попереключайте выключатели на разных формах, и отметьте их поведение.

Тема: Использование пользовательских классов - student2.ru

Рис. 10. Запущенная форма с «цветными» выключателями

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

Наши рекомендации