- •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
- •Литература
- •Предметный указатель
- •Содержание
Значения параметра nInfoType
nInfoType |
Что возвращается |
1 |
Программный интерфейс объекта (ProgID) (по умолчанию) |
2 |
Независимый от версии программный интерфейс объекта |
3 |
Дружественное имя объекта |
4 |
Идентификатор класса COM-объекта |
5 |
Вид объекта. Функция вернет одно из следующих значений: 1 – объект VFP; 2 – ActiveX-элемент управления; 3 – COM-компонент; 4 – OLEBound-объект (поле General) |
Пример:
mSineVar = GetObject("d:\Sine.xls")
? ComClassInfo(mSineVar, 1) && Напечатает: Excel.Sheet.8
? ComClassInfo(mSineVar, 2) && Напечатает: Excel.Sheet
? ComClassInfo(mSineVar, 3) && Напечатает: Лист Microsoft Excel
? ComClassInfo(mSineVar, 4) && Напечатает: {00020820-…-000000000046}
? ComClassInfo(mSineVar, 5) && Напечатает: 3
Замечания:
Серверы Автоматизации VFP являются COM-объектами. EXE-файлы и динамические DLL-библиотеки создаются командой BUILD EXE | DLL | MTDLL.
Если экземпляр ActiveX-элемента управления создается CREATEOBJECT( ), например следующим образом:
x = CreateObject("MSComCtl2.MonthView.2")
то при nInfoType = 5 COMCLASSINFO( ) вернет 3 (COM-компонент).
Функция
COMPROP(oCOMObject, cProperty [, eValue]) )
устанавливает и возвращает значения свойств UTF8 и PUTREF COM-объекта. Если параметр eValue опущен, то функция вернет текущее значение свойства cProperty.
Параметры:
oCOMObject – ссылка на COM-объект. Используется полное имя, например oForm.OLEControl1.
cProperty – имя свойства COM-объекта. Может принимать приведенные в табл. 13.7 значения.
Таблица 13.7
Значения cProperty
cProperty |
Описание |
UTF8 |
Определяет, будет ли строка UNICODE, получаемая от COM-объекта, преобразовываться в ANSI (по умолчание преобразование выполняется) |
PUTREF |
Устанавливает вид присваивания для свойств: "PROPERTY_PUT" (по умолчанию) или "PUTREF". В первом случае устанавливается значение, во втором – ссылка |
eValue – задает вариант поведения cProperty. Принимает следующие значения:
0 – используется заданное по умолчанию поведение.
1 – в случае UTF8 строка UNICODE не преобразовывается в строку ANSI, а для свойства PUTREF VFP первоначально пытается использовать значение "PUTREF", а в случае неудачи употребляется присваивание "PROPERTY_PUT".
Пример:
ComProp(oForm.OLEControl1, 'PUTREF', 1)
Функция
COMARRAY(oObject [, nNewValue]) )
задает способ передачи массива COM-объекту.
Возвращает, вызванная без параметров, текущую COMARRAY-установку. Тип результата – Numeric.
Параметры:
oObject – ссылка на COM-объект.
nNewValue – число, определяющее способ передачи массива COM-объекту. Принимает приведенные в табл. 13.8 значения.
Таблица 13.8
Значения параметра nNewValue
nNewValue |
Описание |
0 |
Массив передается по значению как 0-массив |
1 |
Массив передается по значению как 1-массив (по умолчанию) |
10 |
Массив передается по ссылке как 0-массив |
11 |
Массив передается по ссылке как 1-массив |
100 |
Массив фиксированной формы (форма массива не может быть изменена COM-объектом) |
1000 |
Byte-массивы не преобразовываются в строки |
Замечание. Индекс первого элемента 0-массива равен 0; индекс первого элемента 1-массива равен 1.
Значения 100 и 1000 добавляются к значению 0, 1, 10 или 11.
Функция COMARRAY( ) применяется, только когда массив передается COM-объекту с использованием следующего синтаксиса:
oComObject.Method(@MyArray)
Когда передается Byte-массив (VT_UI1), то VFP преобразовывает его в строку, если только к nNewValue не добавлено число 1000.
Если клиент передает Byte-массив по ссылке VFP COM-серверу, то в VFP необходимо добавить к nNewValue значение 1000. Это можно выполнить в Init-событии VFP COM-сервера, например так:
ComArray(This, 1000)
Если префикс @ опущен, то COM-объекту будет передан только первый элемент массива; установка COMARRAY( ) не действует.
Пример. Массив передается COM-объекту с nNewValue = 11 + 100. Поэтому попытка изменить его размер методом RedimensionArray класса ArrayHandler приводит к ошибке.
Перед запуском примера, для проекта, содержащего определение класса
define class ArrayHandler as Custom OLEPUBLIC
procedure RedimensionArray(aArray, nRows)
dimension aArray[nRows]
endproc
endDefine
строится DLL-файл T1.dll:
build dll T1.dll from d:\Projects\ArrayHandler
При таком вызове команды BUILD DLL файл T1.dll запишется в директорию, из которой стартует VFP, возвращаемую функцией HOME(0).
Код программы, запускаемой из VFP:
local loSvr, laTest
loSvr = NewObject("t1.ArrayHandler")
dimension laTest[10]
laTest = 3 && Инициализация массива laTest
? ComArray(loSvr, 11 + 100)
&& COM-сервер вернет ошибку (рис. 13.9), поскольку выполняется попытка изменить
&& размер массива laTest, переданного с параметром nNewValue = 11 + 100
loSvr.RedimensionArray(@laTest, 4)
? Alen(laTest)
Рис. 13.9. Ошибка, полученная от COM-сервера
Ошибки не возникнет, если в качестве второго параметра взять число 10:
loSvr.RedimensionArray(@laTest, 10)
Функция
COMRETURNERROR(cExceptionSource, cExceptionText) )
заполняет структуру COM-исключения информацией, которую клиент Автоматизации может использовать для определения источника ошибки Автоматизации.
Параметры:
cExceptionSource – текст, обозначающий источник ошибки.
cExceptionText – текст для описания исключения.
При выполнении функции COMRETURNERROR( ) указанный текст помещается в структуру COM-исключения; работа текущего метода сервера Автоматизации прекращается; процесс управления передается клиенту.
Текст, помещенный в структуру COM-исключения отобразит функция AERROR( ).
Функция
EVENTHANDLER(oCOMObject, oVFPObject [, lUnbind]) )
связывает события COM-объекта с методами объекта VFP; состав методов и их интерфейс определяется составом и интерфейсом событий COM-объекта. При наличии связи вместо события COM-объекта будет выполняться соответствующий метод VFP-объекта.
Функция вернет .T., если связь установлена, или .F. – в противном случае.
Параметры:
oCOMObject – ссылка на COM-объект.
oVFPObject – ссылка на объект VFP. Класс VFP, экземпляром которого объект является, должен содержать соответствующим образом оформленную опцию IMPLEMENTS и методы с интерфейсами, повторяющими интерфейсы событий COM-объекта.
lUnbind – если употребляется со значением .T., то функция разрывает связь событий COM-объекта с методами объекта VFP.
В общем случае один COM-объект можно связать с несколькими объектами VFP и несколько COM-объектов VFP могут быть связаны с одним объектом VFP.
Связь событий автоматически прекращается, когда COM- или VFP-объект освобождается.
Пример. Связываются события COM-объекта oRS класса RecordSet библиотеки классов ADODB. Библиотека расположена в файле c:\Program Files\Common Files\System\Ado\msAdo15.dll, представляющем Microsoft ActiveX Data Objects 2.7 Library.
Библиотека классов ADODB имеет приведенные на рис. 13.10 классы; на том же рисунке приведены и события класса RecordSet.
Рис. 13.10. Классы библиотеки ADODB и события класса RecordSet
Библиотека позволяет управлять данными удаленной базы данных.
В примере создается соединение с источником данных BookSaleDataBase, имеющим в частности таблицу Authors, второе поле которой содержит фамилию и имя авторов (подробно база данных BookSale.mdb описана в разд. 16.3.2).
Выполняется запрос к таблице Authors. С результатом запроса ассоциируется объект oRS.
Затем события объекта oRS связываются с методами объекта oEvents – экземпляра определенного в программе класса MyClass. При изменении значения поля Authors в первой записи результата запроса выполняются соответствующие обработчики событий объекта oEvents и выводятся сообщения, генерируемые методом SayProgAndDateTime – имя обработчика и дата и время возникновения события (все обработчики событий обращаются к этому методу).
После изменения значения поля связь событий объектов разрывается. Осуществляется переход к следующей записи (oRS.MoveNext) и вновь изменяется значение поля Authors. Однако поскольку связь обработчиков событий разорвана, никаких сообщений не выводится: обработчики событий объекта oEvents не выполняются.
local oEvents
local oRS as adodb.RecordSet
local oConn as adodb.Connection
oEvents = NewObject("MyClass")
oConn = NewObject("adodb.Connection")
&& Устанавливаем соединение с источником данных
oConn.ConnectionString = "DSN=BookSaleDataBase"
oConn.Open
&& Выполняем запрос к таблице Authors
oRS = oConn.Execute("select * from Authors")
&& Устанавливаем связь между обработчиками событий объектов oRS и oEvents
EventHandler(oRS, oEvents)
&& Выводимые обработчиками сообщения см. после текста программы
? Upper(oRS.Fields(1).Value)
&& Разрываем связь между обработчиками событий объектов oRS и oEvents
&& Вывод сообщений прекращается
EventHandler(oRS, oEvents, .T.)
oRS.MoveNext
? Upper(oRS.Fields(1).Value)
oConn.Close
&& Определение класса MyClass
define class MyClass as Session OLEPUBLIC
implements RecordsetEvents in "adodb.RecordSet"
&&
&& Необходимо описать методы, соответствующие обработчикам
&& всех событий класса RecordSet
&&
procedure RecordSetEvents_WillChangeField(cFields as Number @, ;
Fields as Variant @, adStatus as Variant @, pRecordset as Variant @) as Variant
This.SayProgAndDateTime(Program( ))
endProc
&&
procedure RecordSetEvents_FieldChangeComplete(cFields as Number @, ;
Fields as Variant @, pError as Variant @, adStatus as Variant @, ;
pRecordset as Variant @) as Variant
This.SayProgAndDateTime(Program( ))
endProc
&&
procedure RecordSetEvents_WillChangeRecord(adReason as Variant @, ;
cRecords as Number @, adStatus as Variant @, ;
pRecordset as Variant @) as Variant
This.SayProgAndDateTime(Program( ))
endProc
&&
procedure RecordSetEvents_RecordChangeComplete(adReason as Variant @, ;
cRecords as Number @, pError as Variant @, adStatus as Variant @, ;
pRecordset as Variant @) AS Variant
This.SayProgAndDateTime(Program( ))
endProc
&&
procedure RecordSetEvents_WillChangeRecordSet(adReason as Variant @, ;
adStatus as Variant @, pRecordset as Variant @) as Variant
This.SayProgAndDateTime(Program( ))
endProc
&&
procedure RecordSetEvents_RecordSetChangeComplete(adReason as Variant @, ;
pError as Variant @, adStatus as Variant @, pRecordset as Variant @) as Variant
This.SayProgAndDateTime(Program( ))
endProc
&&
procedure RecordSetEvents_WillMove(adReason as Variant @, ;
adStatus as Variant @, pRecordset as Variant @) as Variant
This.SayProgAndDateTime(Program( ))
endProc
&&
procedure RecordSetEvents_MoveComplete(adReason as Variant @, ;
pError as Variant @, adStatus as Variant @, pRecordset as Variant @) as Variant
This.SayProgAndDateTime(Program( ))
endProc
&&
procedure RecordSetEvents_EndOfRecordset(fMoreData as Logical @, ;
adStatus as Variant @, pRecordset as Variant @) as Variant
This.SayProgAndDateTime(Program( ))
endProc
&&
procedure RecordSetEvents_FetchProgress(Progress as Number @, ;
MaxProgress as Number @, adStatus as Variant @, ;
pRecordset as Variant @) as Variant
This.SayProgAndDateTime(Program( ))
endProc
&&
procedure RecordSetEvents_FetchComplete(pError as Variant @, ;
adStatus as Variant @, pRecordset as Variant @) as Variant
This.SayProgAndDateTime(Program( ))
endProc
&&
&& Функция, вызываемая всеми обработчиками событий класса
function SayProgAndDateTime(ProgName)
? ProgName + ' ' + Transform(DateTime( ))
endFunc
endDefine
Результат:
MyClass.RecordSetEvents_WillChangeRecordSet |
02/13/05 08:27:52 PM |
MyClass.RecordSetEvents_RecordSetChangeComplete |
02/13/05 08:27:52 PM |
MyClass.RecordSetEvents_WillMove |
02/13/05 08:27:52 PM |
MyClass.RecordSetEvents_MoveComplete |
02/13/05 08:27:52 PM |
ADAMS, PAT |
|
ADRIAN, MERV |
|
Замечание. При перетаскивании интерфейса из браузера COM-объекта (рис. 13.11) в программу VFP генерируется следующий код (приводится его фрагмент):
x=NEWOBJECT("MyClass")
DEFINE CLASS MyClass AS session OLEPUBLIC
IMPLEMENTS RecordsetEvents IN ;
"C:\PROGRAM FILES\COMMON FILES\SYSTEM\ADO\MSADO15.DLL"
PROCEDURE RecordsetEvents_WillChangeField(cFields AS Number, ;
Fields AS VARIANT, adStatus AS VARIANT @, ;
pRecordset AS VARIANT) AS VOID
* add user code here
ENDPROC
…
ENDDEFINE
Рис. 13.11. Интерфейс RecordsetEvents можно перетащить в программу VFP
Команда
APPEND GENERAL GeneralFieldName [FROM FileName] [DATA cExpression] [LINK] [CLASS OLEClassName]
импортирует OLE-объект из файла и помещает его в general-поле. Если OLE-объект в general-поле имеется, то он будет замещен.
Опции и параметры:
GeneralFieldName – имя general-поля текущей записи, в которое помещается OLE. Если поле принадлежит нетекущей таблице, то его имя предваряется псевдонимом таблицы и точкой.
FROM FileName – имя файла, содержащего OLE-объект. Если путь опущен, то файл ищется в директории по умолчанию.
DATA cExpression – символьное выражение, значение которого передается OLE-объекту general-поля. Опция задается, если OLE-объект способен принять такой параметр. Так, нельзя передать строку рисунку Paintbrush.
LINK – устанавливает связь между OLE-объектом и файлом, содержащим этот объект (создается связанный OLE-объект). В этом случае OLE-объект появляется в general-поле, но его определение остается в файле. Если опция опущена, то выполняется внедрение OLE-объекта.
Связанные OLE-объект, если его файл редактировался независимо, отобразит все произведенные изменения. Внедренный OLE-объект их не покажет.
CLASS OLEClassName – OLE-класс OLE-объекта, отличный от класса по умолчанию. Имя класса задается, например, когда расширение файла, содержащего OLE-объект, отлично от расширения по умолчанию или когда расширение по умолчанию используется несколькими серверами Автоматизации.
Команда APPEND GENERAL GeneralFieldName, выполненная без последующих опций, удалит OLE-объект из general-поля.
Пример:
&& Таблица Test открыта и имеет general-поле с именем GenField.
select Test
&& Добавляем в поле GenField связанный OLE-объект
append general GenField from d:\Sine.xls link
&& Открываем окно для редактирования OLE-объекта
&& Приложение Excel будет вызвано после двойного удара мышью
&& в окне, открытом командой MODIFY GENERAL
modify general GenField
Замечание. Объект в general-поле можно вставить из буфера обмена, употребив Edit – Paste или Edit – Paste Special. Для очистки general-поля можно употребить Edit – Clear.
Команда
MODIFY GENERAL GeneralField1 [, GeneralField2 ...] [NOMODIFY] [NOWAIT] [[WINDOW WindowName1] [IN [WINDOW] WindowName2 | IN SCREEN]]
открывает окна редактирования general-полей GeneralField1 [, GeneralField2 ...] текущей записи. Если нужно открыть окно для поля в нетекущей таблице, то имя поля предваряется псевдонимом таблицы и точкой.
Описание опций и параметров см. в табл. 1.6.
Команда
BUILD DLL DLLFileName FROM ProjectName [RECOMPILE]
создает динамическую библиотеку (dynamic-link library – DLL), используя имеющуюся в файле проекта информацию о классах.
Опции и параметры:
DLLFileName – имя файла динамической библиотеки. Может содержать путь. Расширение по умолчанию – DLL.
FROM ProjectName – имя проекта, определения классов которого выгружаются в динамическую библиотеку.
Проект должен содержать OLEPUBLIC-класс. При отсутствии такового генерируется ошибка. Такой класс определяется либо DEFINE CLASS с опцией OLEPUBLIC, либо в проектировщике класса в результате установки флажка OLE Public в диалоге Class Info, вызываемом из меню Class.
RECOMPILE – указывает, что перед построением DLL-библиотеки проект будет откомпилирован. Компилируются все программы, формы, отчеты, коды классов и хранимые процедуры базы данных проекта.
Команда BUILD DLL автоматически регистрирует серверы в системном регистре и в списке Server Classes (классы серверов) вкладки Servers диалога Project Information, открываемом после выполнения команды меню Project – Project Info или в результате нажатия Ctrl+J или Alt+Enter.
Пример см. в описании функции COMARRAY( ).
Команда
BUILD MTDLL MTDLLFileName FROM ProjectName [RECOMPILE]
создает многониточную динамическую библиотеку, используя имеющуюся в файле проекта информацию о классах.
Смысл опций и параметров см. в описании команды BUILD DLL.
