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

Обработчики событий формы и ее элементов в FoxPro

« Назад

Обработчик события Init выполняется, когда открывается форма после создания объекта класса Form.

&& Обработчик события Init формы "Авторы"

&&

parameters рAuthorId

&&

with This

.AutoCenter = .T.                && Центрируем форму при ее открытии

.Grid1.ReadOnly = .T.              && Сетка формы доступна только для чтения

&& Упорядочиваем записи по полю Author

.DataEnvironment.Cursor1.Order = 'Author'

if Pcount( ) = 1 then

set deleted on                  && Скрываем записи с пометкой удаления

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

Caption = "Выбор автора книги " + Books.Book

Command7.Visible = .T. && Кнопка "Выбрать" видна

AuthorSelected = .F.       && Инициализация возвращаемого значения

if рAuthorId > 0 then

seek рAuthorId order tag AuthorId in Authors

endif

else

set deleted off                  && Показываем записи с пометкой удаления

WindowType = 0

Caption = "Авторы"       && Заголовок формы

.Command7.Visible = .F.       && Кнопка "Выбрать" скрыта

endif

endWith

Форма "Авторы", если вызывается из формы "Книги", получает код автора, выбранного в форме "Книги". Этот код принимает параметр рAuthorId. На записи с этим кодом после открытия формы позиционируется таблица Authors. При выборе автора для формы "Книги" записи таблицы Authors, имеющие пометку удаления, недоступны.

Вызов формы "Авторы" из формы "Книги" выполняется командой

do form (formName) with рAuthorId to AuthorSelected

Параметр AuthorSelected команды DO FORM принимает значение, возвращаемое формой "Авторы" после ее закрытия. Это значение содержит команда RETURN обработчика события Unload формы "Авторы":

return This.AuthorSelected

Других операторов этот обработчик не содержит.

Сетка формы (ее свойство TabIndex равно 1, то есть она оказывается в фокусе при открытии формы) имеет один обработчик – AfterRowColChange, управляющий доступностью кнопки "Изменить" (Command2) и заголовком кнопки Command3:

&& Обработчик события AfterRowColChange сетки Grid1 формы "Авторы"

&&

lparameters nColIndex

with ThisForm

if Deleted( ) then

&& Запись таблицы Authors имеет пометку удаления; запрещаем

&& ее редактирование, делая кнопку "Изменить" неактивной

.Command2.Enabled = .F.

.Command3.Caption = "Возвратить"

else

.Command2.Enabled = .T.

Command3.Caption = "Удалить"

endif

endWith

В первой, заданной по умолчанию строке обработчика nColIndex – это номер выбранного столбца сетки.

Замечание. Memo-поле записи сетки открывается после позиционирования на этом поле и нажатия на Ctrl+PgDn или на после двойного удара мышью. Оно, как и вся сетка, доступно только для чтения.

Представление записей таблицы Authors может быть выполнено в порядке фамилий авторов или их кодов. Этим управляет обработчик события InteractiveChange переключателя OptionGroup1:

&& Обработчик события InteractiveChange переключателя OptionGroup1

&&

if This.Value = 1 then

ThisForm.DataEnvironment.Cursor1.Order = 'Author'

else

ThisForm.DataEnvironment.Cursor1.Order = 'AuthorId'

endif

ThisForm.Grid1.Refresh     && Отображаем изменение порядка

При открытии формы записи сетки упорядочиваются по ее столбцу "Авторы".

Поиск автора можно выполнить, вводя начальные буквы фамилии автора в поле ввода Au, расположенном над списком авторов. Поиск выполняется обработчиком InteractiveChange этого поля:

&& Обработчик события InteractiveChange поля Au

&&

recOld = Recno( )

if not Empty(This.Value)

set exact off

if not Seek(AllTrim(This.Value), 'Authors', 'Author') then

go recOld

else

ThisForm.Grid1.Refresh     && Показываем найденную запись

endif

endif

При поиске важен регистр вводимых букв.

Действия, выполняемые обработчиками события Click кнопок формы, перечислены в табл. 2.6.

Таблица 2.6

Действия кнопок формы

Действие / кнопка

Обработчик события Click кнопки

Открывает форму AuthorEdit для добавления записи / Новый

&& appPath – путь к проекту и базе данных;
&& определен в главном файле Start.prg
formName = appPath + 'Forms\AuthorEdit'
&& Открываем форму AuthorEdit
do form (formName) with 'new'
ThisForm.Grid1.SetFocus

