Обработчики событий формы и ее элементов в 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
Действия кнопок формы
Кроме того, в обработчик события 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); удаление кода (значения) выполняется без дополнительного предупреждения. Рис. 2.18. Удаляется пользовательская процедура события Error |