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

Создание Кнопок Навигации

Каждая кнопка, в общем и целом, будет иметь одинаковые характеристики и функциональное назначение , что является хорошей предпосылкой для создания класса кнопки навигации. А индивидуальные кнопки смогут легко получить эти общие характеристики, например внешний вид, и функциональное назначение из класса. Этот родительский класс является классом Navbutton, который будет определен ниже в этом разделе.

Как только родительский класс будет определен, следующие подклассы определят функциональное назначение и специфический вид для каждой из четырех кнопок навигации: navTop, navPrior, navNext, navBottom.

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

Определение Класса NAVBUTTON

Для создания Navbutton, сохраните следующие шесть определений классов (Navbutton, navTop, navBottom, navPrior, navNext, и vcr) в программном файле Navclass.prg.

Определение Обобщенного Класса Navigation Commandbutton
Код Комментарии

DEFINE CLASS Navbutton AS

COMMANDBUTTON

Height = 25

Width = 25

TableAlias = ""

Определяет родительский класс для кнопок навигации. Задает некоторые значения для класса, включая пользовательское свойство

TableAlias  для хранения имени псевдонима(алиаса) при навигации по нему.

PROCEDURE Click

IF NOT EMPTY(This.TableAlias)

SELECT (This.TableAlias)

ENDIF

ENDPROC

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


PROCEDURE RefreshForm

_SCREEN.ActiveForm.Refresh

ENDPROC

Использование _SCREEN.ActiveForm.Refresh вместо THISFORM.Refresh позволит вам добавить класс к форме или тулбару без потери функциональности.

ENDDEFINE

Конец определения класса.

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

Определение Класса для Кнопки Навигации Top
Код Комментарии

DEFINE CLASS navTop AS Navbutton

Caption = "|<"

Определяет класс кнопки навигации Top и устанавливает свойство Caption.

PROCEDURE Click

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

DODEFAULT( )

GO TOP

THIS.RefreshForm

Вызывает код события Click в родительском классе Navbutton для того, чтобы соответствующий алиас мог быть выбран, если свойство TableAlias было  установлено. Код GO TOP включен для установки указателя записи на первую запись таблицы. Затем вызывается метод RefreshForm из родительского класса.  В данном случае нет необходимости применения оператора разрешения области видимости (::) т.к. в подклассе нет метода с тем же именем, что и в родительском классе. С другой стороны, как родительский класс так и подкласс имеют код метода для события Click.

ENDPROC

Конец процедуры Click.

ENDDEFINE

Конец определения класса.

Другие кнопки навигации имеют похожее определение класса.

Определение Классов для Других Кнопок Навигации
Код Комментарии

DEFINE CLASS navNext AS Navbutton

Caption = ">"

Определяет класс кнопки навигации Next и устанавливает свойство Caption.

PROCEDURE Click

DODEFAULT( )

SKIP 1

IF EOF( )

GO BOTTOM

ENDIF

THIS.RefreshForm

ENDPROC

ENDDEFINE

Включает в себя код для установки указателя записи на следующую запись в таблице. Конец определения класса.

DEFINE CLASS navPrior AS Navbutton

Caption = "<"

Определяет класс кнопки навигации Prior и устанавливает свойство Caption.

PROCEDURE Click

DODEFAULT( )

SKIP –1

IF BOF( )

GO TOP

ENDIF

THIS.RefreshForm

ENDPROC

ENDDEFINE

Включает в себя код для установки указателя записи на предыдущую запись в таблице. Конец определения класса.

DEFINE CLASS navBottom AS

Navbutton

Caption = ">|"

Определяет класс кнопки навигации Bottom и устанавливает свойство Caption.

PROCEDURE Click

DODEFAULT( )

GO BOTTOM

THIS.RefreshForm

ENDPROC

ENDDEFINE

Включает в себя код для установки указателя записи на последнюю запись в таблице. Конец определения класса.

Следующее определение класса содержит все четыре кнопки навигации так,  что они могут быть добавлены как единое целое к форме. Класс также включает метод для установки свойства TableAlias кнопок.

Определение Класса Элемента Управления Навигацией Таблицы
Код Комментарии

DEFINE CLASS vcr AS CONTAINER

Height = 25

Width = 100

Left = 3

Top = 3

Начало определения класса. Свойству Height назначается тоже значение, что и значение высоты командных кнопок.

ADD OBJECT cmdTop AS navTop ;

WITH Left = 0

ADD OBJECT cmdPrior AS navPrior ;

WITH Left = 25

ADD OBJECT cmdNext AS navNext ;

