- •Microsoft Visual FoxPro. Учебно-справочное пособие
- •Предисловие
- •Возможные значения type
- •1. Соглашения
- •1.1. Имена
- •1.1.1. Имена в тексте и комментарии
- •1.1.2. Имена в программе
- •1.1.3. Рекомендуемые имена
- •1.1.3.1. Переменные
- •Возможные значения scope
- •1.1.3.2. Поля таблиц
- •Возможные значения type
- •1.1.3.3. Объекты
- •Возможные значения prefix
- •1.1.3.4. Константы и окна
- •1.2. Команды, функции и объекты
- •1.2.1. Способ представления
- •1.2.2. Синтаксис команд и функций
- •1.2.3. Параметры команд и функций
- •Возможные значения type
- •1.3. Примеры
- •1.4. Структура пособия и поиск материала
- •1.5. Часто употребляемые опции и параметры
- •Общие опции команд, оперирующих диалогами и файлами
- •Общие опции команд, оперирующих таблицами
- •2. Простое приложение
- •2.1. Назначение и состав приложения
- •2.2. База данных и проект HomeLibrary
- •Поля таблиц базы данных HomeLibrary
- •Индексы таблиц базы данных HomeLibrary
- •2.3. Связи между таблицами
- •2.4. Триггеры и правило проверки записи
- •2.5. Файлы проекта
- •2.5.1. Перечень файлов и порядок их описания
- •Файлы приложения HomeLibrary
- •2.5.2. Главный файл проекта
- •2.5.3. Форма "Авторы"
- •2.5.3.1. Состав формы
- •Элементы управления формы "Авторы"
- •2.5.3.2. Добавленные свойства формы
- •2.5.3.3. Обработчики событий формы и ее элементов
- •Действия кнопок формы
- •2.5.4. Форма AuthorEdit
- •2.5.4.1. Обработчик события Init
- •2.5.4.2. Запись данных на диск
- •2.5.4.3. Ввод даты
- •2.5.4.4. Альтернативный вариант ввода и записи данных
- •2.5.5. Форма "Книги"
- •2.5.6. Форма BookEdit
- •2.5.7. Форма "Содержание книг"
- •2.5.8. Форма WorkEdit
- •2.5.9. Форма "Виды произведений"
- •2.5.10. Анализ ошибки 1995
- •2.5.11. Отображение пометки удаления
- •2.5.12. Упаковка таблиц
- •2.5.13. Меню приложения
- •3. Типы данных
- •3.1. Общие сведения
- •3.1.1. Перечень функций
- •Список функций
- •3.1.2. Перечень типов данных
- •Типы данных vfp
- •Типы данных vfp, употребляемые только для полей таблиц
- •3.1.3. Получение информации о типе данных
- •Символ, возвращаемый type( ) и vartype( )
- •3.1.4. Null-величины
- •3.1.4.1. Понятие null
- •3.1.4.2. Функции и команда для null
- •3.1.4.3. Null в логических выражениях
- •Null в логических выражениях
- •3.1.4.4. Null в командах и встроенных функциях vfp
- •3.1.5. Пустые значения
- •Пустые значения
- •3.1.6. Чистые значения
- •Чистые значения
- •3.1.7. Преобразование типов данных
- •Значения параметра cDataType и флаги присутствия параметров nFieldWidth и nPrecision
- •Возможные преобразования типов данных, выполняемые cast( )
- •3.2. Числовые типы данных
- •3.2.1. Перечень команд
- •Список команд для числовых данных
- •3.2.2. Числовые константы
- •3.2.3. Операции для числовых данных
- •Операции для числовых данных
- •3.2.4. Преобразование числовых данных
- •3.2.5. Форматирование числовых данных
- •3.2.6. Функции для числовых данных
- •Функции для числовых данных
- •3.2.7. Вычисления в таблицах
- •Опции и параметры команд, выполняющих вычисления в таблицах
- •Функции, употребляемые в eExpressionList команды calculate
- •Данные таблицы Test.Dbf
- •3.3. Битовые функции
- •Результаты битовых операций
- •Битовые функции
- •3.4. Тип данных Currency
- •3.4.1. Перечень команд и функций
- •Список команд и функций
- •3.4.2. Употребление типа Currency
- •3.5. Логический тип данных
- •3.5.1. Логические операции
- •Логические операции
- •3.5.2. Операции отношения
- •Операции отношения
- •3.6. Приоритет выполнения операций
- •3.7. Типы данных Character и Varbinary. Кодовые страницы
- •3.7.1. Перечень команд
- •Список команд для символьных данных и кодовых страниц
- •3.7.2. Символьные константы
- •3.7.3. Операции для символьных данных
- •3.7.4. Команды для символьных данных
- •Примеры влияния set exact на результат сравнения
- •3.7.5. Функции для символьных данных
- •Символьные функции
- •Описание параметра nConversionSetting
- •Описание параметра nFlag
- •Описание параметра nFlag
- •Преобразования transform( ) при опущенном cFormatCodes
- •3.7.6. Кодовые страницы, поддерживаемые vfp
- •Кодовые страницы
- •3.7.7. Команды и функции для кодовых страниц
- •Функции для кодовых страниц
- •3.7.8. Тип данных Varbinary
- •3.7.9. Типы данных Varchar и Varchar (Binary)
- •3.8. Работа с полями типа Memo
- •3.8.1. Перечень команд и функций
- •Список команд и функция для memo-полей
- •3.8.2. Интеактивное редактирование memo-поля
- •3.8.3. Функции для memo-полей
- •3.9. Дата и время
- •3.9.1. Перечень команд и функций
- •Список команд и функций
- •3.9.2. Задание даты и времени
- •3.9.3. Изменение представления даты и времени
- •3.9.4. Константы, задающие дату и время
- •3.9.5. Даты по григорианскому и юлианскому календарям
- •3.9.6. Операции для данных типа Date и DateTime
- •3.9.7. Команды для данных типа Date и DateTime
- •Установки set date и соответствующие им форматы представления дат и дат и времени
- •3.9.8. Функции для данных типа Date и DateTime
- •Встроенные функции для данных типа Date и DateTime
- •3.9.9. Вывод системных календаря и часов
- •3.9.9.1. Вывод системных часов
- •3.9.9.2. Вывод системного календаря
- •3.9.10. Использование ole-календаря
- •4. Вывод данных в окно vfp, текстовый файл, на принтер и в порт
- •4.1. Перечень команд, функций и системных переменных
- •Список команд, функций и системных переменных
- •4.1.1. Слияние текста и его выражений
- •Значения параметра eExpression
- •4.1.2. Управление выводом
- •4.1.2.1. Организация вывода на принтер
- •4.1.2.2. Команды и функции, управляющие выводом
- •Символы, входящие в cFontStyle
- •Значения параметра nAttribute
- •Функциональные коды
- •Картинные коды
- •4.2. Вывод сообщений
- •Значения, применяемые для задания nDialogBoxType
- •Возвращаемые значения
- •Кнопки диалога и их действия
- •Варианты получения дополнительных данных о set-команде
- •4.3. Команды display и list
- •Display-команды
- •Опции и параметры display-команд
- •4.4. РАбота с текстовыми файлами
- •Функции для работы с текстовыми файлами
- •5. Элементы программирования
- •5.1. Перечень команд, функций и директив
- •Список команд, функций и директив
- •5.2. Основная программа
- •5.3. Структура программы
- •5.4. Вложенные вызовы программ
- •5.5. Создание констант и переменных
- •5.5.1. Константы
- •5.5.2. Переменные
- •5.5.2.1. Виды переменных
- •5.5.2.2. Имя переменной
- •5.5.2.3. Локальные переменные
- •5.5.2.4. Глобальные переменные
- •5.5.2.5. Частные переменные
- •5.5.2.6. Инициализация переменных
- •Ограничения на скалярные переменные и массивы
- •5.5.2.7. Освобождение переменных
- •5.5.2.8. Сохранение и восстановление значений переменных
- •5.6. Выражения
- •5.6.1. Построение и вычисление выражения
- •5.6.2. Оценка выражения
- •5.7. Управляющие конструкции
- •5.8. Процедуры и функции
- •5.8.1. Способы употребления
- •5.8.2. Обмен данными между программными компонентами
- •5.8.3. Число переданных параметров
- •5.8.4. Передача параметров по значению и ссылке
- •5.8.5. Поиск программных компонентов
- •5.8.6. Компиляция исходного текста
- •Расширения исходных и объектных файлов
- •5.8.7. Команды для процедур и функций
- •5.8.7.1. Задание и редактирование программных компонентов
- •Результаты, возвращаемые EditSource( )
- •Редакторы, открываемые функцией EditSource( )
- •5.8.7.2. Вызов Внешних функций
- •Возможные значения параметров cFunctionType и cParameterType1
- •5.8.7.3. Запуск программных компонентов
- •Имена для параметра KeyLabelName
- •Значения параметра cOnCommand
- •5.9. Макросы
- •5.9.1. Понятие макроса
- •5.9.2. Интерактивное формирование макроса
- •5.9.2.1. Запись макроса
- •5.9.2.2. Программирование макроса
- •5.9.3. Команды для макросов
- •6. Массивы
- •6.1. Перечень команд и функций
- •Список команд и функций для массивов
- •6.1.2. Создание и присваивание массива
- •6.1.3. Создание массива
- •Значения cType и варианты преобразования типа, заданного cType
- •6.1.4. Массив как параметр программных компонентов
- •6.1.5. Функции для массивов
- •Содержимое строки массива, формируемого adir( )
- •Содержимое строки массива, формируемого adockstate( )
- •Состав массива arrayDockState
- •Значения элементов массива ArrayName, созданного aerror( )
- •Элементы массива ArrayName, когда второй параметр равен 0
- •Элементы массива ArrayName, когда второй параметр равен 1
- •Содержимое строки массива ArrayName, когда задан параметр oEventObject
- •Содержимое строки массива, формируемого afields( )
- •Значения параметра nType и варианты возвращаемых результатов
- •Значения параметра nFlags
- •Информация об объекте vFunc
- •Состав массива ArrayName
- •Состав массива ArrayName для разных объектов проектирования
- •Значения параметра nValue
- •Действие параметра nType
- •Биты параметра nFlags
- •Условия поиска, задаваемые параметром nFlags
- •Элементы строки массива, формируемого astackinfo( )
- •Состав строки массива, формируемого ataginfo( )
- •Состав строки массива, формируемого avcxclasses( )
- •6.1. Отображение массива в форме
- •6.2.1. Решаемые задачи
- •6.2.2. Элементы управления формы
- •Элементы управления формы ArrayShow
- •6.2.3. Свойства и событие Init формы
- •Новое и измененные свойства формы
- •6.2.4. Поле списка формы
- •6.2.5. Кнопки формы
- •6.2.6. Счетчик и переключатели формы
- •6.2.7. Надписи формы
- •6.2.8. Массив как параметр формы
- •7. Обработка ошибок исполнения
- •7.1. Перечень команд и функций
- •Список команд и функций
- •7.2. Виды обработчиков ошибок
- •Значения, возвращаемые функцией sys(2410)
- •7.3. On error-обработчик ошибок
- •Функции для локализации и расшифровки ошибки
- •Команды cancel, resume, retry, return и suspend
- •7.4. Обработчик события Error
- •7.5. Конструкция try ... Catch ... Finally
- •7.5.1. Синтаксис и порядок выполнения конструкции
- •7.5.2. Дополнительные команды конструкции
- •7.5.3. Throw в try-конструкции
- •7.5.4. Итоговые замечания
- •7.6. Взаимодействие обработчиков
- •7.7. Генерация ошибок vfp
- •8. Оптимизация функционирования
- •8.1. Перечень команд и функций
- •Список команд и функций
- •8.2. Рашмор-оптимизация
- •8.2.1. Бинарный поиск
- •8.2.2. Сравнение последовательного и бинарного поиска
- •8.2.3. Использование индексов для оптимизации вычислений
- •8.2.4. Потенциально оптимизируемые Команды
- •8.2.5. Управление рашмор-оптимизацией
- •Уровни рашмор-оптимизации запроса
- •8.2.6. Оптимизация выражений
- •8.2.7. Составление оптимизируемых выражений
- •Варианты рашмор-выражений
- •8.3. Оптимизация программ
- •8.3.1. Некоторые приемы программирования
- •8.3.2. Оптимизация повторных обращений к свойствам объектов
- •8.3.3. Обращение к нескольким свойствам объекта
- •9. Проект
- •9.1. Перечень Команд и объектов
- •Список команд и объектов, употребляемых с проектом
- •9.2. Проект и диспетчер проекта
- •9.3. Проект как объект vfp
- •9.4. Создание и редактирование проекта
- •9.5. Включаемые и не включаемые файлы
- •9.6. Главный файл проекта
- •9.7. Добавление, изменение и удаление файлов проекта
- •9.8. Закрытие проекта
- •9.9. Построение приложения
- •Значения параметра nBuildAction
- •9.10. Запуск и выход из приложения
- •10. Формы
- •10.1. Перечень команд, функций и объектов
- •Список команд, функций и объектов
- •10.2. Создание формы
- •10.3. Выполнение формы
- •10.3.1. Команда do form
- •10.3.2. Отображение формы, созданной программно
- •10.4. Форма как объект
- •10.4.1. Свойства, события и методы формы
- •Категории доступности свойств формы
- •10.4.2. Форма как контейнер
- •10.4.3. Обеспечение доступа к объектам формы и набора форм
- •10.5. Набор форм
- •10.6. Окружение данных
- •10.6.1. Объект DataEnvironment
- •10.6.2. Объекты Cursor и Relation
- •10.7. Объекты, размещаемые в форме
- •10.7.1. Перечень объектов
- •Объекты формы
- •10.7.2. Координаты объектов
- •10.7.3. Примеры управления вложенными объектами
- •10.7.4. Список с различными источниками данных
- •10.8. Панель инструментов: создание и пример употребления
- •10.9. Дополнительные сведения для форм
- •10.9.1. Обмен данными между формами
- •10.9.2. Устранение главного окна vfp
- •10.9.3. Использование изображений
- •10.9.4. Сессия данных
- •11. Меню
- •11.1. Команды и функции для меню
- •Команды и функции
- •11.2. Применение меню
- •11.2.1. Проектировщик меню
- •11.2.2. Создание меню средствами проектировщика
- •Skip For-выражения
- •11.2.3. Короткое меню
- •11.2.4. Меню в sdi-форме
- •11.3. Системное меню
- •Заголовки и имена пунктов горизонтального подменю системного меню vfp
- •Заголовки и имена пунктов вертикальных подменю системного меню vfp
- •12. Извлечение и отображение данных
- •12.1. Перечень команд и системных переменных
- •Список команд и системных переменных
- •12.2. Проектировщик запроса
- •12.3. Перекрестные таблицы
- •Параметры генератора перекрестной таблицы
- •12.4. Диаграммы
- •12.5. Проектировщик отчета
- •12.6. Проектировщик этикетки
- •12.7. Команды для отчета и этикетки
- •13. Классы и объекты
- •13.1. Перечень команд и функций
- •Список команд и функций
- •13.2. Классы
- •Базовые классы vfp
- •Описание элементов массива pemName_comattrib
- •Флаги атрибута
- •13.3. Объекты
- •13.4. События объектов vfp
- •Значения параметра nFlags
- •Значения параметра nInfoType
- •Значения cProperty
- •Значения параметра nNewValue
- •13.6. Информация о классе и объекте
- •Значения параметра nAttribute
- •13.7. Объекты, встроенные в vfp
- •Объекты, встроенные в vfp
- •14. БазА данных
- •14.1. Перечень команд и функций
- •Список команд и функций
- •14.2. Реляционная модель данных
- •Отношение "Сотрудник – Дата рождения"
- •14.3. Функциональные зависимости и нормализация таблиц данных
- •14.3.1. Представление функциональных зависимостей
- •Уточненное однотабличное представление зависимости "Сотрудник – Дата рождения"
- •Уточненное двухтабличное представление зависимости "Сотрудник – Дата рождения"
- •14.3.2. Нормализация отношений
- •Изделия и поставщики
- •Реализация изделий
- •Изделия
- •Поставщики изделий
- •Поставщики
- •Поставщики изделий
- •Виды изделий
- •Изделия
- •14.4. Ссылочная целостность данных
- •14.5. Состав и свойства базы данных и ее компонентов
- •14.6. Команды для баз данных
- •14.6.1. Команды, оперирующие базой данных
- •14.6.2. Команды, оперирующие таблицей базы данных
- •14.6.3. Триггеры
- •14.6.4. Хранимые процедуры
- •14.7. Функции для баз данных
- •Возможные значения параметра cType
- •Возможные значения параметра cType
- •15. Команды и функции для таблиц и их индексов
- •15.1. Перечень команд
- •Список команд и функций
- •15.2. Выбор рабочей области
- •15.3. Открытие и закрытие таблицы
- •15.4. Создание и изменение таблиц
- •Варианты задания параметров FieldType, nFieldWidth и nPrecision
- •Поля таблицы, создаваемой copy structure extended
- •15.5. Сортировка таблицы
- •15.6. Редактирование записей таблиц
- •15.6.1. Общие опции и параметры команд
- •Опции и параметры команд
- •15.6.2. Предварительные замечания
- •15.6.3. Добавление записей
- •Значения по умолчанию полей разных типов
- •15.6.4. Обновление записей
- •15.6.5. Копирование записей
- •15.6.6. Удаление и восстановление записей
- •15.7. Сопутствующие команды
- •Значения для параметра nLevel
- •Команды и функции, на которые влияет установка set compatible
- •15.8. Функции для таблиц
- •15.9. Управление индексами
- •15.9.1. Индексирование таблиц
- •15.9.2. Команды для индексов
- •15.9.3. Функции для индексов
- •Значения nIndexNumber
- •15.10. Поиск и перемещение в таблице
- •15.10.1. Команды для Поиска и перемещения в таблице
- •15.10.2. Функции для Поиска и перемещения в таблице
- •15.11. Блокировка таблиц и записей
- •15.11.1. Автоматическая блокировка
- •Команды и функции, выполняющие автоматическую блокировку
- •15.11.2. Команды, используемые при блокировке таблиц и записей
- •15.11.3. Функции, используемые при блокировке таблиц и записей
- •15.12. Экспорт и импорт данных
- •Типы экспортируемых и импортируемых файлов
- •15.13. Управление свойствами таблиц и курсоров
- •Свойства курсора vfp
- •Свойства курсора vfp, не описанные в табл. 15.11
- •15.14. Курсор-адаптер
- •15.15. Буферизация
- •15.15.1. Виды буферизации
- •15.15.2. Фиксация и отмена изменений
- •Значения параметра nRows
- •Результаты функции getfldstate( ) и параметр nFieldState функции setfldstate( )
- •15.16. Транзакции
- •15.17. Связывание таблиц
- •15.18. Просмотр и редактирование таблиц
- •15.18.1. Команда browse
- •Возможные символы cFormatCodes
- •15.18.2. Вычисляемые поля
- •15.18.3. Поддержка set skip
- •15.18.4. Обновление данных
- •15.18.5. Команды edit и change
- •15.19. Выбор данных
- •Агрегатные функции
- •Значения параметра JoinType
- •Опции и параметры выражения отбора
- •Допустимые неявные преобразования типов данных
- •Результаты неявного преобразования типов данных двух полей
- •Особенности поведения sql-опций в версии 8.0
- •Особенности поведения sql-опций в версии 9.0
- •16. Представление данных
- •16.1. Перечень команд и функций
- •Перечень команд и функций для именованных соединений
- •Перечень функций для sql-соединений
- •Перечень команд и функций для sql-видов
- •16.2. Именованные Соединения
- •16.2.1. Создание Именованного Соединения
- •16.2.2. Команды для именованных соединений
- •16.3.1. Работа с удаленным источником данных
- •16.3.2. Описание базы данных BookSale
- •Некоторые таблицы базы данных BookSale.Mdb
- •Поля таблиц базы данных BookSale.Mdb
- •Индексы таблиц базы данных BookSale.Mdb
- •16.3.3. Параметр и результат sql-Функций
- •16.3.4. Выполнение sql-функций в асинхронном режиме
- •Свойства sql-соединения
- •Столбцы курсора, создаваемого sqltables( )
- •Имена столбцов курсора в формате "foxpro"
- •Имена столбцов курсора в формате "native"
- •Состав массива aCountInfo
- •16.3.6. Пример с запросом к нескольким таблицам
- •16.4. Виды
- •16.4.1. Понятие вида. Интерактивное построение
- •16.4.2. Команды и функции для sql-видов
- •16.4.3. Автономные виды
- •17. Динамический обмен данными
- •Список dde-функций
- •Служебные имена dde-серверов
- •Параметры, передаваемые процедуры, заданной cUdfName
- •Значения параметра cOption
- •Параметр Action и соответствующие значения параметров Item, Data и AdviseStatus
- •Значения параметра cOption
- •Параметры cUdfName-функции
- •Номера dde-ошибок
- •18. Окна, клавиатура, мышь и цвет
- •Команды и функции для окон
- •Команды и функции для клавиатуры
- •Команда и функции для мыши
- •Управление цветом
- •19. Файлы и директории
- •19.1. Перечень команд
- •Список команд
- •19.2. Команды для файлов и директорий
- •19.3. Функции для файлов и директорий
- •Функции для файлов и директорий
- •19.4. Диалоги
- •Одноименные параметры рассматриваемых в разделе функций
- •Наиболее часто употребляемые значения параметра nFlags
- •Форматы графических файлов, поддерживаемые vfp
- •20.1. Перечень команд и функций
- •Список команд и функций
- •20.2. Некоторые понятия xml
- •20.3. Набор символов Unicode
- •20.4. Кодировка utf-8
- •20.5. Базовые правила xml
- •Кодирование зарезервированных символов
- •Формы представления различных типов данных
- •20.6. Схемы
- •20.7. Формат экспортируемых данных
- •20.8. Описание xml-функций
- •Значения параметра nOutputFormat
- •Значения для параметра nFlags
- •Значения параметра nFlags
- •Соответствия Windows-совместимых кодовых страницы и значений xml-атрибута encoding
- •Значения параметра cSchemaName
- •Значения для параметра nFlags
- •Соответствие типов данных vfp и xsd
- •Значения для параметра nFlags
- •Литература
- •Предметный указатель
- •Содержание
Значения параметра nFlags
nFlags |
Биты |
Тип события |
Описание |
0 |
000 |
Объект VFP |
Вызывает код метода oEventHandler перед вызовом кода события cEvent (действует по умолчанию) |
1 |
001 |
" |
Вызывает код события cEvent перед вызовом код метода oEventHandler |
2 |
010 |
" |
Не вызывает метода при программном вызове события объекта oEventSource |
3 |
011 |
" |
При возникновении события вызывает код события cEvent перед вызовом кода метода oEventHandler; не вызывает события (метода) при программном вызове события объекта oEventSource |
4 |
100 |
Сообщение Windows |
Предотвращает рекурсию в результате получения такого же сообщения в момент выполнения его обработчика |
Поскольку осуществляются вызовы и события, и ассоциированного с ним метода, причем в зависимости от значения флага в разной последовательности, в документации рекомендуется, чтобы и событие, и метод возвращали одинаковое значение.
Код события не выполняется, только когда метод объекта oEventHandler вызывается программно и значение первого бита nFlags равно 0.
Нельзя связывать событие, параметры которого передаются по ссылке. Хотя вызов BINDEVENT( ) и не приведет к генерации ошибки, но она обнаружится при возникновении события, например в результате вызова RAISEEVENT( ).
При связывании свойства, имеющего Assign-метод, Delegate-метод может сработать дважды: первый раз при вызове Assign-метода, второй – при выполнении присваивания свойства в самом Assign-методе.
Если связывается свойство, то VFP выполняет связывание с его неявным Assign-методом. Событие возникает при изменении значения свойства.
Некоторые события, такие, как GotFocus, LostFocus, InteractiveChange и ProgrammaticChange, будучи употребленные с функцией BINDEVENT( ), не работают, если 2-й бит параметра nFlags равен 1. В таком случае они воспринимаются как методы, вызванные VFP, а не как события. То же справедливо и для метода Refresh формы.
Функция BINDEVENT( ) не поддерживает свойство Value, которое обрабатывается VFP особым образом. Взамен следует употреблять события InteractiveChange и ProgrammaticChange.
Если событие содержит команду NODEFAULT, то при связывании VFP все равно выполняет событие, поскольку перед ним мог быть вызван Delegate-метод. (Команда NODEFAULT употребляется только со встроенными событиями VFP.)
Повторный вызов BINDEVENT( ) с теми же параметрами VFP игнорируется. Условия связывания, однако, можно изменить, повторно обратившись к BINDEVENT( ) с новым значением nFlags.
Информация об установленных связях получается функцией AEVENTS( ).
Пример. Метод CloseForm формы oForm связывается функцией BINDEVENT( ) с методом ShowMess объекта oCust. При вызове RAISEEVENT( ) первоначально выполняется пользовательский метод ShowMess, выводящий сообщение "Форма будет закрыта!", а затем связанный с ним метод CloseForm, приводящий к закрытию формы oForm. Такой порядок выполнения связанных методов при вызове RAISEEVENT( ) задает последний, равный 1 параметр функции BINDEVENT( ).
public oForm
oCust = CreateObject("CustClass")
oForm = CreateObject("SomeForm")
oForm.Visible = .T.
BindEvent(oCust, "ShowMess", oForm, "CloseForm", 1)
RaiseEvent(oCust, "ShowMess")
define class CustClass as Custom
procedure ShowMess
MessageBox("Форма будет закрыта!")
endProc
endDefine
define class SomeForm as Form
procedure CloseForm
ThisForm.Release
endProc
endDefine
Если вызвать метод программно:
…
&& Устанавливаем nflags = 2
BindEvent(oCust, "ShowMess", oForm, "CloseForm", 2)
oCust.ShowMess
то после вывода процедурой ShowMess сообщения форма oForm не будет закрыта: связанный метод CloseForm не выполнится.
Если вызов функции BINDEVENT( ) оставить без изменения (с nflags = 1), то программный вызов oCust.ShowMess инициирует также и срабатывание метода CloseForm и форма закроется.
Функции
UNBINDEVENTS(oEventSource, cEvent, oEventHandler, cDelegate) )
или
UNBINDEVENTS(oEventObject)
разрывают связь между событиями, свойствами или методами объектов VFP, установленную функцией BINDEVENT( ).
Функция возвращает число прекращенных связей. Функция вернет 0, если выполняется попытка разорвать несуществующую связь.
В первом варианте разрывается связь указанного параметром cEvent события. Смысл параметров для первого варианта см. в описании функции BINDEVENT( ).
Во варианте втором разрываются все ассоциируемые с объектом oEventObject события (свойства, методы), включая как события объекта oEventObject, выступающие в качестве источников событий, так и события других объектов, связанные с Delegate-методами объекта oEventObject.
Если имеющуюся связь прервать не удается, то VFP генерирует ошибку.
Команда
READ EVENTS
начинает обработку событий.
В каждый момент времени может быть активна только одна команда READ EVENTS. Все последующие команды эффекта не имеют.
Пример см. в описании метода AddObject.
Команда
CLEAR EVENTS
завершает обработку событий, начало которой положено командой READ EVENTS.
После выполнения команды CLEAR EVENTS программа продолжает функционирования начиная со строки следующей после команды READ EVENTS.
13.5. COM-объекты
COM-объект создается с использование модели многокомпонентных объектов. VFP, с одной стороны, имеет средства доступа к COM-объектам, созданным другими приложениями, а с другой, может строить COM-объекты, доступные другим приложениям.
COM-объекты имеют такую же организацию, что и рассмотренные выше объекты VFP-классов. То есть обладают свойствами, методами и событиями.
Доступ к методам, событиям и свойствам COM-объекта осуществляется через его интерфейс, реализуемый как группа взаимосвязанных функций. В общем случае объект может поддерживать несколько интерфейсов.
Приложение, осуществляющее доступ к COM-объектам, называется клиентом COM-объекта.
Приложение, создавшее COM-объект и употребляемое для его редактирования, называется сервером COM-объекта.
В качестве экземпляра COM-объекта могут выступать ActiveX-элемент управления, COM-компонент или OLEBound-объект (поле типа General).
Ссылку на COM-объект возвращают функции CREATEOBJECT( ), CREATEOBJECTEX( ) и NEWOBJECT( ).
Пример. Открывается лист Microsoft Excel.
public x
set oleobject on
x = NewObject('Excel.Sheet')
x.Application.Visible = .T.
Функция
CREATEOBJECTEX(cCLSID | cPROGID, cComputerName [, cIID]) )
создает экземпляр зарегистрированного COM-объекта на удаленном компьютере. Возвращает ссылку на созданный экземпляр. Тип результата – Object.
Параметры:
cCLSID | cPROGID – идентификатор класса (CLSID) или программный идентификатор (PROGID) COM-объекта. Если задается CLSID, то COM-объект должен быть зарегистрирован на удаленном сервере, заданном параметром cComputerName. Если – PROGID, то COM-объект должен быть зарегистрирован как на локальном компьютере пользователя, так и на удаленном. Попытка использовать PROGID без регистрации сервера на локальном компьютере приведет к генерации OLE-ошибки "Invalid Class String" с кодом 0x800401f3.
Для VFP серверов Автоматизации, созданных на локальном компьютере, можно использовать свойства CLSID и PROGID для задания локальных CLSID и PROGID значений.
cComputerName – имя удаленного компьютера, на котором создается экземпляр COM-объекта. Если cComputerName – это пустая строка, то экземпляр COM-объекта создается на локальном компьютере. Параметр cComputerName поддерживает UNC-имена (universal naming convention), такие, как "\\myserver" и "myserver," и DNS-имена (domain system names).
cIID – задает GUID (глобальный уникальный идентификатор) интерфейса CLSID или PROGID, когда создается рано связываемый экземпляр класса. Если в качестве cIID передается пустая строка, то VFP пытается получить заданный по умолчанию интерфейс CLSID или PROGID.
Пример:
public x
x = CreateObjectEx("Excel.Application", "", ;
"{000208D5-0000-0000-C000-000000000046}")
&& Следующий вызов использует заданный по умолчанию интерфейс Excel.Application
&& x = CreateObjectEx("Excel.Application", "", "")
&&
&& Открываем Microsoft Excel
x.Visible = .T.
&& или:
&& x.Application.Visible = .T.
Функция CREATEOBJECTEX( ) не может быть использована вместо функции CREATEOBJECT( ).
CREATEOBJECTEX( ) поддерживает раннее связывание (на этапе компиляции) через cIID, что помогает улучшить производительность за счет отказа от многочисленных IDispatch-вызовов.
Функция
GETINTERFACE(oObject [, cIID | cInterface [, cTypelib | cProgID]]) )
обеспечивает посредством раннего связывания доступ к свойствам, методам и событиям COM-объекта. Возвращает ссылку на интерфейс COM-объекта.
Параметры:
oObject – ссылка на COM-объект.
cIID – задает GUID интерфейса объекта oObject. Параметр cIID может быть таким интерфейсом, как "IContextState" или GUID, например "{94631BEC-EE81-479A-AE64-A6CFC37B4799}". Если параметр – это "IDispatch", то функция GETINTERFACE( ) возвращает ссылку на поздно связываемый (на этапе исполнения) интерфейс IDispatch. Если параметр cIID не задан, то функция вернет рано связываемый интерфейс объекта.
cInterface – имя интерфейса.
cTypelib – имя библиотеки типа, содержащей класс объекта oObject.
cProgID – имя программы для поиска библиотеки типа.
Функция GETINTERFACE( ) не может быть использована для объектов VFP.
Если DLL строится на платформе Windows 9x (Windows95, Windows98 и Windows ME), то библиотека типа не включается в DLL. Когда GETINTERFACE( ) ссылается на DLL, созданную на одной из этих платформ, то в качестве третьего параметра следует использовать имя библиотеки типа, а не имя DLL, например:
oX = GetInterface(x, "IMyClass", "MyClass1.tlb")
Если DLL построена на платформе Windows XP, Windows 2000 или Windows NT, то допустим следующий вызов:
oX = GetInterface(x, "IMyClass", "MyClass1.DLL")
Пример. Пример, демонстрирующий, как можно использовать VFP COM-сервер для управления транзакциями COM+ приложения. COM-сервер, содержащий этот код, должен быть добавлен в COM+ приложение до его вызова клиентом.
local oMTX, oContext, oContextState
local lTxnState, lGetTxnState, lDone, lGetDone
lGetDone = .F. && Начальные установки
lGetTxnState = 0
&&
oMTX = CreateObject("MTXAS.APPSERVER.1")
oContext = oMTX.GetObjectContext( )
oContextState = GetInterface(oContext, "IContextState")
&&
&& Установки активизации:
&& .T. – сделать неактивным, .F. – оставить активным
lDone = .T.
oContextState.SetDeactivateOnReturn(lDone)
oContextState.GetDeactivateOnReturn(@lGetDone)
…
&& Установки транзакции:
&& 0 – выполнить, 1 – прервать
lTxnState = 1
oContextState.SetMyTransactionVote(lTxnState)
oContextState.GetMyTransactionVote(@lGetTxnState)
Функция
GETOBJECT(cFileName | Moniker [, cClassName]) )
возвращает ссылку на объект Автоматизации. Тип возвращаемого значения – Object.
cFileName – полное имя активизируемого файла. Приложение указывать не нужно, поскольку динамическая библиотека OLE находит приложение по имени указанного файла.
Пример. Переменной mSineVar присваивается ссылка на объект Sine.xls.
mSineVar = GetObject('d:\Sine.xls')
XLApp = mSineVar.Application
XLApp.WorkBooks.Open('d:\Sine.xls')
XLApp.Visible = .T.
Moniker – идентификатор COM-объекта, имеющего IMoniker-интерфейс.
cClassName – имя класса, которому принадлежит получаемый объект. Задается, когда приложение сохраняет в одном файле несколько разнотипных объектов. Если имя файла или класса указано неверно, то генерируется OLE-ошибка и функция возвращает пустую строку.
Пример 1. Состав массива someArray отображается в Microsoft Excel.
declare someArray(7, 4)
&& Протяженности массива someArray по первому и второму измерениям
m = Alen(someArray, 1)
n = Alen(someArray, 2)
&& Инициализация массива someArray
someArray(1, 1) = ""
for j = 2 to n
someArray(1, j) = "C" + Transform(j - 1)
next
for i = 2 to m
someArray(i, 1) = "X" + Transform(i)
for j = 2 to n
someArray(i, j) = i + j
next
next
&& Массив someArray:
&& |
|
C1 |
C2 |
C3 |
&& |
X1 |
4 |
5 |
6 |
&& |
X2 |
5 |
6 |
7 |
&& |
X3 |
6 |
7 |
8 |
&& |
X4 |
|
8 |
9 |
&& |
X5 |
7 |
9 |
10 |
&& |
X6 |
8 |
10 |
11 |
&&
&& Ссылка на Excel.Application
XLApp = GetObject("", "Excel.Application")
&& Делаем объект видимым, добавляем рабочую книгу,
&& получаем ссылку на активный лист Excel
XLApp.Visible = .T.
XLApp.WorkBooks.Add( )
XLSheet = XLApp.ActiveSheet
&& Переносим данные массива в ячейки листа Excel
&& Результат приведен на рис. 13.7
for i = 1 to m
for j = 1 to n
XLSheet.Cells(i, j).Value = someArray(i, j)
next
next
Рис. 13.7. Массив someArray в Microsoft Excel
Пример 2. По данным массива someArray строится диаграмма Microsoft Excel.
public oXLChart1
declare someArray(7, 4)
&& Протяженности массива someArray по первому и второму измерениям
m = Alen(someArray, 1)
n = Alen(someArray, 2)
&& Код инициализации массива someArray см. в примере 1
…
&&
&& Получаем ссылку на объект Excel.Chart
oXLChart1 = GetObject("", "Excel.Chart")
XLApp = oXLChart1.Application
XLApp.Visible = .T.
XLSheet = XLApp.WorkSheets(1)
&& Передаем данные массива someArray первому листу Microsoft Excel
&& Результат приведен на рис. 13.8
for i = 1 to m
for j = 1 to n
XLSheet.Cells(i, j).Value = someArray(i, j)
next
next
Рис. 13.8. Диаграмма Microsoft Excel по данным массива someArray
Пример 3. В Microsoft Word передается строка текста.
public oWDdoc
oWDdoc = GetObject("", "Word.Basic") && Или: oWDdoc = NewObject("Word.Basic")
oWDdoc.AppShow
oWDdoc.FileNewDefault
oWDdoc.Insert('Строка из приложения VFP')
Функция
COMCLASSINFO(oObject [, nInfoType]) )
возвращает регистрационную информацию о COM-объекте. Тип результата – Character.
Функция COMCLASSINFO( ) вернет пустую строку, если регистрационная информация для указанного объекта недоступна.
Параметры:
oObject – ссылка на COM- или OLE-объект; может быть также ссылкой и на объект, созданный на основе класса VFP, например класса Form.
nInfoType – состав возвращаемой информации. Принимает приведенные в табл. 13.6 значения.
Таблица 13.6
