Многие приложения похожи тем, что используют для перемещения по таблице определенный набор кнопок. Обычно, этот набор включает в себя кнопки для перемещения указателя записи на следующую или предыдущую запись , а также на первую или последнюю запись в таблице.
Создание Кнопок Навигации
Каждая кнопка, в общем и целом, будет иметь одинаковые
характеристики и функциональное назначение , что является хорошей
предпосылкой для создания класса кнопки навигации. А индивидуальные
кнопки смогут легко получить эти общие характеристики, например внешний
вид, и функциональное назначение из класса. Этот родительский класс
является классом Navbutton, который будет определен ниже в этом разделе.
Как только родительский класс будет определен, следующие подклассы
определят функциональное назначение и специфический вид для
каждой из четырех кнопок навигации: navTop, navPrior, navNext, navBottom.
В конце будет создан класс контейнера - vcr, и каждая
кнопка навигации будет добавлена к этому классу. Контейнер может быть
добавлен к форме или тулбару, чтобы обеспечивать навигацию по таблице.
Определение Класса NAVBUTTON
Для создания Navbutton, сохраните следующие шесть определений классов (Navbutton, navTop, navBottom, navPrior, navNext, и vcr) в программном файле Navclass.prg.
| Код | Комментарии |
|---|---|
|
|
Определяет родительский класс для кнопок навигации. Задает некоторые значения для класса, включая пользовательское свойство
|
|
|
Если свойство TableAlias было установлено, то эта процедура родительского класса выберет алиаса прежде, чем будет выполнен код навигации подкласса. В противном случае считается, что пользователь сам хочет управлять навигацией по таблице в текущей выбранной рабочей области. |
|
|
Использование _SCREEN.ActiveForm.Refresh вместо THISFORM.Refresh позволит вам добавить класс к форме или тулбару без потери функциональности. |
|
|
Конец определения класса. |
Указанные кнопки навигации полностью основаны на классе Navbutton. Следующий код определяет кнопку Top
из набора кнопок навигации. Остальные три кнопки навигации определены в
следующей таблице. Определения всех четырех классов аналогичны,
поэтому только первый из них имеет подробные комментарии.
| Код | Комментарии |
|---|---|
|
|
Определяет класс кнопки навигации Top и устанавливает свойство Caption. |
|
|
Создает код метода, который будет выполнен если произойдет событие Click для кнопки. |
|
|
Вызывает код события Click в родительском классе |
|
|
Конец процедуры Click. |
|
|
Конец определения класса. |
Другие кнопки навигации имеют похожее определение класса.
| Код | Комментарии |
|---|---|
|
|
Определяет класс кнопки навигации Next и устанавливает свойство Caption. |
|
|
Включает в себя код для установки указателя записи на следующую запись в таблице. Конец определения класса. |
|
|
Определяет класс кнопки навигации Prior и устанавливает свойство Caption. |
|
|
Включает в себя код для установки указателя записи на предыдущую запись в таблице. Конец определения класса. |
|
|
Определяет класс кнопки навигации Bottom и устанавливает свойство Caption. |
|
|
Включает в себя код для установки указателя записи на последнюю запись в таблице. Конец определения класса. |
Следующее определение класса содержит все четыре кнопки навигации так, что они могут быть добавлены как единое целое к форме. Класс также включает метод для установки свойства TableAlias кнопок.
| Код | Комментарии |
|---|---|
|
|
Начало определения класса. Свойству Height назначается тоже значение, что и значение высоты командных кнопок. |
|
|
Добавление кнопок навигации. |
|
|
Этот метод используется для установки свойства TableAlias кнопок. TableAlias определен в родительском классе
Однако, это может вызвать ошибку, если объект уже был добавлен к классу, у которого нет свойства TableAlias. |
|
|
Конец определения класса. |
Один раз определив класс, вы можете субклассировать его или добавлять на форму.
Создание Подкласса Основанного на Новом Классе
Также можно создать подкласс, основанный на базе vcr, который имеет дополнительные кнопки, такие как Search, Edit, Save и Quit. Например, vcr2 содержит кнопку Quit:
| Код | Комментарии |
|---|---|
|
|
Определение класса, основанного на |
|
|
Когда пользователь нажмет |
|
|
Конец определения класса. |
Vcr2 наследует все от vcr, плюс к этому имеет новую командную кнопку. При этом вам нет необходимости перезаписывать любой из существующих кодов vcr.
Изменения в VCR Отражаются на Подклассе
Из-за наследования изменения, сделанные в родительском классе,
отражаются на всех подклассах, основанных на нем. Например, вы могли бы
позволить пользователю узнать, что низ таблицы был достигнут,
если измените оператор IF EOF( )в событии navNext.Click на следующий код:
Копировать код |
|
|---|---|
IF EOF( ) |
|
Вы могли бы позволить пользователю узнать, что верх таблицы был достигнут, если измените оператор IF BOF( )в событии navNext.Click на следующий код:
Копировать код |
|
|---|---|
IF BOF() |
|
Если эти изменения сделать в классах navNext и navPrior, то они автоматически будут применены и в соответствующих кнопках vcr и vcr2.
Добавление VCR к Классу Формы
Однажды определив vcr как элемент управления,
можно добавить этот элемент управления в контейнер в момент определения
самого контейнера. Например, следующий код, добавленный в Navclass.prg
определяет форму и добавляет к ней кнопки навигации:
Копировать код |
|
|---|---|
DEFINE CLASS NavForm AS Form |
|
Выполнение Формы, Содержащей VCR
Однажды определив подкласс формы, вы можете отобразить ее загрузив определение класса, создав объект основанный на подклассе и выполнив метод Show формы:
Копировать код |
|
|---|---|
SET PROCEDURE TO navclass ADDITIVE |
|
Если Вы не вызываете метод SetTable в oVCR ( VCR - объект в NavForm) когда пользователь нажимает кнопки навигации, то указатель записи перемещается в таблице, открытой в текущей выбранной рабочей области. Вы можете вызвать метод SetTable, чтобы определять по какой таблице перемещать указатель записи.
Копировать код |
|
|---|---|
frmTest.oVCR.SetTable("customer")
|
|
Заметка |
|---|
|
Когда пользователь закрывает форму, |
См. также
Ссылки
Свойство Caption (Visual FoxPro)Свойство Height
Метод SetAll
Заметка