WITH Left = 50

ADD OBJECT cmdBot AS navBottom ;

WITH Left = 75

Добавление кнопок навигации.

PROCEDURE SetTable(cTableAlias)

IF TYPE("cTableAlias") = 'C'

THIS.cmdTop.TableAlias = ;

cTableAlias

THIS.cmdPrior.TableAlias = ;

cTableAlias

THIS.cmdNext.TableAlias = ;

cTableAlias

THIS.cmdBot.TableAlias = ;

cTableAlias

ENDIF

ENDPROC

Этот метод используется для установки свойства TableAlias кнопок. TableAlias определен в родительском классе Navbutton. Также, для установки этого свойства можно было применить метод SetAll:

IF TYPE ("cTableAlias") = 'C'

  This.SetAll("TableAlias", "cTableAlias")

ENDIF

Однако, это может вызвать ошибку, если объект уже был добавлен к классу, у которого нет свойства TableAlias.

ENDDEFINE

Конец определения класса.

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

Создание Подкласса Основанного на Новом Классе

Также можно создать подкласс, основанный на базе vcr,  который имеет дополнительные кнопки, такие как Search, Edit, Save и Quit. Например, vcr2 содержит кнопку Quit:

Определение Подкласса Элемента Управления Навигацией по Таблице
Код Комментарии

DEFINE CLASS vcr2 AS vcr

ADD OBJECT cmdQuit AS

COMMANDBUTTON WITH ;

Caption = "Quit",;

Height = 25, ;

Width = 50

Width = THIS.Width + THIS.cmdQuit.Width

cmdQuit.Left = THIS.Width - ;

THIS.cmdQuit.Width

Определение класса, основанного на vcr и добавление к нему командной кнопки.

PROCEDURE cmdQuit.CLICK

RELEASE THISFORM

ENDPROC

Когда пользователь нажмет cmdQuit, то этот код закрывает и выгружает из памяти форму.

ENDDEFINE

Конец определения класса.

Vcr2 наследует все от vcr, плюс к этому имеет новую командную кнопку. При этом вам нет необходимости перезаписывать любой из существующих кодов vcr.

Изменения в VCR Отражаются на Подклассе

Из-за наследования изменения, сделанные в родительском классе, отражаются на всех подклассах, основанных на нем. Например, вы могли бы позволить пользователю узнать, что низ таблицы был достигнут, если измените оператор IF EOF( )в событии navNext.Click на следующий код:

  CopyCode imageКопировать код
IF EOF( )
GO BOTTOM
SET MESSAGE TO "Bottom of the table"
ELSE
SET MESSAGE TO
ENDIF

Вы могли бы позволить пользователю узнать, что верх таблицы был достигнут, если измените оператор IF BOF( )в событии navNext.Click на следующий код:

  CopyCode imageКопировать код
IF BOF()
GO TOP
SET MESSAGE TO "Top of the table"
ELSE
SET MESSAGE TO
ENDIF

Если эти изменения сделать в классах navNext и navPrior, то они автоматически будут применены и в соответствующих кнопках vcr и vcr2.

Добавление VCR к Классу Формы

Однажды определив vcr как элемент управления, можно добавить этот элемент управления в контейнер в момент определения самого контейнера. Например, следующий код, добавленный в Navclass.prg определяет форму и добавляет к ней кнопки навигации:

  CopyCode imageКопировать код
DEFINE CLASS NavForm AS Form
ADD OBJECT oVCR AS vcr
ENDDEFINE

Выполнение Формы, Содержащей VCR

Однажды определив подкласс формы, вы можете отобразить ее загрузив определение класса, создав объект основанный на подклассе и выполнив метод  Show формы:

  CopyCode imageКопировать код
SET PROCEDURE TO navclass ADDITIVE
frmTest = CREATEOBJECT("navform")
frmTest.Show

Если Вы не вызываете метод SetTable в oVCR ( VCR - объект в NavForm) когда пользователь нажимает кнопки навигации, то указатель записи перемещается в таблице, открытой в текущей выбранной рабочей области. Вы можете вызвать метод SetTable, чтобы определять по какой таблице перемещать указатель записи.

  CopyCode imageКопировать код
frmTest.oVCR.SetTable("customer")
NoteЗаметка

Когда пользователь закрывает форму, frmTest устанавливается в неопределенное значение (.NULL.). Для того, чтобы выгрузить объектную переменную из памяти,  используйте команду RELEASE. Объектные переменные, созданные в программных файлах, будут выгружены из памяти после завершения программы.

См. также