- •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
- •Литература
- •Предметный указатель
- •Содержание
6.1.4. Массив как параметр программных компонентов
Массив нужно передавать другому программному компоненту по ссылке. При передаче массива программному компоненту (основной программе, процедуре или функции) или объекту, например форме, в списке параметров указывается его имя.
Пример. Процедура InitArray( ) принимает массив, переданный по ссылке, и выполняет его инициализацию, записывая в каждый элемент массива его номер. Результат используется в основной программе.
dimension someArray(3, 4)
&& Передаем массив someArray по ссылке
InitArray(@someArray)
&& Печатаем значение 7-го элемента массива
? someArray(2, 3) && Напечатает: 7
procedure InitArray(someArray)
&& elemNo – номер элемента массива
&& Обращаемся к двумерному массиву, как к одномерному
for elemNo = 1 to Alen(someArray)
someArray(elemNo) = elemNo
endFor
endProc
Массив, переданный другому программному компоненту по ссылке, объявлять в программе-приемнике нет необходимости.
Также передачу массива, как и иного параметра, по ссылке обеспечит установка SET UDFPARMS в REFERENCE, например:
set udfparms to reference
InitArray(someArray) && Знак @ уже не нужен
Если же передавать массив по значению и если соответствующий формальный параметр процедуры не объявлен как массив, то будет передан только первый элемент массива, а формальный параметр процедуры будет интерпретироваться как скаляр, например:
dimension someArray(3, 4)
someArray = 2
&& Передаем массив someArray по значению
set udfparms to value
PassAsValue(someArray)
procedure PassAsValue(someArray)
? someArray && Напечатает: 2
endProc
Если же при передаче по значению соответствующий формальный параметр объявлен как массив, то все его значения будут равны .F.
Замечание. Массив как параметр может быть передан и таким объектам VFP, как форма, меню и др.
Для передачи массива в программный компонент иного файла помимо рассмотренного механизма можно в вызываемом программном компоненте наряду с командой PARAMETERS употребить команду EXTERNAL.
Команда
EXTERNAL ARRAY ArrayList
обеспечивает доступ к массивам, созданным в другом программном компоненте.
Параметр:
ArrayList – список внешних массивов; в качестве разделителя между элементами списка применяется запятая.
Пример. Массив объявляется и инициализируется в основной программе файла d:\Prog1.prg и передается и выводится в основной программе файла d:\Output.prg.
&& Состав файла d:\Prog1.prg
&&
local someArray(2, 3)
store 5 to someArray && Инициализация массива someArray
&& Печатаем массив; массив передается по ссылке
do d:\Output with someArray
&& Содержимое файла d:\Output.prg
&&
parameters someArray
external array someArray
for iRow = 1 to Alen(someArray, 1)
for iCol = 1 to Alen(someArray, 2)
?? someArray(iRow, iCol) && Напечатает: 5 5 5 5 5 5
endFor
endFor
Также команда EXTERNAL ARRAY может быть употреблена и в вызывающей программе (см. описание команды в справке VFP).
6.1.5. Функции для массивов
Все рассматриваемые в разделе функции имеют параметр ArrayName – имя формируемого или преобразовываемого, или анализируемого функцией массива.
Для функций, извлекающих информацию в массив, справедливо следующее: если массив ArrayName не существует, то он будет создан, если существует, то приобретет форму, необходимую для хранения результата. Если функция не находит необходимых для заполнения массива данных, то несуществующий массив, создан не будет, а существующий останется без изменений.
При вызове функций, преобразовывающих массив или получающих о нем данные, массив ArrayName должен существовать.
Функции для массивов приводятся в алфавитном порядке.
Функция
ACLASS(ArrayName, oExpression)
заносит в одномерный массив ArrayName имя класса объекта oExpression и имена классов-потомков. Функция возвращает число занесенных в массив элементов.
Пример. Создается класс VectorInit, содержащий метод InitArray, выполняющий инициализацию вектора. На его основе создается класс VectorFunction, содержащий метод DotProduct, возвращающий скалярное произведение двух векторов одной длины. Длина векторов задается свойством arraySize класса VectorInit.
&& Создаем объект типа VectorFunction
vFunc = CreateObject("VectorFunction")
&& Формируем и печатаем массив arrayClassNames
nCount = Aclass(arrayClassNames, vFunc)
for k = 1 to nCount
? arrayClassNames(k)
endFor
&&
&& Напечатает:
&& VectorFunction
&& VectorInit
&& Custom
&&
&& Создаем одномерные массивы arrayA и arrayB
&& Размер массивов
vFunc.ArraySize = 10
dimension arrayA(vFunc.ArraySize), arrayB(vFunc.ArraySize)
&& Выполняем их инициализацию массивов
&& Передаем имена массивов по ссылке
vFunc.InitArray(@arrayA)
vFunc.InitArray(@arrayB)
&& Вычисляем скалярное произведение векторов arrayA и arrayB
&& Массивы должны быть переданы по ссылке
? vFunc.DotProduct(@arrayA, @arrayB)
&&
&& Возможный результат: 2.5671
&& Освобождаем объект vFunc
release vFunc
&& Создаем класс VectorInit
define class VectorInit as Custom
&& ArraySize – свойство класса VectorInit
&& используется для задания размера инициализируемого вектора
ArraySize = 1
&& Инициализация вектора vect размера This.ArraySize случайными числами
procedure InitArray(vect)
for k = 1 to This.ArraySize
vect(k) = Rand( )
endFor
endProc
endDefine
&& Создаем класс VectorFunction; VectorInit – имя класса-родителя
define class VectorFunction as VectorInit
&& Вычисляет скалярное произведение векторов равной длины
function DotProduct(a, b)
dp = 0
for k = 1 to This.ArraySize
dp = dp + a(k) * b(k)
endFor
return dp
endFunc
endDefine
Функция
ACOPY(SourceArrayName, DestinationArrayName [, nFirstSourceElement [, nNumberElements [, nFirstDestElement]]])
копирует элементы одного массива в другой. При копировании данные приемника заменяются данными источника. Если массив-приемник не существует, то он будет создан. Форма созданного массива будет совпадать с формой массива-источника. Если массив приемник существует, то он при копировании примет форму массива-источника.
Параметры:
SourceArrayName, DestinationArrayName – соответственно имена массивов источника и приемника данных.
nFirstSourceElement – номер элемента массива-источника, с которого начинается копирование. При отсутствии параметра копирование начинается с первого элемента.
nNumberElements – число копируемых элементов. Если параметр отсутствует или равен 1, то копируются все элементы начиная с nFirstSourceElement.
nFirstDestElement – первый замещаемый элемент массива-приемника.
Замечание. Если задание параметров nFirstSourceElement, nNumberElements и nFirstDestElement приведет к нарушению границ массива, то возникнет ошибка Subscript is outside range.
Функция ACOPY( ) возвращает число скопированных элементов.
Пример. Копируются начиная со второго 3 элемента массива sArray в массив dArray, в котором первым замещается 3-й элемент.
dimension sArray(2, 3), dArray(2, 3)
store "s" to sArray
store "d" to dArray
Acopy(sArray, dArray, 2, 3, 3)
&& Массив dArray: |
d |
d |
s |
&& |
s |
s |
d |
Функция
ADATABASES(ArrayName)
заносит имена всех открытых баз данных и пути к файлам баз данных в двумерный массив ArrayName. Первый элемент каждой строки массива содержит имя базы данных, второй – путь к базе данных. Возвращает число строк в результирующем массиве.
Пример:
close databases
open database 'd:\HomeLibrary\HomeLibrary'
Adatabases(arrayDBC)
? arrayDBC(1, 1)
? arrayDBC(1, 2)
close databases
Результат:
HOMELIBRARY
D:\HOMELIBRARY\HOMELIBRARY.DBC
Функция
ADBOBJECTS(ArrayName, cSetting)
записывает имена соединений, отношений, таблиц и SQL-видов текущей базы данных в массив ArrayName. Если параметр cSetting имеет значение CONNECTION, TABLE или VIEW, то формируется одномерный массив, если RELATION – двумерный. Каждая строка одномерного массива содержит имя соединения, таблицы или SQL-вида, в каждой строке двумерного массива ее 1-й элемент содержит имя дочерней таблицы, 2-й – имя родительской таблицы, 3-й – имя индекса дочерней, а 4-й – имя индекса родительской таблицы. В 5-й элемент записывается информация о ссылочной целостности данных.
Если межтабличная связь не имеет пользовательских правил контроля ссылочной целостности, то элемент содержит 3 символа, соответствующие типу задаваемых в Referential Integrity Builder (см. рис. 2.11) правил контроля ссылочной целостности для обновления, удаления и вставки записей. При этом 1-й символ означает тип правила обновления, 2-й – удаления, а 3-й – вставки. Возможные значения для правил обновления и удаления следующие: "C" – каскадирование, "R" – запрет и "I" – игнорирование. Для правила вставки употребляются только "R" и "I". Так, если для связи заданы следующие правила контроля ссылочной целостности: при обновлении – каскадирование; при удалении – запрет, а при вставке – игнорирование, то 5-й элемент строки массива будет равен "CRI".
В момент исполнения ADBOBJECTS( ) база данных должна быть открыта, в противном случае будет сгенерировано сообщение об ошибке.
Пример:
close databases
open database 'd:\HomeLibrary\HomeLibrary'
declare arrayOfSettings(4)
arrayOfSettings(1) = "CONNECTION"
arrayOfSettings(2) = "TABLE"
arrayOfSettings(3) = "VIEW"
arrayOfSettings(4) = "RELATION"
for k = 1 to 4
if ADBObjects(arrayDBO, arrayOfSettings(k)) > 0 then
&& Печатаем значение cSetting
? arrayOfSettings(k)
display memory like arrayDBO
endif
endFor
close databases
Результат:
ARRAYDBO Priv A test
( 1 ) C "AUTHORS"
( 2 ) C "BOOKS"
( 3 ) C "BOOKSCONTENT"
( 4 ) C "BOOKSAUTHORS"
( 5 ) C "WORKTYPE"
RELATION
ARRAYDBO Priv A test
( 1, 1) C "BOOKSAUTHORS"
( 1, 2) C "BOOKS"
( 1, 3) C "BOOKID"
( 1, 4) C "BOOKID"
( 1, 5) C "CRI "
…
Функция
ADEL(ArrayName, nElementNumber [, 2])
удаляет элемент одномерного или строку или столбец двумерного массива ArrayName.
Удаление элементов не приводит к изменению формы массива. При удалении элемента или строки последние элементы соответствующим образом смещаются по направлению к началу массива. На их месте возникают элементы равные .F. При удалении столбца сдвигаются столбцы по направлению к первому столбцу; элементы последнего столбца оказываются равными .F.
Параметр:
nElementNumber – номер удаляемого элемента, если массив одномерный. Если массив двумерный, то параметр при отсутствии последнего параметра задает номер удаляемой строки, а при наличии последнего параметра – номер удаляемого столбца.
При успешном удалении функция вернет 1, при неудаче – 0.
Пример. Удаляется элемент одномерного массива: строка, а затем столбец двумерного массива.
dimension oneDArray(7), twoDArray(2, 3)
&& Инициализация массивов
store 4 to oneDArray, twoDArray
for iCol = 1 to 3
&& Изменяем 2-ю строку массива twoDArray
twoDArray(2, iCol) = 5
endFor
Adel(oneDArray, 2) && Результат: 4 4 4 4 4 4 .F.
&& Удаляем 1-ю строку
Adel(twoDArray, 1)
&& Массив twoDArray: |
5 |
5 |
5 |
&& |
.F. |
.F. |
.F. |
&& Повторная инициализация массива twoDArray
store 7 to twoDArray
&& Удаляем 2-й столбец
Adel(twoDArray, 2, 2)
&& Массив twoDArray: |
7 |
7 |
.F. |
&& |
7 |
7 |
.F. |
Функция
ADIR(ArrayName [, cFileSkeleton [, cAttribute [, nFlag]]])
помещает информацию о файлах в массив ArrayName и возвращает число файлов, описанных в массиве.
Результирующий массив имеет 5 столбцов; число строк массива равно числу описанных в нем файлов. Содержимое каждой строки раскрыто в табл. 6.3.
Таблица 6.3