Открывает форму AuthorEdit для редактирования записи / Изменить

formName = appPath + 'Forms\AuthorEdit'
do form (formName) with 'edit'
ThisForm.Grid1.SetFocus

Проставляет или снимает пометку удаления / Удалить | Возвратить

flag = MessageBox(This.Caption + "?", 4 + 32 + 256)
if flag = 6 then                  && Нажата кнопка "Да"

if Deleted( ) then
recall
else
delete
endif
endif
ThisForm.Grid1.SetFocus

Поиск автора / Найти

au = InputBox("Введите ФИО или часть ФИО", ;
      "Поиск автора", ThisForm.AuToFind)
if not Empty(au)
      recOld = Recno( )
      set exact off
      if not Seek(au, 'Authors', 'Author') then
           MessageBox('Автор по строке ' + au + ' не найден', 48)
           go recOld
      endif
endif
&& Запоминаем подстроку поиска автора
ThisForm.AuToFind = au
ThisForm.Grid1.SetFocus

Вывод списка авторов / Список

MessageBox("Вопросы, связанные с формированием отчетов, рассмотрены в гл. 12")

Закрывает форму "Авторы" / Закрыть

ThisForm.Release

Выбирает запись в таблице Author; закрывает форму "Авторы" / Выбрать

select BooksAuthors
set order to BookId
ThisForm.AuthorSelected = .T.
&& Проверяем, есть ли автор в списке авторов книги,
&& выбранной в форме "Книги"
scan for BooksAuthors.BookId = Books.BookId
      if BooksAuthors.AuthorId = Authors.AuthorId then
           ThisForm.AuthorSelected = .F.
           exit
      endif
endScan
if ThisForm.AuthorSelected then
      && Закрываем форму
      ThisForm.Release
else
      MessageBox("Автор уже добавлен в список авторов книги!")
endif

Кроме того, в обработчик события Error кнопки "Удалить" добавлены следующие строки кода:

&& Обработчик события Error кнопки "Удалить"

&&

lparameters nError, cMethod, nLine

if nError = 1539 then

MessageBox("Удалить нельзя. Книги автора есть в библиотеке!", 48)

else

MessageBox("Ошибка № " + Transform(nError) + " в строке " ;

+ Transform(nLine) + " метода " + cMethod, 32)

endif

Ошибка с номером 1539 возникает при отказе триггера __RI_DELETE_authors, то есть когда выполняется попытка удалить запись из таблицы Authors, имеющую связанные с ней записи в таблице BooksAuthors. Если в обработчик события Error кнопки "Удалить" код не добавлять, то при отказе триггера системный обработчик ошибок выдаст сообщение Trigger failed in Authors.

Аналогичные обработчики размещены и в формах, управляющих таблицами Books и WorkType.

Кроме приведенного сообщения, пользователь может проанализировать ошибку, распечатав содержимое глобального массива gaErrors, создаваемого при выполнении триггера хранимой процедурой riError( ), например:

display memory like gaErrors to file d:\a.txt

Состав файла d:\a.txt при отказе триггера удаления:

gaErrors           Pub             A

(1, 1)         N          –1               (–1,00000000)

(1, 2)     C                "Delete restrict rule violated."

(1, 3)     C                ""

(1, 4)     C   ", AuForm.Command3.Click, __RI_DELETE_authors, riError"

(1, 5)     C                "d:\HomeLibrary\Authors.dbf"

(1, 6)     N                1 (1,00000000)

(1, 7)     N                30         (30,00000000)

(1, 8)     C                "AuthorId"

(1, 9)     C                "d:\HomeLibrary\BooksAuthors.dbf"

(1, 10)   N                1 (1,00000000)

(1, 11)   N                30         (30,00000000)

(1, 12)   C                "AuthorId"

Замечание. Удалить пользовательскую процедуру события (метода) или назначенное пользователем значение свойства можно в окне свойств объекта. Для этого после позиционирования на строке с именем процедуры (свойства) нажимается правая кнопка мыши и выбирается Reset to Default (рис. 2.18); удаление кода (значения) выполняется без дополнительного предупреждения.

12.1.-Удаляется-пользовательская-процедура-события-Error

Рис. 2.18. Удаляется пользовательская процедура события Error