92Visual FoxPro
ББК 32.973.26-018.1
Ш24
Шапорев Д. С.
Ш24 Visual FoxPro. Уроки программирования. — СПб.: БХВ-Петербург,
2005. - 480 с: ил.
ISBN 5-94157-627-7
В виде уроков, в форме веселого диалога с читателем рассмотрены ос
новные приемы работы с СУБД Visual FoxPro — от способов запуска про
граммы и описания пользовательского интерфейса до создания собственной
компьютерной игры. Описаны разработка и особенности работы с основ
ными объектами Visual FoxPro, такими как классы, таблицы, запросы,
формы, представления и отчеты. Уделено внимание внедрению OLE-объ
ектов, использованию компонентов ActiveX и библиотек классов, а также
экспорту и импорту данных в другие приложения. Показано, как создавать
справочную систему, установочный диск приложения. Рассмотрено приме
нение методов объектно-ориентированного программирования в Visual FoxPro:
разработка экранных форм и собственной панели инструментов на основе
пользовательских классов, создание компьютерных игр и др. Книга сопро
вождается большим количеством примеров и полезных советов.
Введение 9
Для чего я написал эту книгу? 9
Немного истории, или рождение старого лиса 10
Что нового в СУБД Visual FoxPro? 11
Урок 8. Массивы 88
ЧАСТЬ И. ОБЪЕКТНО-ОРИЕНТИРОВАННОЕ
ПРОГРАММИРОВАНИЕ 343
Заключение 423
ПРИЛОЖЕНИЯ 425
Введение
Здесь мы очень кратко поговорим о том, для кого и для чего предназначена
эта книга, дадим небольшую историческую справку о возникновении и раз
витии Microsoft. Visual FoxPro, а также о различиях между современными и
устаревшими версиями данного программного продукта.
Немного истории,
или рождение старого лиса
История умалчивает о точной дате рождения FoxPro, но известно, что наш
Лис, как и положено всем нормальным лисам, развивался путем эволюции.
В 70-х годах прошлого века для управления базами данных наряду с други
ми СУБД использовался язык программирования dBase. Вот из него-то и
"вышло" в середине 80-х годов детище компании Fox Software, окрещенное
как FoxPro. "Никто не может бегать как лиса" — таким был девиз разработ
чиков, имеющих в виду скорость обработки данных.
От своего прародителя Лис отличался, как бронепоезд от дрезины (как по
скорости, так и по "комфорту" работы) — ибо он уже имел нормальный
GUI (Graphic User Interface, графический интерфейс пользователя). Но
главным все же у "ребенка" был не этот самый GUI — главным была ско
рость! Основатели компании Fox Software демонстрировали многочисленной
аудитории, как FoxPro за считанные секунды находил нужную запись в базе
данных, содержавшей несколько сотен тысяч записей! Мир вздрогнул, а
присутствовавший при этом зрелище народ ахнул от восторга, тем самым
выписав путевку в жизнь нашему приятелю Лису.
В последующие годы развитие FoxPro обеспечивала компания Microsoft,
выкупившая этот программный продукт у Fox Software. Наряду с версией
FoxPro 2.5 for DOS вышла в свет FoxPro for Windows, затем уже появилась
Введение 11
первая "визуальная" версия — Visual FoxPro 3.0, после нее Visual FoxPro 5.0,
Visual FoxPro 6.0 (именно ее мы с тобой и будем рассматривать) и наконец,
не так давно нас порадовали выходом в свет новой версии — Visual
FoxPro 8.0 (и даже поговаривают о выпуске девятой версии!).
Так в чем же отличие "визуальных" версий от более ранних? Сейчас я тебе
объясню на примере шестой версии Visual FoxPro. Почему именно шестой,
а не восьмой или пятой? Да просто потому, что абсолютно непринципиаль
но, на какой конкретной версии данного продукта проходить обучение.
Пусть это будет пятая, седьмая, даже третья версия — это не суть важно.
Важно то, что во всех версиях принципы программирования одинаковы,
используется один и тот же язык и подавляющее большинство команд,
свойств, методов и событий идентичны. Есть, конечно, различия между
третьей и восьмой версиями (более того, существенные различия), но еще
раз повторюсь — это никак не повлияет на твою последующую работу на
ниве программирования. И еще один аргумент — несмотря на выход вось
мой версии, наиболее популярной все же остается именно шестая.
Начинаем работать!
Таблицы
Таблица в FoxPro хранится в файле с расширением dbf. Представим про
стейший пример (табл. 1.1).
Record n
Каждое поле имеет свое имя, тип, размер, и в нем содержится информация
о данных какой-либо одной категории. В таблице pasport.dbf поле имя со
держит строку СИМВОЛОВ Дмитрий (ТИП Character), а поле Дата рождения —
дату 22.08.1972 (тип Date). Попытка записать в поле дата рождения строку
символов обречена на неудачу, т. к. данное поле имеет тип Date, а поля это
го типа могут содержать только дату и ничего кроме этого. Существует еще
несколько других типов полей, используемых в таблицах, в дальнейшем мы
их подробно рассмотрим.
Таблица в Visual FoxPro может быть представлена как в виде свободной таб
лицы, так и в виде таблицы базы данных.
Таблица базы данных аналогична свободной таблице, но для нее в базе дан
ных может храниться дополнительная информация, такая как:
• длинное имя;
• комментарии для полей;
• первичные индексы;
• заголовки полей;
• правила контроля при изменении или добавлении данных;
• триггеры;
• виды (представления данных).
Все это называется словарем данных таблицы базы данных.
Я уже говорил о том, что и просто свободная таблица, и таблица базы дан
ных хранится в файлах с расширением dbf (Data Base File), а вот сама база
данных — в файле с расширением dbc (Data Base Container). Подобное раз
деление началось с выходом версии Visual FoxPro 3.0, в предыдущих верси
ях все таблицы назывались базами данных и имели расширение dbf.
Базы данных могут иметь различные размеры, я имею в виду количество
записей — от простейшей, состоящей из одной таблицы с одной записью до
довольно "крутых" конструкций с десятками, а то и сотнями связанных таб
лиц, каждая из которых может содержать, допустим, до миллиона записей!
Как ты считаешь, сколько тебе понадобится времени, чтобы найти нужные
18 Часть I. Процедурное программирование в Visual FoxPro
СУБД
Если тебе где-нибудь встретится аббревиатура СУРБД, то знай, что это то
же самое — только на нормальный язык переводится как Система Управле
ния Реляционными Базами Данных. Слово "реляционные" означает, что
данные в таблицах каким-то образом связаны между собой. Visual FoxPro
также можно определить как СУРБД.
В настоящее время существует огромное количество различных систем
управления данными. Наиболее распространены такие, как Oracle, SQL
Server, Microsoft Access, Clipper и др. Все они. как и все в этом мире, имеют
свои преимущества и свои недостатки. Наш друг Лис также не идеален, но
он является достойным конкурентом в данной категории профаммного
обеспечения, т. к. изначально был задуман именно как средство управления
базами данных и ничто другое.
На этом наша короткая лекция заканчивается, и если ты еще не заснул, то
наш хитрый Лис давно уже смотрит сны — пора его будить, чем мы и зай
мемся.
УРОК 2
На заметку
Название исполняемого файла зависит от используемой версии Visual FoxPro
Например, в шестой версии он называется vfp6.exe, а в восьмой — соответст
венно vfp8.exe.
20 Часть I. Процедурное программирование в Visual FoxPro
\\ HUM
Рис. 2.4. Главное окно Visual FoxPro
Visual FoxPro сразу после его установки на свой компьютер, то после запус
ка появится экран-заставка (рис. 2.5), содержащий пять опций:
• Open the new Component Gallery to organize your Visual FoxPro com
ponents — открыть новую галерею компонентов для объединения компо
нентов Visual FoxPro;
• Discover programming solutions by exploring sample applications — посмот
реть программные решения из примеров приложений;
• Create a new application — создать новое приложение;
• Open an existing project — открыть существующий проект;
• Close this screen — закрыть этот экран.
В нижней части экрана-заставки расположен флажок Don't display this
Welcome screen again (He показывать этот экран при следующих запусках).
Большинство из программистов именно его и устанавливают. Мы поступим
таким же образом (щелкнув на нем мышью), и при следующем запуске сра
зу окажемся в главном окне Visual FoxPro, минуя экран-заставку.
Урок 2. Запуск Visual FoxPro 23
Заголовок
Заголовок, как известно, для того и существует, чтобы на нем было что-
нибудь написано. А там и написано: Microsoft Visual FoxPro. Но, в отличие
от обычных заголовков, заголовки окон Windows имеют еще и некоторые
дополнительные функции. Например, щелкни мышью по значку пикто
граммы, расположенному слева от надписи заголовка. Откроется системное
меню, позволяющее тебе манипулировать главным окном Visual FoxPro.
Приведем пункты системного меню в табл. 3.1.
Так, что там у нас еще?
Справа расположены три кнопки. Первая, с чертой внизу — Свернуть —
сворачивает главное окно до размера пиктограммы и помешает его на Па-
Урок 3. Главное окно Visual FoxPro 25
нель задач Windows. При этом Visual FoxPro не прекращает своей работы.
Вторая кнопка — Развернуть — разворачивает главное окно. И наконец,
третья кнопка Закрыть — закрывает главное окно, тем самым прекращая
работу Visual FoxPro.
Закрашенная в синий цвет часть заголовка также имеет свои функции:
О можно щелкнуть на ней мышью и, удерживая нажатой левую кнопку,
перетащить главное окно в любое место экрана;
О выполнив двойной щелчок мышью в этой области, можно развернуть
главное окно или восстановить его предыдущие размеры.
Ha 3 a м е т к у
Синий цвет, установленный по умолчанию, можно запросто изменить — за это
отвечают элементы управления из Панели управления Windows (Панель
управления | Экран).
Команда Описание
Команда Описание
Команда Описание
Команда Описание
Команда Описание
Команда Описание
Font (Шрифт) Используется для выбора шрифта и его
параметров (размер, цвет и т. д.)
30 Часть I. Процедурное программирование в Visual FoxPro
Команда Описание
Команда Описание
Fill (Заполнение, заливка) Определяет орнамент и цвет заполнения
для фигур
Реп (Перо) Определяет стиль и размер пера для рисо
вания линий и фигур
Mode (Режим) Устанавливает режим прозрачности для
заднего плана объекта
Команда Описание
Macros (Макрос) При помощи этой команды можно создать свои макросы
Class Browser Можно просматривать содержимое любого класса Visual
(Просмотр класса) FoxPro
Component Gallery Эта команда открывает соответствующее окно для рабо
(Галерея компонентов) ты с Галереей компонентов Visual FoxPro
Coverage Profiler Позволяет просмотреть информацию о выполненной про
грамме
Beauty (Украсить) Старина Лис тот еще пижон — при помощи этой команды
он переформатирует файл программы, добавляя отступы
и заменяя строчные буквы прописными. Потом попробу
ем — забавно!
Run Active Document Позволяет выбрать и запустить активный документ
(Активный документ)
Debbuger (Отладчик) Не знаю, как и перевести... Bugs — "жучки". В среде про
граммистов жучками называются ошибки в программном
коде. А вот этот убойный механизм и позволяет нам их
выловить и безжалостно уничтожить. Отладчик, одним
словом
Команда Описание
Команда Описание
Команда Описание
Microsoft Visual Fox Pro Help Topic Открывает окно справочной системы
(Темы справочной системы)
Contents (Содержание) Вкладка Содержание
Index (Указатель) Указатель
2
Зак. 1002
34 Часть I. Процедурное программирование в Visual FoxPro
Панель инструментов
Как я уже говорил, в Visual FoxPro имеется несколько панелей инструмен
тов, каждая из которых предназначена для выполнения какой-нибудь кон
кретной задачи — в зависимости от того, что именно мы делаем в данный
момент.
По желанию ты можешь ВСЕ панели инструментов разместить на рабочем
столе, но при этом будет неудобно работать, т. к. экранная площадь значи
тельно сократится. В процессе построения наших приложений мы подробно
рассмотрим весь этот инструментарий, а пока познакомимся с главной сис
темной панелью инструментов Visual FoxPro (рис. 3.1) Данная панель инст
рументов еще называется Standard (Стандартная) и практически всегда при
сутствует на экране.
Рабочий стол
Рабочий стол — это такой белый фон, который ты видишь на своем мони
торе после запуска Visual FoxPro. Дело в том, что наш Лис не может вот так
просто взять и выдать что-нибудь на рабочий стол Windows. Но при вводе
соответствующих команд это "что-нибудь" (конечно, я имею в виду сообще
ние или результат вычислений) появляется на рабочем столе Visual FoxPro.
Как? Скоро увидим!
Командное окно
Командное окно используется для ввода команд на языке программирова
ния Visual FoxPro. Его "графическое" поведение полностью аналогично дру
гим окнам Windows, т. е. его положение и размеры на экране можно менять
способами, применяемыми и для других окон. Как это сделать — описано
ранее.
Урок 3. Главное окно Visual FoxPro 37
Строка состояния
Строка состояния расположена в нижней части главного окна Visual FoxPro.
Этот элемент можно условно разделить на две части: область сообщений и
индикаторы.
Урок 3. Главное окно Visual FoxPro 39
Знакомство
с диспетчером проекта
При разработке практически любого приложения используется проект, ко
торый помогает организовать все файлы на основе их типа, а также объеди
няет все компоненты приложения для последующей их компиляции и соз
дания либо исполняемого файла с расширением ехе, либо файла приложе
ния с расширением арр. Можно еще сделать и файл динамической
библиотеки — dll. Сам файл проекта имеет расширения pjx и pjt.
Для того чтобы создать новый проект, необходимо выполнить одно из сле
дующих действий:
• в пункте системного меню File (Файл) выбрать команду New (Новый'
файл);
• нажать кнопку New (Новый) на стандартной панели инструментов.
В любом из этих случаев откроется диалоговое окно New (Новый), в кото
ром нужно указать, что именно мы хотим создать (рис. 4.1). Опция Proje
(Проект) уже установлена по умолчанию (что нам и требуется).
Нажмем кнопку New file (Новый файл). Появится диалоговое окно Сгеа
(Создать) (рис. 4.2). В поле Enter project (Введите имя проекта) нужно вве
сти имя нового проекта, также необходимо указать папку, в которой он бу
дет сохранен.
По умолчанию в поле Enter project (Введите имя проекта) уже стоит им
проекта — projl. Его, естественно, можно заменить на другое.
Итак, вводим имя своего приложения и щелкаем кнопку Сохранит
(Save) — файл создан, открывается окно Project Manager (Диспетчер проек
та) (рис. 4.3).
В верхней части этого окна расположено шесть вкладок. В табл. 4.1 поясня
ется их назначение.
Все элементы проекта показываются в виде иерархического списка. Есл
какой-нибудь элемент содержит в себе другие элементы, то слева от это
Урок 4. Знакомство с диспетчером проекта 41
Команда Описание
Команда Описание
Также в окне диспетчера проекта имеется шесть кнопок (рис. 4.7). Дейст
вия, происходящие после их нажатия, практически идентичны соответст
вующим пунктам меню Project (Проект), поэтому мы не будем подробно
останавливаться на их описании.
Первое приложение
Что такое Table Wizard (Мастер таблиц), мы рассмотрим далее, а сейчас на
жмем кнопку New Table (Новая таблица).
Как видишь, открывшееся диалоговое окно Create (рис. 5.4) почти ничем не
отличается от того окна, которое мы видели в самом начале, при создании
проекта.
По умолчанию в поле Enter table уже стоит название таблицы tabiei. При
необходимости его можно изменить на любое другое. Вводим имя, напри
мер, mytab и нажимаем кнопку Сохранить.
На экране появляется окно Table Designer (Конструктор таблиц). Там рас
положено три вкладки:
• Fields (Поля) — используется для определения полей таблицы;
П Indexes (Индексы) — для определения индексов;
П Table (Таблица) — отображает информацию о таблице.
По умолчанию открыта вкладка Fields (Поле), и теперь самое время погово
рить об именах полей и их типах.
Имя поля в свободной таблице не может состоять из более чем 10 сим
волов. В имени поля можно применять буквы, цифры и знак подчеркива
ния. Использование знаков препинания, специальных символов и пробелов
в имени поля не рекомендуется. Также имя поля не должно начинаться
с
цифры или знака подчеркивания. Пример допустимых имен: Abed,
F
i r s t _ N a m e , Fox 6.
48 Часть I. Процедурное программирование в Visual FoxPro
Рассмотрим их подробнее.
Поля типа character являются одними из наиболее распространенных типов
полей в таблицах. Они могут содержать от 1 до 254 символов — буквы, чис
ла, пробелы, знаки препинания. Поля данного типа имеют фиксированную
длину. Например, если у тебя есть поле размером в 10 символов, то оно и
будет занимать ровно 10 символов, независимо от того, что в нем записано.
Что это значит? А то, что если ты изменишь длину символьного поля в таб
лице с данными, например уменьшишь ее, то все данные в полях character
будут усечены до указанного размера.
В полях типа character можно хранить не только символьные выражения,
но и числа. Например, почтовый индекс или номер телефона. Для чего это
делать? Во-первых, если число 000458 поместить в поле типа Numeric, то
Лис уберет ведущие нули и получится 458. Во-вторых, чтобы не возникло
"соблазна" произвести с ними какие-нибудь вычисления. Ну ты сам поду
май, что хорошего получится, если мы по ошибке начнем складывать между
собой номера телефонов и делить их на почтовые индексы?
В общем, здесь рекомендация такая: если числа будут участвовать в матема
тических вычислениях — смело помещаем их в поле Numeric. Если нет —
в ы б и р а е м ТИП C h a r a c t e r .
Тип currency — поля данного типа используются для записи значений, вы
ражающих денежные суммы. Максимальное допустимое значение находится
Урок 5. Первое приложение 49
здесь sqrt (d) не что иное, как просто квадратный корень из d. Я специаль
но записал это выражение именно так, чтобы сразу познакомить тебя с
функцией FoxPro, которая возвращает значение квадратного корня.
Итак, для решения нашей задачи нам понадобятся поля типа Numeric, в ко
торых мы будем хранить значения а, ъ, с, d, xi и х2, одно символьное поле
типа character и возьмем, пожалуй, еще поле типа Date.
Начинаем определять структуру таблицы mytab.
Для этого на вкладке Fields (Поля) окна Table Designer (Конструктор таб
лиц) имеется несколько "столбцов" (рис. 5.6).
Первый столбец, Name (Имя), используется для ввода имени поля, причем
имя не должно повторяться, иначе Лис "обидится" и выдаст соответствую
щее сообщение о недопустимости ввода двух полей с одинаковым именем.
Вводим имя нашего первого поля, пусть это будет first_a. Введя хотя бы
один символ, мы уже видим, что столбец Туре (Тип) принял вид раскры
вающегося списка, из которого можно выбирать соответствующие значения,
щелкая мышью на нужной строчке. По умолчанию стоит тип character. Так
как мы будем иметь дело с числами, необходимо установить тип Numeric.
При нажатии клавиши <ТаЬ> фокус получает следующий столбец — Width
(Ширина), в котором указывается размер поля. Значения можно вводить с
клавиатуры, а можно использовать счетчик, т. к. данный элемент представ
ляет собой объект spinner (Поле ввода со счетчиком). Просто нажми
мышью на нужную кнопку счетчика справа от поля ввода и все. Счетчик
сначала будет работать довольно медленно, но затем раскрутится почти до
космических скоростей. Главное здесь — вовремя остановиться.
Урок 5. Первое приложение 51
В нашем случае нет необходимости заполнять все поля и поэтому мы, введя
единственную запись (см. рис. 5.9), закрываем это окно. Для закрытия ис
пользуем стандартные методы Windows: щелкаем на кнопку с крестиком в
правом верхнем углу окна или используем соответствующую команду меню,
щелкнув на пиктограмме в левом верхнем углу. Также для закрытия этого
окна можно воспользоваться комбинацией клавиш <Ctrl>+<W>.
Давай теперь посмотрим на диалоговое окно диспетчера проекта (Project
Manager) (рис. 5.10). Видно, что наша таблица автоматически добавлена в
проект, ее имя находится в разделе Free Tables вкладки Data. Слева от име
ни расположены два значка: перечеркнутый кружок и знак +. Если мы на
жмем на знак +, то увидим список полей нашей таблицы.
Экранная форма.
Первое знакомство
Любое серьезное приложение просто "обязано" иметь как минимум одну
экранную форму, потому что именно экранная форма является тем основ
ным средством, которое позволяет пользователю взаимодействовать с дан
ными.
Каждая экранная форма может состоять из неограниченного числа объек
тов. Любой объект экранной формы имеет свои, присущие данному классу
объектов свойства, которые мы можем редактировать. Также мы можем ука
зать объекту действия, которые он будет выполнять при наступлении опре
деленных событий.
В общем, весь процесс создания экранной формы сводится к следующему:
выбираем необходимые нам объекты, размещаем их в форме, определяем их
свойства и задаем, какие действия они будут выполнять.
Создать новую экранную форму можно различными способами: используя,
в частности, Form Wizard или Form Designer.
"Кто" такие эти загадочные Wizard, уже дважды нам встретившиеся, узнаем
дальше, а пока будем "делать" экранную форму, используя Form Designer
(Конструктор форм).
Открыть окно конструктора форм можно различными способами.
• Выполнить команду New (Новый) из меню File (Файл) и в открывшемся
диалоговом окне New (Новый) нажать кнопку New File (Новый файл),
предварительно установив опцию Form (Форма).
• Нажать кнопку New (Новый) на стандартной панели инструментов.
Дальнейшие действия, как в предыдущем способе.
А спрашивается, к чему нам лишние движения мышью? В окне диспетчера
проекта есть кнопка New (Новый), которая также позволяет создать новый
файл, который к тому же будет автоматически добавлен в проект. Нужно
только указать, какой именно файл мы хотим создать.
56 Часть I. Процедурное программирование в Visual FoxPro
Рис. 6.6. Вкладка All окна Properties Рис. 6.7. Вкладка Data окна Properties
Рис. 6.9. Вкладка Layout окна Properties Рис. 6.10. Вкладка Other окна Properties
I
Урок 6. Экранная форма. Первое знакомство 65
Зак Ю02
66 Часть I. Процедурное программирование в Visual FoxPro
Но следует отметить, что имена типа Texti, Text2 и т. д. Visual FoxPro при
сваивает в том случае, когда мы для размещения объектов в форме исполь
зуем панель Form Designer. Если же мы размещаем объекты, в частности
поля таблиц, путем их перетаскивания из окна Data Environment (Среда ок
ружения), или пользуемся услугами Form Wizard — в этом случае имя объ
екта будет совпадать с именем поля.
Теперь добавим в нашу форму объект Label (Этикетка), который будет со
держать текст, и подкорректируем размеры поля ввода Textl (рис. 6.16).
После вставки в форму объекта Label мы видим, что надпись в этом объекте
совпадает с его именем (Labeli). Нас это не устраивает и мы меняем ее, ис
пользуя свойство caption (Заголовок) в окне свойств экранной формы. Та
ким же образом мы корректируем некоторые другие свойства объектов:
• для объекта TextBox устанавливаем свойство FontBoid равным .т. (жир
ный шрифт), свойство Fontsize (размер шрифта) устанавливаем рав
ным 22 и немного изменяем его размеры;
• для объекта Label также устанавливаем жирный шрифт, размер шрифта
принимаем равным 26 и используем еше одну установку — свойство
AutoSize (Авторазмер) устанавливаем в .т. — границы объекта "подго
няются" под размер шрифта и длину заголовка, в противном случае текст
будет обрезан.
Теперь нам необходимо разместить в форме остальные объекты. Чтобы ус
корить данный процесс, мы воспользуемся кнопками Сору (Копировать) и
68 Часть I. Процедурное программирование в Visual FoxPro
Замечание
Перед именем поля стоит имя таблицы. Это так называемый псевдоним или
a l i a s . Все дело опять же в том, что любая таблица открывается в своей рабо
чей области и Visual FoxPro может обращаться к ней, используя псевдоним, ко
торый в данном случае совпадает с именем нашей таблицы.
На заметку
Для того чтобы определить значения свойств элементов управления, вовсе не
обязательно метаться мышью между макетом формы, выделяя в нем нужный |
элемент, и диалоговым окном Properties. Дело в том, что в самой верхней час
ти диалогового окна Properties имеется раскрывающийся список, в котором пе- j
речислены все объекты, входящие в макет экранной формы. Всего-то и нужно, |
что выбрать необходимый.
Для экономии времени некоторые свойства, например Fontsize и т. п., можно |
установить одинаковыми сразу для нескольких объектов. Для этого нужно про-1
сто выделить группу объектов и установить желаемое значение свойства для j
всей группы. В этом случае в окне свойств вместо имени объекта появится
надпись M u l t i S e l e c t i o n (Множественный выбор).
Урок 6. Экранная форма. Первое знакомство 71
Рис. 6.20. Мы только что разместили на экранной форме два новых элемента управления
Рис. 6.21. Изменение цвета надписи на кнопке с использованием окон Properties и Цвет
Замечание
При обращении к полю таблицы можно обойтись и без указания псевдонима
таблицы, а обращаться непосредственно к именам полей. Так как у нас форма
работает с одной таблицей (до других мы еще не дошли), то естественно, толь
ко эта таблица будет открываться при вызове формы. Но если в среде данных
экранной формы находится несколько таблиц, то такой "номер" может и не
пройти. Поэтому лучше все-таки обращаться к полям нужной таблицы, исполь
зуя псевдоним или команду Select.
Пусть тебя не смущает обилие скобок в командах Replace. Они нужны для
того, чтобы расставить "очередность" при математических вычислениях, по
тому что у Visual FoxPro имеются на этот счет свои правила, о которых мы
и поговорим далее.
Операторы
В Visual FoxPro достаточно большой выбор операторов, позволяющих ма
нипулировать данными. Можно объединять несколько операций, создавая
тем самым довольно сложные выражения, но следует помнить, что данные
внутри каждого выражения должны быть одного типа.
Опишем операторы, имеющиеся в Visual FoxPro (табл. 6.2—6.6). В таблицах
выражения представлены в порядке расстановки приоритетов, т. е. сначала
будет выполняться действие, занимающее верхнюю строчку, затем следую
щее и т. д., в порядке убывания приоритета.
Оператор Описание
Оператор Описание
Оператор Описание
Оператор Описание
+ Сложение (результатом будет дата в будущем)
- Вычитание
Оператор Описание
< Меньше чем
> Больше чем
= Равно
! = ИЛИ # ИЛИ < > Не равно
<= Меньше или равно
>= Больше или равно ___
== Точно равно (применяется для символьных выражений)
Урок 6. Экранная форма. Первое знакомство ^ 77
Оператор Описание
"Украшение" формы
Теперь, когда у нас все практически готово, осталось навести окончатель
ный "лоск" в нашей форме и можно запускать ее в "первое плавание".
Чтобы не смущать пользователя невразумительным названием Formi, из
меним СВОЙСТВО Caption ДЛЯ макета формы: Caption=Решение квадратного
уравнения.
Чтобы пользователь не мог изменять размеры формы (баловство все это!),
установим значение свойства Border style (Стиль обрамления) равным 2
Fixed Dialog (Фиксированная двойная линия).
Свойство AutoCenter (Автоматическое центрирование) установим рав
ным . т. — наша форма всегда будет располагаться в центре экрана.
Свойство ShowWindow имеет три значения: in screen (В окне Visual FoxPro),
in тор LeveiForm (В форме верхнего уровня) и As Top Level Form (Как фор
ма верхнего уровня). Значения этих свойств указывают, как будет работать
наша форма: только в главном окне, внутри другой формы или как форма
верхнего уровня. Установим значение As Top Level Form.
У элемента управления Text4 установим свойство Alignment (Выравнивание)
равным 2Center (По центру).
Теперь добавим немного "крутизны", а именно: изменим вид указателя мы
ши и установим фон для нашей формы.
Свойство Picture (Изображение) позволяет использовать какой-нибудь ри
сунок в качестве фона экранной формы. Желательно, чтобы все графиче
ские файлы, которые ты используешь в приложении, находились в одном
с ним каталоге (или подкаталоге).
При нажатии кнопки с тремя точками откроется окно Open (Открыть)
(Рис. 6.25), в котором можно выбрать необходимый графический файл.
Флажок Preview (Просмотр) позволяет предварительно просмотреть изобра-
78 Часть I. Процедурное программирование в Visual FoxPro
if this.value=0
this.backcolor = RGB(255,0,0)
return .F.
else
t h i s . b a c k c o l o r = RGB(192,192,192)
endif
Использование переменных
Буква Описание
g Public (Global)
i Local
р Private
t Parameter
Буква Описание
а Array (Массив)
с Character (Символьный)
У Currency (Денежный)
d Date (Дата)
о Object (Объект)
п Numeric (Числовой)
I L o g i c a l (Логический)
f Float (Вещественный)
t DateTime (Дата и время)
b Double (Вещественный с двойной точностью)
Для этого выделим объект поле ввода Textl и, нажав правую кнопку мыши,
выберем пункт Builder (Построитель). Откроется диалоговое окно Text Box
Builder (Построитель поля ввода) (рис. 7.1) с тремя вкладками:
• Format (Формат);
• Style (Стиль);
• Value (Значение).
данных для нашего объекта. Так как значения из нашего примера будут
принимать участие в вычислениях, установим числовой тип Numeric.
Флажки, расположенные на этой же вкладке, имеют следующее назначение:
• Enable at run time (Доступно) — устанавливает, будет ли разрешен доступ
к объекту при запуске формы. Данный флажок связан со свойством объ
екта Enabled;
• Alphabetic characters only (Только буквы) — при установке данного флаж
ка в поле можно вводить только буквы алфавита;
• Make read-only (Сделать доступным только для чтения) — при включе
нии этого флажка пользователь не сможет вводить и редактировать дан
ные. СВОЙСТВО Readonly;
• Select on entry (Выделять при вводе) — при получении фокуса (установке
курсора) содержимое этого поля будет выделяться целиком;
• Hide selection (Убрать выделение — после перехода курсора на другой
объект (потеря фокуса) выделение будет снято. Свойство HideSeiection;
• Display leading zeros (Показывать ведущие нули) — отображает ведущие
нули при выводе их в поле ввода.
В нижней части находится еще один раскрывающийся список: Input Mask
(Маска ввода или Шаблон). Он предназначен для задания шаблона ввода
данных. Справа от списка находится надпись User-defined mask (Маска, оп
ределенная пользователем). Это означает, что мы можем как выбирать зна
чения, так и вводить свои, что и сделаем — введем свой шаблон, например
999.99.
Определившись с вкладкой Format, перейдем к рассмотрению следующей —
Style (Стиль), используя которую можно изменять стиль отображения объ
екта (рис. 7.2).
Переключатель Special effect (Специальный эффект) содержит две опции:
3D (Трехмерный) и Plain (Плоский). При включенном 3D объект отобража
ется с эффектом объемности. Это свойство speciaiEffeet.
Переключатель Border (Обрамление) позволяет задать стиль обрамления
объекта: Single (Одинарный) устанавливает стиль обрамления в виде оди
нарной линии, a None (Нет) показывает объект без обрамления.
Раскрывающийся список Character alignment (Выравнивание) позволяет оп
ределить, каким образом будет происходить выравнивание данных в объек
те. Это СВОЙСТВО Alignment.
Флажок Size text box to fit "подгоняет" размер объекта под длину "содержи
мого".
Вкладка Value (Значение) предназначена для связывания объекта поле ввода
с полем таблицы. В раскрывающемся списке Field name (Имя поля) можно
86 Часть I. Процедурное программирование в Visual FoxPro
Рис. 7.2. Диалоговое окно построителя элемента управления TextBox. Вкладка Style
Рис. 7.3. Диалоговое окно построителя элемента управления TextBox. Вкладка Value
Теперь осталось изменить программный код для события click кнопки Рас
чет (листинг 7.1).
* проверяем значение d
DO CASE && начало проверки
CASE lnd>0 && если d больше нуля, выполняем команды:
lcresult="ypaBHeHne имеет два корня"
* вычисляем первый корень, присваивая значение переменной lnxl
lnxl=(-lnvarb+sqrt(lnd))/(2*lnvara)
* то же самое для второго корня:
1пх2=(-lnvarb-sqrt(lnd))/(2*lnvara)
CASE lnd<0
lcresult = "Уравнение не имеет решения"
*заканчиваем проверку условий:
ENDCASE
*присваиваем значения переменных объектам:
THIS FORM.ТХТХ1.VALUE =lnxl
THISFORM.TXTX2.VALUE = lnx2
THISF0RM.TEXT4.VALUE = lcresult
обновляем информацию в форме:
THISFORM.REFRESH{)
Массивы
myar(l)=thisform.textl.value && a
myar(2) -thisform.text2.value && b
myar(3) -thisform.text3.value && с
* вычисляем дискриминант d
* для этого заменяем значение элемента массива на математическое выражение:
myar(4)=myar(2)**2 - (4*myar (l) *myar (3))
* проверяем значение d
DO CASE & начало проверки
CASE myar(4)>0 && если d больше нуля, выполняем команды:
myar(5)="уравнение имеет два корня"
* вычисляем первый корень, присваивая значение переменной lnxl
myar(6)=(-myar(2)+sqrt(myar(4)))/(2*myar(1))
myar(7)=(-myar(2)- sqrt(myar(4)))/(2*myar(1))
CASE myar(4)<0
myar(5) = "уравнение не имеет решения"
* заканчиваем проверку условий:
ENDCASE
* присваиваем значения переменных объектам:
THISFORM.TXTX1.VALUE =myar(6)
THISFORM.TXTX2.VALUE = myar(7)
THISFORM.TEXT4. VALUE = myar(5)
* обновляем информацию в форме:
THISFORM.REFRESH()
Добавление записей
в таблицу
Существует несколько способов, позволяющих добавлять новые записи в
таблицу. Наиболее распространенным среди неопытных пользователей
является использование команды BROWSE (Просмотр).
Вообще BROWSE используется для просмотра и редактирования данных в таб
лицах, но при определенной сноровке можно и научиться добавлять новые
записи.
Рассмотрим этот метод.
Добавим в нашу форму еще одну командную кнопку, при нажатии которой
в таблицу будет добавляться запись. Установим свойство caption рав
ным новая запись, а в обработку события click пропишем команду BROWSE
(рис. 9.1).
Запустив форму и щелкнув на нашей новой кнопке, мы увидим результат
работы команды BROWSE (рис. 9.2).
Так как мы используем команду BROWSE без ключевых слов, "в чистом ви
де" — открываются все поля таблицы. Это уже нехорошо, потому что поль-
зователю совершенно незачем вводить значения в поля xl, x2, d и Result,
т. к. эти поля являются вычисляемыми и значения в них заносятся про
граммно. Пользователю даже знать о них не нужно! Желательно всегда ог
раничивать доступ пользователя к тем полям таблиц, которые используются
приложением, так сказать, для "внутреннего потребления". Речь идет о вы
числяемых полях, полях, содержащих индексные выражения и уж тем бо
лее, содержащих значения первичных ключей для связанных таблиц! Пожа-
луйста, отнесись к этому внимательно — немалое количество программных
сбоев происходит именно по вине неосторожных пользователей (что ни
в коей мере не умаляет вину программиста, допустившего пользователя к
этим данным).
Урок 9. Добавление записей в таблицу 91
VALID — это и есть проверка. Режим просмотра не будет закрыт, пока поль
зователь не введет корректное значение для поля.
Команду BROWSE необходимо использовать при отладке программ, значение
этого средства трудно переоценить, но вот для ввода записей она не оченН
удобна, хотя можно и ее успешно применять для этой цели.
Урок 9. Добавление записей в таблицу 93
Казалось бы — вот оно, идеальное решение! Однако и здесь есть свои "под
водные камни". Представь такую ситуацию: пользователь нажал кнопку Но
вая запись, а затем передумал вводить значения и закрыл форму. Но запись-
то добавилась!
Хорошо, что современные винчестеры позволяют хранить огромное количе
ство информации, а вот лет 15 назад руководитель проекта просто застрелил
бы программиста, допустившего такое "использование" дискового простран-
ства. Да дело, собственно, и не в этом. Как ты думаешь, пользователь будет
нервничать, увидев пятьсот пустых строк? То-то и оно...
Выход из этой ситуации есть — можно использовать переменные памяти
Для их создания применяется следующая команда:
SCATTER MEMVAR BLANK MEMO
В новой форме расположим три поля ввода и укажем для них в качестве
источника данных переменные, созданные командой SCATTER. При исполь
зовании данной команды имена переменных будут совпадать с соответст
вующими именами полей таблицы и, чтобы их не путать, перед именем пе
ременной ставится префикс т.
Разместим в форме две командные кнопки: Сохранить и Отмена, введем
следующие команды обработки события Click:
О для кнопки Сохранить:
SELECT mytab
APPEND BLANK
GATHER MEMVAR
WAIT WINDOW "Запись добавлена"
THISFORM.RELEASE
Замечание
Форма ADDREC выполняется внутри формы верхнего уровня FORMI (свойство,
ShowWindow=l).
Перемещение
по записям таблицы
Для перехода от записи к записи в Visual FoxPro используется несколько
команд, некоторые из которых мы рассмотрим.
О Команда SKIP П применяется для перехода на следующую запись, где п —
необязательный параметр, указывающий, на какое число записей пере
местить указатель. По умолчанию это число равно 1 и для перехода на
следующую запись достаточно просто задать команду SKIP.
О Команда SKIP -l аналогична SKIP, ТОЛЬКО перемещение происходит
"в другую сторону" — на предыдущую запись.
О Команда GO BOTTOM устанавливает указатель на самую последнюю запись
в таблице, а похожая на нее GO TOP — на самую первую.
О Команда GO ИЛИ GOTO осуществляет переход на запись с указанным номе
ром. Например, GOTO 23 установит указатель на двадцать третью запись
таблицы.
Используя эти команды, можно организовать переход по записям таблицы в
нашем приложении, добавив соответствующие элементы управления и за
программировав их действия.
Использование построителя
Для объекта CommandGroup
Мы уже познакомились с таким объектом, как простая командная кнопка,
и теперь пришло время научиться работать еще с одной интересной шту
кой —- группой командных КНОПОК CommandGroup.
Откроем в окне конструктора форм нашу форму Formi. Выбрав на панели
гогщ Controls кнопку Command Group, разместим объект CommandGroup в
Форме. Для данного объекта также имеется свой построитель, и мы можем
вызвать его, используя команду Build контекстного меню (рис. 10.1).
4 з
а к Ю02
98 Часть I. Процедурное программирование в Visual FoxPro
Возможно, что после завершения работы построителя вид объекта будет еще
далек от желаемого. В этом случае следует произвести необходимые изме-
нения "вручную". Выделим объект commandGroup. Так как данный элемент
управления представляет собой контейнер, то при его выделении будут дос-
тупны только его "контейнерные" свойства. А как забраться "во внутрь"?
Нужно вызвать контекстное меню, нажав правую кнопку мыши, и выбрать
команду Edit (Редактирование). Теперь у нас есть доступ к любому объекту,
и мы можем изменять свойства любого элемента, входящего в состав этого
контейнера. Устанавливаем обработку события Click для кнопок следую-
щим образом:
О кнопка Первая запись:
GO TOP
THISFORM.REFRESH
П кнопка Следующая.
IF ! ВОТ ()
SKIP
THISFORM.REFRESH
ENDIF
• кнопка Предыдущая:
I F ! EOF ()
SKIP -1
THISFORM.REFRESH
ENDIF
Ну, с первой и последней записями ясно, а вот для чего нужна проверка
для перехода на следующую и предыдущую записи? И что это за EOF()
такая?
EOFо — это функция (End of File), которая проверяет, не стоит ли уже
указатель на последней записи, т. е. в конце файла. Если да, то данная
функция вернет значение .т. (Логическая истина).
Аналогично действует и функция вот о (Begin Of File), единственное от-
личие которой заключается в том, что здесь речь идет о первой записи.
Если исключить указанные ранее проверки и попытаться выполнить,
к примеру, команду SKIP, когда указатель уже стоит на последней записи
бдительный Лис немедленно отреагирует сообщением об ошибке (рис. 10.5).
Урок 10. Перемещение по записям таблицы 101
SCAN && н а ч а л о с к а н и р о в а н и я
REPLACE m y t a b . d WITH m y t a b . s e c o n d _ b A 2 - ( 4 * m y t a b . f i r s t _ a * m y t a b . t h i r d _ c )
DO CASE && н а ч а л о п р о в е р к и
CASE d>0 && е с л и d больше н у л я , выполняем команды:
REPLACE m y t a b . r e s u l t WITH " у р а в н е н и е и м е е т д в а к о р н я "
* вычисляем первый корень при помощи команды r e p l a c e , заменяя
значение в поле xl
Replace m y t a b . x l w i t h (-mytab.second_b + s q r t ( m y t a b . d ) ) / ( 2 * f i r s t _ a )
* то же самое для второго корня:
REPLACE mytab.x2 WITH (-mytab.second_b - s q r t ( m y t a b . d ) ) / ( 2 * f i r s t _ a )
CASE d=0 && а если d равен нулю, то:
REPLACE m y t a b . x l WITH ( m y t a b . s e c o n d _ b ) / ( 2 * f i r s t _ a )
REPLACE m y t a b . r e s u l t WITH "уравнение имеет один корень"
Case d<0
REPLA m y t a b . x l WITH 0,mytab.x2 WITH 0 , m y t a b . r e s u l t WITH "уравнение н е ;
имеет решения"
заканчиваем проверку условий:
ENDCASE
ENDSCAN &&конец сканирования - обработаны все записи
Цикл SCAN. . .ENDSCAN используется для обработки всего файла таблицы. При
э
том происходит сканирование таблицы, и указатель записи перемещается
п
° записям "сверху вниз", для каждой выполняя команды, находящиеся ме-
102 Часть I. Процедурное программирование в Visual FoxPro
Удаление записей
Довольно часто возникает ситуация, когда пользователю необходимо уда
лить из таблицы какие-нибудь записи. Это можно делать как программно-
так и в интерактивном режиме, используя уже знакомую команду BROWSE
Урок 10. Перемещение по записям таблицы 103
Откроем нашу таблицу для просмотра (рис. 10.6). Крайний левый столбец
называется Delete Mark (Маркер удаления). При щелчке мышью в этом
столбце он закрашивается, что говорит о том, что данная запись помечена
для удаления. Таким образом, пометив необходимые записи, пользователь
может удалить их, используя команду Remove Deleted Records (Удалить
помеченные записи) из пункта Table (Таблица) системного меню Visual
FoxPro.
На втором шаге работы (рис. 10.10) мастер просит выбрать стиль для буду-1
щей формы. Доступные стили отображены в списке Style (Стиль). Выбрав!
Урок 10. Перемещение по записям таблицы 107
При установке флажка Add pages for fields that do not fit будут созданы до
полнительные вкладки для полей, которые не поместились в форму.
Кнопка Preview (Просмотр) используется для предварительного просмотра
результатов работы мастера. Посмотрим — рис. 10.13.
И вот что мы имеем в результате: поля ввода и группу кнопок, позволяю
щих перемещаться по записям, добавлять или удалять записи, осуществлять
поиск и закрывать форму. Большая кнопка Return to Wizard (Вернуться к
Мастеру) позволяет закрыть режим просмотра и вернуться к последнему
этапу работы мастера. Ясно, что ни о каком решении уравнения здесь не
может быть и речи, но мы можем сохранить эту форму и изменить дейст
вия, происходящие при нажатии кнопок в окне Конструктора форм. Есте
ственно, там же можно добавить или удалить необходимые элементы управ
ления, да и вообще отредактировать всю форму по своему вкусу.
Создание отчетов
Отобразить или, наоборот, убрать эти панели с экрана можно, поставив со
ответствующие флажки в меню View (Вид), или воспользовавшись еще од
ной панелью инструментов, которая называется Report Designer (Конструк
тор отчета) (рис. 11.3).
Полоса Описание
Итак, приступим. Для отчета, как и для экранной формы, необходимо оп
ределить среду данных. Для этого можно воспользоваться пунктом контек
стного меню, вызываемого нажатием правой кнопки мыши, или воспользо
ваться командой Data Environment (Среда данных) из пункта View (Вид)
системного меню. Откроется уже знакомое диалоговое окно Data Environ
ment. Все действия по добавлению в среду окружения отчета таблиц или
видов полностью аналогичны тем, которые мы выполняли для создания
среды данных для экранной формы.
Размещение в отчете
элементов управления
Начнем с размещения простого текста. Для этого на панели инструментов
Report Controls (Элементы управления отчетом) выберем кнопку Label
Урок 11. Создание отчетов 115
Теперь мы можем изменить размер шрифта, сам шрифт и цвет объекта. Для
этого выберем его, щелкнув мышью, и воспользуемся пунктом Font
(Шрифт) из меню Format (Формат) — рис. 11.5.
Но здесь нужно учесть следующее обстоятельство: не рекомендуется ставить
экзотические" шрифты — на машине пользователя их может не оказаться,
и в результате вместо красивого отчета может получиться набор непонятных
закорючек". Лучше ограничиться стандартным "джентльменским" набором
Шрифтов — Times New Roman, Courier, Arial — они установлены практиче
ски у всех.
А вот при двойном щелчке на тексте открывается диалоговое окно Text
(Текст) — рис. 11.6.
116 Часть I. Процедурное программирование в Visual FoxPro
Формат данных
Диалоговое окно Format (Формат) (рис. 11.9) вызывается нажатием кноп
ки, расположенной справа от поля ввода Format окна Report Expression
(см. рис. 11.7).
Формат отображения поля при печати можно и не задавать, воспользовав-
шись установками по умолчанию, но при работе с этим диалоговым окном
можно, например, перевести все строчные символы в прописные, показати
Урок 11. Создание отчетов 119
Флажок Описание
Флажок Описание
Left justify (Сдвиг влево) Информация в поле будет выровнена по левой гра
нице поля
120 Часть I. Процедурное программирование в Visual FoxPro
Флажок Описание
Флажок Описание
Замечание
Любое поле можно редактировать с помощью диалогового окна Report Expres
sion, дважды щелкнув мышью на этом поле.
Параметр Атрибут
Параметр Атрибут
Опция Описание
Nothing (Ничего) Никакие вычисления не производятся
Count (Количество) Вычисляется количество обращений Visual FoxPro
к данному объекту при формировании отчета 1
Урок 11. Создание отчетов 125
Опция Описание
Просмотр отчета
Для просмотра отчета используется команда Preview (Просмотр) из контек-
стного меню или одноименная кнопка на стандартной панели инструмен-
Урок 11. Создание отчетов 127
Печать отчетов
Ты, наверное, уже привык к тому, что для выполнения какой-либо опера
ции Visual FoxPro предоставляет в наше распоряжение минимум три раз-
личных способа. Вывод отчетов на печать не является исключением.
• Команда Print (Печать) из системного меню File (Файл).
П Команда Print (Печать) из контекстного меню.
• Команда Run Report (Запуск отчета) из меню Report (Отчет).
• Кнопка Print One Copy (Печать одной копии) на стандартной панели
инструментов.
• Комбинация клавиш <Ctrl>+<P>.
Результатом выполнения любой из этих операций является окно Print (Пе-
чать).
Расположенный в верхней части диалогового окна раскрывающийся список
Name (Имя) содержит имена всех доступных принтеров.
Установка переключателя в области Print range (Область печати) в положе
ние All (Все) приведет к тому, что будут распечатаны все страницы отчета, Я
вот выбор Pages (Страницы) позволяет задать номера печатаемых страниц'-
from (от), to (до).
Используя счетчик Number of copies (Количество копий), можно задать ко-
личество печатаемых экземпляров.
При нажатии кнопки Properties (Свойства) можно настроить параметры
принтера, вид появляющегося при этом диалогового окна зависит от прин-
тера, установленного в системе (рис. 11.20).
Урок 11. Создание отчетов 129
Зак Ю02
130 Часть I. Процедурное программирование в Visual FoxPro
Создание отчетов
с использованием мастера Report Wizard
Для запуска Report Wizard (Мастер отчетов) также имеется несколько спо
собов — все они аналогичны тем, которые мы использовали при запуске
Form Wizard (Мастер экранных форм).
Независимо от способа запуска на экране появится первое диалоговое окно
мастера (рис. 11.23).
На втором шаге работы мастера (рис. 11.25) можно задать поля, по которым
будет производиться группировка данных в отчете. Поддерживается от од-]
ной до трех групп данных. Параметры группировки задаются так: в раскры
вающемся списке указываем имя поля, а затем, нажимая кнопку Grouping]
options (Параметры группировки), задаем интервал группировки в диалого
вом окне Grouping Intervals (рис. 11.26).
В раскрывающемся списке Grouping intervals (Интервал группировки) мож
но выбрать следующие значения:
О Entire Field — полностью значение поля;
О 1st Letter — по первой букве;
• 2, 3, 4, 5 Initial Letters — по первым двум, трем и т. д. буквам.
Кнопка Summary Options (Итоговые значения) вызывает диалоговое окно
Summary Options, в котором можно сформировать итоговые значения ДЛЯ
каждого поля (рис, 11.27).
Урок 11. Создание отчетов 133
Компиляция проекта
Рис. 12.1. С помощью команды контекстного меню устанавливаем главный файл приложения
Замечание
При создании нашей экранной формы мы определили ее как форму верхнего
уровня, поэтому для того чтобы она выполнялась не в окне FoxPro, а прямо на
рабочем столе Windows, можно перед началом компиляции включить в свойст
во i n i t следующую команду:
SCREEN.VISIBLE=.F.
142 Часть I. Процедурное программирование в Visual FoxPro
Что такое база данных? В начале книги было дано определение базы дан
ных, так сказать, с "обывательской" точки зрения. А вообще под базой дан
ных в Visual FoxPro подразумевается совокупность таблиц, которые могут
каким-то образом быть связанными между собой. А могут быть и не свя
занными. А можно вообще обойтись без использования баз данных, успеш
но применяя для решения поставленных задач свободные таблицы.
Так для чего тогда усложнять себе жизнь? Все дело в том, что использова
ние баз данных не усложняет, а, наоборот, значительно упрощает работу с
данными. Это происходит потому, что именно в базе данных реализованы
мощные и полезные функции, используемые при работе с таблицами.
Создать новую базу данных можно так же, как и любой другой файл Visual
FoxPro. Мы уже подробно рассматривали процесс создания новых файлов,
повторяться не будем. Действия полностью аналогичны, за исключением
того, что в открывающихся диалоговых окнах необходимо указать опцию
Database (База данных). При использовании командного окна применяется
следующая команда:
CREATE DATABASE <имя_файла>
Рис. 13.1. Окно конструктора базы данных с панелью инструментов Database Designer
Поле Field comment (Комментарий для поля) используется для ввода ком
ментария для данного поля. Длина комментария может быть произвольной,
т. к. этот элемент представлен в виде поля Memo.
Индексы
Индексы используются для сортировки записей и организации связей меж
ду таблицами, а также для ускорения доступа к данным. Индексы в Visual
FoxPro хранятся в файлах, имеющих расширение cdx — это так называемые
составные индексные файлы. В ранних версиях использовалось расширение
idx, или простой индексный файл, который мог содержать только одно ин
дексное выражение.
Урок 13. Работа с базой данных 147
Простые индексы
Простые индексы, состоящие из одного индексного выражения, использо
вались в FoxBase — предшественнике Visual FoxPro. В те древние времена
для каждого индексного выражения использовался отдельный индексный
файл. Вот и приходилось почти всегда при открытии таблиц специально
открывать вместе с таблицей и все ее индексы. Для чего это делалось? Все
просто — если не открыть необходимый индексный файл, Лис не сможет
его модифицировать при добавлении или удалении записей из таблицы —
он просто его не "увидит", ведь не могут все индексные файлы иметь имена,
совпадающие с именем таблицы!
В настоящее время уже как бы принято за правило использовать составные
или структурные индексы.
Составные индексы
Никто не запрещает использовать в приложениях простые индексы с рас
ширением idx, но применение составных индексов кажется более предпоч
тительным и вот почему:
• в один индексный файл можно включить несколько индексных выраже
ний;
• если индексному файлу присвоить имя таблицы, то он всегда будет от
крываться вместе с таблицей — потерять такой файл невозможно;
• структурный индекс всегда автоматически привязывается к "своей" таб
лице.
Из чего состоит индексный файл? Файлы данного типа могут содержать
один или несколько тегов. Тег (Tag) — это и есть индексное выражение.
Чтобы узнать, какие именно теги используются в индексе, можно восполь
зоваться функцией TAG о, которая возвращает имя тега. А вот сколько этих
самых тегов — подскажет функция TAGCOUNT (). Узнать имя самого индекс
ного файла можно, применив функцию CDX () или аналогичную ей MDX ().
В Visual FoxPro имеется четыре типа индексов:
О Primary (Первичный). В таблице может быть только один первичный ин
декс (иногда его называют первичным ключом), который позволяет вво
дить только уникальные значения данного поля;
О Candidat (Кандидат или потенциальный). Также позволяет вводить толь
ко уникальные значения поля, но в отличие от индекса Primary таблица
может иметь несколько индексов такого типа;
О Regular (Регулярный или простой). Данный индекс может быть создан
для любого значения поля;
148 Часть I. Процедурное программирование в Visual FoxPro
• таблица Cities.dbf:
TAG: idcountry Regular INDEX ON: Idcountry
TAG: ccities Regular INDEX ON: ccities
TAG: idcity Candidate INDEX ON: idcity
Урок 13. Работа с базой данных 149
0 таблица Streets.dbf:
TAG : i d c i t y Regular INDEX ON : i d c i t y
TAG: s t r e e t Regular INDEX ON: s t r e e t
В данном окне есть три вкладки: Rules for Updating (Правила при обновле**
нии), Rules for Deleting (Правила при удалении) и Rules for Inserting (Пра-y
вила при вставке).
Внизу расположена таблица, в которой перечислены все отношения. В пер^
вом столбце этой таблицы указано имя родительской таблицы, а во вто*|
ром — дочерней. В трех следующих столбцах указаны правила соблюдение
1
ссылочной целостности для каждого конкретного случая: Update (Обновле*]
ние), Delete (Удаление), Insert (Вставка). В двух последних столбцах указа^
ны теги.
По умолчанию в трех столбцах (Update, Delete, Insert) установлено значенЖ
Ignore (Игнорировать) и никакая ссылочная целостность, естественно, пок
не соблюдается.
При щелчке мышью в любом из этих столбцов появляется меню, содержу
шее допустимые варианты поведения.
Урок 13. Работа с базой данных 153
Идентификаторы
Практически любая таблица имеет поле, специально выделенное для хране
ния значения, которое однозначно идентифицирует каждую запись. Вот это
и есть идентификатор, он же "первичный ключ" (primary key). Например,
в нашей таблице countries значение в поле idcountry соответствует назва
нию страны. Значения в этом поле должны быть уникальными, неповто
ряющимися — не может быть двух стран с одинаковым названием. В даль
нейшем мы рассмотрим вопрос, каким образом можно реализовать автома
тическую генерацию значений ключа при добавлении записей в таблицу, а
теперь поговорим вот о чем: значение идентификатора нежелательно ника
ким образом связывать со значениями других полей. Что это значит? На
пример, не нужно в качестве идентификатора фирмы использовать ее на
звание: во-первых, оно может со временем измениться, а во-вторых, может
быть несколько компаний с одинаковыми названиями. Также нежелательно
в качестве идентификатора человека использовать номер его паспорта — та
же причина (человек существо беспокойное, он с легкостью может сменить
паспорт, герб, флаг и даже пол...).
В общем, идентификатор должен быть абсолютно абстрактной величиной,,
не подверженной никаким внешним воздействиям. Займись на досуге буд
дизмом!
Теперь перед нами встает следующий вопрос: какого типа должны быть
идентификаторы: символьного или числового?
Рассмотрим и те и другие.
Преимущества числовых идентификаторов:
• всегда точное сравнение, не зависящее от длины поля;
• для получения нового значения идентификатора достаточно произвести
одну-единственную математическую операцию — "сложение", и не нуж
но "выдумывать" никаких специальных функций.
Их недостатки:
• можно по неосторожности включить их в какие-то вычисления.
Преимущества символьных идентификаторов:
П они никогда не могут быть использованы в математических вычисле-!
ниях;
• использование в идентификаторе сочетания цифровых и алфавитных
символов значительно повышает его "емкость".
Их недостатки:
• для генерации нового значения необходимо использовать специальные
функции, здесь не удастся обойтись "простыми" математическими опера
циями;
/
Урок 13. Работа с базой данных 155
SELECT Countries
APPEND BLANK
REPLA Idcountry WITH my__last_id . Last_id+1
SELECT My_Last_Id
REPLA Last_Id WITH countries . Idcountry
SELECT Countries
Да, вопросов может возникнуть множество. Поэтому вот тебе, дружок, поч
ти универсальный рецепт на все случаи жизни.
Создаем дополнительную таблицу Lastid.dbf со следующей структурой —
табл. 13.5.
FUNCTION M y l a s t i d
PARAMETER a l i a s
IF TYPE ("Myalias")#"C".OR.EMPTY("Myalias")
Myalias=ALIAS()
ENDIF
SELECT Lastid
LOCATE FOR Lastid.Alias=Myalias
IF FOUND()=.T.
REPLACE Lastid.Lastid WITH Lastid.Lastid+1
ELSE
APPEND BLANK
REPLA Lastid.Alias WITH Myalias,Lastid.Lastid WITH 1
ENDIF
SELECT SMyalias
RETURN Lastid.Lastid
Вот и все! Теперь у нас есть всего одна таблица, которая хранит значения
идентификаторов для любого количества таблиц. Более того, данную функ
цию мы запишем как хранимую процедуру, входящую в состав нашей базы
Данных.
Хранимые процедуры
Хранимая процедура — это программа или функция, которая определяется
Пользователем, т. е. тобой, и хранится в контейнере базы данных.
Создать хранимую процедуру можно так: выбрать в окне диспетчера проекта
баз
У данных, перейти в группу Stored Procedures (Хранимые процедуры)
158 Часть I. Процедурное программирование в Visual FoxPro
(рис. 13.8) и нажать кнопку New (Новая). После этого откроется окно ре
дактирования хранимых процедур, в котором могут содержаться как про
цедуры, созданные тобой ранее, так и автоматически сгенерированные Vis
ual FoxPro. (Лис автоматически создает процедуры и функции при опреде
лении условий ссылочной целостности базы данных.)
Совет
Никогда не изменяй те функции, которые получены путем автоматической гене
рации при определении условий ссылочной целостности — к чему могут при
вести эти изменения, одному Лису известно...
Теперь для таблиц, входящих в состав базы данных, нужно определить триг
геры (правила).
Триггеры
Триггер INSERT определяет действия, которые будут выполняться после до
бавления в таблицу новой записи.
Триггер UPDATE — то же самое, только после изменения записи.
Триггер DELETE определяет действия, которые будут выполняться после уда
ления записи из таблицы.
На вкладке Table окна Table Designer имеется группа Triggers (Триггеры),
в которой расположены три поля ввода: Insert Trigger, Update Trigger, Delete
Trigger. Вот в эти-то поля и заносится вызов хранимой процедуры, логиче
ское выражение или операторы сравнения — в общем, любое допустимое
выражение. И если результатом вычисления данного выражение будет .Т.
(True) —- все в порядке! В противном случае нашего уважаемого пользовате
ля ждет сообщение об ошибке.
Вызов триггеров происходит в следующих случаях:
• триггер UPDATE — при любом изменении значения поля, а также при вы
полнении команд REPLACE, REPLACE FROM ARRAY, UPDATE-SQL, GATHER;
• триггер DELETE — при установке на записи метки на удаление в режиме
просмотра или/и при выполнении команды DELETE;
• триггер INSRET — при вводе новой записи в режимах BROWSE ИЛИ EDIT, a
также при выполнении команд APPEND FROM, APPEND FROM ARRAY, APPEND
BLANK, IMPORT, RECALL, INSERT-SQL И П р и СНЯТИИ ОТМеТКИ об у д а л е н и и
записи в режиме просмотра.
Но при использовании триггеров имеются и ограничения: если ты пометил
запись для удаления, а потом вдруг начал ее же модифицировать — тригге
ры вызываться не будут.
Убрать" триггер из таблицы проще простого — нужно очистить соответст
вующее поле ввода или использовать команду DELETE TRIGGER.
Как все это претворить в жизнь? Сначала о хранимой процедуре (рис. 13.10):
открой окно конструктора таблиц (Table Designer) с таблицей countries и
в поле Default value (Значение по умолчанию) введи следующее выражение:
m y l a s t i d ("countries")
160 Часть I. Процедурное программирование в Visual FoxPro
Поля Описание
Idcountry (i4) Идентификатор страны
Idcity (i4) Название города
Ccountry (c30) Название страны
Ccity (c30) Название города
CFirstname (c30) Имя
CSecondname (c30) Фамилия
CLastname (c30) Отчество
DBirthday (d8) Дата рождения
CStreet (c30) Улица
CHome (c5) Дом
CRoom (c5) Квартира
GPhoto (g) Фотография
Csex (clO) Пол
Darrdate (d8) Дата приезда
Ddepdate (d8) Дата отъезда
Idroom (i4) Номер в отеле
MDescr (Memo) Дополнительные сведения
Поля Описание
Idcountry (i4) Идентификатор страны
Ccountry (сЗО) Название страны
6
Зак Ю02
162 Часть I. Процедурное программирование в Visual FoxPro
Поля Описание
Ccity (сЗО) Название города
Idcity (i4) Идентификатор города
CFirstname (сЗО) Имя
CSecondname (сЗО) Фамилия
С Lastname (сЗО) Отчество
DBirthday (d8) Дата рождения
CStreet (сЗО) Улица
CHome (c5) Дом
CRoom (c5) Квартира
GPhoto (g) Фотография
Csex (clO) Пол
Darrdate (d8) Дата приезда
Ddepdate (d8) Дата отъезда
Ndays Время проживания
Ncost Стоимость проживания
Idroom (i4) Номер в отеле
MDescr (Memo) Дополнительные сведения
Поля Описание
Idroom (Integer) Номер (идентификатор гостиничного номера)
Idfloor (Integer) Идентификатор этажа
Nprice (Numeric) Стоимость проживания в сутки
Nplaces (Numeric) Количество мест в номере
Ltv (Logical) Наличие телевизора
Lphone (Logical) Наличие телефона
Поля Описание
Idfloor (Integer) Идентификатор этажа
Cfloor (Character) Описание этажа (первый, второй и т. д.)
Поля Описание
Icounter (i4) Счетчик
DToday (d8) Дата
Замечание
В таблице todayrecords должна быть одна пустая запись.
/
УРОК 1 4
Экранная форма.
Продолжение знакомства
На данном уроке мы продолжим знакомство с элементами управления
экранных форм, рассмотрим их назначение и свойства, научимся работать
с различными построителями элементов управления.
Объект ListBox
List в переводе с английского список. Источником данных для этого эле
мента управления могут быть значения полей, элементы массивов, пункты
меню, список значений и т. д. Всем этим хозяйством управляет свойство
RowSourceType (Тип источника данных), возможные значения которого при
ведены в табл. 14.1.
Пример использования
Создадим новую форму, в которой расположим объект ListBox, воспользо
вавшись для этого панелью Form Controls (рис. 14.1).
Рис. 14.2. Вкладка List Items окна построителя List Box Builder
Урок 14. Экранная форма. Продолжение знакомства 169
В поле ввода Array Name указывается имя массива. Если массив использует
ся не весь — ставим переключатель в положение Range of the array и указы
ваем диапазон значений.
Вернемся к нашему случаю. После задания необходимых параметров на
вкладке List Items перейдем к следующей вкладке — Style (Стиль) (рис. 14.4).
Здесь мы видим две группы переключателей:
• Three-dimensional (Трехмерный) — позволяет придать объекту эффект
объемности;
• Plain (Плоский) — объект отображается плоским;
170 Часть I. Процедурное программирование в Visual FoxPro
Расположенный на данной вкладке флажок Adjust the width of the list box to
display all columns автоматически увеличивает ширину списка для отображе
ния всех колонок.
Ширину каждой колонки можно изменить вручную, установив мышь на
границу между ними и "растянув" колонку до необходимого размера.
И, наконец, последняя вкладка нашего построителя — Value (Значение)
(рис. 14.6).
Эта вкладка используется для того, чтобы задать источник данных. В окне
Properties (Свойства) за это отвечает свойство controisource.
Закончив "строительство", нажмем ОК и вернемся к Конструктору форм.
Выделим наше поле ввода Texti, а в окне свойств дважды щелкнем на ме
тоде Keypress (Нажатие клавиши), после чего в открывшемся окне редакти
рования процедур напишем следующий код — рис. 14.7.
nKeycode — это параметр, передаваемый методу Keypress (Нажатие клави
ши). Если нажата клавиша <Enter> (13 — это ее код), выполняется провер
ка, не является ли значение данного поля ввода пустой строкой — функция
EMPTY о возвращает истину, если в данном поле нет данных. Если условие
верно, в таблицу добавляется новая пустая строка и заполняется значения
ми поля ввода формы. Затем поле ввода снова очищается. Таким образом,
Мы можем заполнять наш справочник, вводя название стран в соответст
вующее поле ввода и нажимая клавишу <Enter>.
По умолчанию в объекте ListBox отображается восемь значений, а если их
будет больше — в нем появится линейка прокрутки.
172 Часть I. Процедурное программирование в Visual FoxPro
Видишь, нам даже не пришлось изменять код для события Keypress для по
ля ввода новых значений. Это наглядно демонстрирует сходство между
ComboBox И ListBox.
Теперь рассмотрим тот случай, когда в качестве источника данных выступа
ет не таблица, а список значений. Уберем таблицу из среды данных (Data
Environment) нашей формы. Свойство RowSourseType определим равным i
(Value, Значение). Свойство Controisourse примем равным None (Нет).
А вот в RowSourse занесем через запятую список значений.
Переключатели (OptionGroup)
Эти элементы называются переключателями, потому что они могут прини
мать только одно из нескольких значений поля или переменной. То есть
когда один из них включен, другие, входящие в эту группу переключателей,
выключены. Их еще иногда называют радиокнопками — раньше на старых
радиоприемниках применялись подобные устройства, правда, механические.
Объект OptionGroup является контейнером, т. е. состоит из нескольких эле
ментов, обладающих определенными свойствами.
Создадим новую экранную форму и разместим на ней элемент управления
OptionGroup, воспользовавшись соответствующей кнопкой на панели Form
Controls (рис. 14.10).
Help I OK Cancel |
Рис. 14.11. Вкладка Buttons окна построителя Option Group Builder
Контейнер (Container)
А вот и сам контейнер. Как ясно из названия, перед нами самый настоя-
щий контейнер, в который можно включать различные элементы управле
ния. Данный объект очень широко используется при создании классов — на
его основе можно соорудить такие элементы, как группа командных кно-
пок, progressBar (Индикатор) и многое другое. В экранных формах он так
же частенько применяется, например, на рис. 14.16 представлен фрагмент
экранной формы с тремя контейнерами. Свойство speciaiEffect у первого
равно 2 (Плоский), у второго — 1 (Утопленный), у третьего — о (Выпук
лый).
Счетчик (Spinner)
Счетчик применяется для ввода числовых значений. К сожалению, для него
не предусмотрен построитель, поэтому для определения его свойств тебе
придется часа четыре двигать мышью (шутка).
Поместив объект на форме, открываем окно Properties (Свойства) и начи^
наем творить:
1. Используя уже знакомое нам свойство controisource (Источник данных)
определяем поле, для которого, собственно, и нужен счетчик. Смотри,
поставь поле Character!
Урок 14. Экранная форма. Продолжение знакомства 177
Флажок (CheckBox)
Элемент управления в виде флажка используется, когда значение поля мо
жет иметь только одно из двух значений. Ты догадался, о чем это я говорю?
Ну конечно, речь идет о полях типа Logical, ведь именно они могут иметь
только два возможных значения — "Истина" (True) и "Ложь" (False). При
Установке флажка значение в поле будет "Истина", а при сбросе — "Ложь",
'фоцесс размещения данного объекта в форме сводится к следующему:
'• Размещаем его на форме, воспользовавшись соответствующей кнопкой
на панели Form Controls.
180 Часть I. Процедурное программирование в Visual FoxPro
Линия (Line)
Ну, линия — она и есть линия. Объект, скажем прямо, декоративный. Для)
размещения линии в форме нужно воспользоваться соответствующей кно...|
Слушай, тебе не надоело читать каждый раз про кнопку? Я думаю, ты уже и
так на всю жизнь запомнил, как "вставить" в форму тот или иной объект.
В общем, переходим сразу к сути: устанавливаешь указатель мыши в начало
линии и тащишь на необходимое расстояние. В Paint рисовал? Вот-вот,
почти то же самое. А когда линия уже нарисована, определяем ее свойства: |
• толщина линии определяется значением Borderwdth;
• ц в е т о м "заведует" B o r d e r C o l o r ;
• чтобы более точно задать длину линии, используется свойство width для|
горизонтальной линии и Height — для вертикальной. Они же "регулиру
ют" угол наклона линии;
• стиль отображения указывается с помощью свойства Borderstyle, кото
рое может иметь значения, перечисленные в табл. 14.2.
DECIA X ( 4 0 0 ) , Y ( 4 0 0 )
FOR I = 1 TO 360
FOR K=l TO 200
Z=6.6832*1/360
X ( I ) = 120+90*SIN(5*Z)*COS(THISFORM.TEXT1.VALUE*Z)
Y d ) = 120+90*COS(5*Z)*SIN(THISFORM.TEXT2.VALUE*Z)
THISFORM.CURRENTX=X(I)
THISFORM.CURRENTY=Y(I)
THISFORM.PRINT ( " ( ( * ) ) " )
ENDFOR
ENDFOR
Рис. 14.21. Лис в качестве художника Рис. 14.22. Лис в качестве художника
(значения 60, 1) (значения 5, 1)
182 Часть I. Процедурное программирование в Visual FoxPro
Контур (Shape)
Расположив в необходимом месте экранной формы контур, настраиваем его
свойства:
• цвет ф о н а — BackColor;
• Прозрачность — BackStyle;
• СТИЛЬ рамКИ — B o r d e r S t y l e ;
Значение F i i i s t y i e Узор
0 - Solid Сплошная заливка
Изображение (Image)
Элемент управления image предназначен для размещения в экранной форме
изображений (рис. 14.24). Непосредственно за само изображение отвечает
свойство Picture, в котором нужно указать путь к графическому файлу.
Помнишь, мы использовали данное свойство для экранной формы? Разме
щаем объект, указываем путь к файлу и производим настройку других
свойств, а именно свойства stretch, которое может принимать следующие
значения:
О Clip (Обрезать) — картинка сохраняет свои размеры;
О Isometric (Изменить, сохранив форму) — картинка занимает весь объект
image, причем пропорционально изменяет свои размеры;
О Strech (Изменить, заполнив рамку) — картинка занимает весь объект
image, но размеры не меняет.
Таблица (Grid)
Объект Grid используется для отображения данных в табличной форме.
С первого взгляда он похож на таблицу в режиме просмотра Browse, но это
только с первого. Данный элемент управления представляет собой объект-
контейнер, включающий в себя несколько объектов. Об объектах, входящих
в состав Grid, поговорим позже, а сейчас начнем создавать этот элемент
при помощи построителя.
Откроем в окне конструктора форм нашу форму с вкладками. Разместим
при объекта Grid в ранее созданных контейнерах. Но начнем, естественно,
с одного.
184 Часть /. Процедурное программирование в Visual FoxPro
LPARAMETERS N k e y c o d e , N s h i f t a l t c t r l
IF N k e y c o d e = 1 3 && ЭТО КОД КЛАВИШИ ENTER
DO CASE
CASE EMPTY ( T h i s . V a l u e ) = . F .
SELECT C o u n t r i e s
APPEND BLANK
REPLACE C c o u n t r y WITH T h i s . V a l u e
This.Value=""
_SCREEN.ACTIVEFORM.REFRESH()
ENDCASE
ENDIF
Рис. 14.31. Мы встроили в экранную форму Рис. 14.32. Определение источника данных
еще один G r i d для объекта G r i d
Как я уже и говорил, объект Grid включает в себя несколько объектов, т. e.j
является контейнером. Нажми на кнопку в раскрывающемся списке окна
Properties и ты увидишь, какие именно объекты входят в состав нашего Grid]
(рис. 14.33).
Column — это столбец. Кроме уже известного нам Coiumncount, данный объ-|
ект имеет множество других свойств. Рассмотрим некоторые из них:
• controisource — определяет источник данных для столбца;
• Alignment — выравнивает информацию в столбце;
• coiumnOrder — определяет порядок отображения столбцов;
• Backcolor — определяет цвет фона.
Используя эти, а также и другие свойства, можно для всего столбца зада
цвет фона, цвет шрифта, размер шрифта и прочие параметры. /
урок 14. Экранная форма. Продолжение знакомства 189
Ну и что теперь делать? Как все это будет работать? Сейчас разберем.
Во-первых, для полей ввода, отвечающих за ввод фамилии, имени, отчест
ва, даты рождения и дополнительной информации о клиенте, необходимо в
качестве источника данных назначить соответствующие переменные памя
ти. Их имена будут совпадать с именами полей таблицы Names.dbf за одним
лишь исключением — перед именем поля необходимо ставить префикс т.
А вот в качестве источника данных для полей, указывающих страну, город и
улицу, укажем не переменные памяти, а сами имена полей из соответст
вующих таблиц. Да еще и сделаем данные поля доступными только для чте-
НИЯ (ReadOnly=.T.).
Посмотрим, как будет работать форма на этом этапе? Давай только еще не
много отредактируем свойства наших элементов Grid. Конкретно нас инте
ресует событие AfterRowCoichange, которое наступает после того, как мы пе-
рейдем на другую строчку Grid. Так вот, в первом объекте Grid (где страны)
для данного события пишем следующий код:
THISFORM.REFRESH() && после перехода на другой ряд Grid
&& форма просто перерисовывается с новыми данными.
Вот и все. Сохрани эту программу под любым именем, и теперь можешь
попробовать запустить форму на выполнение и позаполнять наши справоч
ники. Сначала заполняется справочник стран — тут все просто, в поле вво
да набираешь название и нажимаешь <Enter>. Затем, указав в этом Grid
нужную страну, также заносишь данные в справочник городов для этой
страны. Указав город, заносим название улиц этого города.
Таким образом, у нас уже имеется форма с тремя связанными и, что совсем
уже удивительно, работающими объектами Grid.
Ну а как же все-таки добавлять записи в таблицу names, где у нас "фамилии,
пароли, явки" и т. д.?
Кнопка Новая запись может иметь примерно такой программный код для
события click — листинг 14.4.
SELE Names
APPEND BLANK
GATHER MEMVAR
REPLACE I d c o u n t r y WITH C o u n t r i e s . I d c o u n t r y ;
Ccountry WITH C o u n t r i e s . C c o u n t r y
REPLACE C s t r e e t WITH S t r e e t s . S t r e e t
REPLACE I d c i t y WITH C i t i e s . I d c i t y , C c i t y WITH C i t i e s . C c i t y
REPLACE Idrooms WITH Rooms.Idroom
I
E THISFORM.Pageframel.Pagel.Optiongroupl.Optionl.Value=l
REPLACE Csex WITH "M"
ELSE
UEPLACE Csex WITH "Ж"
ENDIF
IF EMPTY(THISFORM.Pageframel.Pagel.Textl.Value)
-> = MESSAGEBOX("УКАЖИТЕ ФАМИЛИЮ КЛИЕНТА", "ОШИБКА...")
ELSE
... <приведенный ранее код>...
END IF
SELECT Names
SCAN FOR Ddeptdate=DATE ()
LOCAL Nroomprice
SELECT Rooms
LOCATE FOR Idroom=Names.Idrooms
Nroomprice=Rooms.Nprice
Урок 14. Экранная форма. Продолжение знакомства 195
SELECT Names
SCATTER MEMVAR MEMO
DELETE
SELECT Depclients
APPEND BLANK
GATHER MEMVAR MEMO
REPLACE Ndays WITH Ddepdate-Darrdate
REPLACE Ncost WITH Ndays*Nroomprice
SELECT Names
ENDSCAN
PACK
THISFORM.REFRESH ()
А если этот код еще и поместить в метод i n i t нашей формы, то все полу
чится именно так, как мы задумали. Но при этом есть и грустный мо
мент — посмотри теперь на нашу форму (рис. 14.37).
Что случилось? Почему вместо Grid мы теперь видим какую-то белую "ды-
ру? А это результат использования команды PACK. Более того, я тебя сейчас
196 Часть I. Процедурное программирование в Visual FoxPro
еще обрадую — тот же эффект мы будем наблюдать каждый раз, когда бу!
дем удалять записи из таблицы, являющейся источником данных для объек-3
та Grid. Избежать этого довольно просто, нужно сделать следующее: перед
использованием команды удаления необходимо "очистить" источник данных
для Grid, а потом восстановить его (листинг 14.9).
SELECT Names
THISFORM.Pageframel.Page2.Gridl.Recordsource=.NULL.
PACK
THISFORM.Pageframel.Page2.Gridl.Recordsource="NAMES"
/
урок 15
Выборка, упорядочение
и просмотр данных
Итак, что мы имеем? У нас есть база данных, есть несколько таблиц, есть
экранная форма и, наконец, есть сами данные. А что мы умеем? Мы умеем
заносить в базу данных новые записи и, соответственно, удалять какие-
нибудь из них. Что ж, для начала не так уж и плохо. Но ведь мы знаем, что
основное назначение системы управления базами данных — это быстрый
поиск и предоставление пользователю тех записей, которые удовлетворяют
заданным условиям. Вот именно этому, читая данную главу, мы сейчас и
будем учиться.
Для того чтобы из таблицы выбрать данные, ее сначала нужно открыть. Каж
дая таблица, независимо от того, входит ли она в контейнер базы данных
или является свободной таблицей, открывается в своей рабочей области.
Принято считать, что в Visual FoxPro имеется 32 627 рабочих областей, в
каждой из которых может храниться таблица и соответствующие ей индек
сы. И что все эти таблицы можно открыть одновременно. Это так, но на
самом деле рабочих областей еще больше. Дело в том, что если мы будем
использовать приватные сеансы данных (private data session), то
32 627 рабочих областей будут доступны в каждом сеансе!
Открыть таблицу (а сейчас мы говорим о свободных таблицах) можно, ис
пользуя команду USE. Например, вот так: USE ROOMS. При этом таблица rooms
будет открыта в первой рабочей области. После применения USE FLOORS В
первой области у нас окажется таблица floors, a rooms соответственно будет
закрыта. А как их использовать одновременно? Для этого в команде USE
необходимо указать, в какой именно рабочей области будет открыта таб
лица:
USE ROOMS IN 1
USE FLOORS IN 2
SELECT 2
BROWSE
Команда SEEK.
Поиск по значению индекса
Некоторой альтернативой команды LOCATE является команда SEEK, НО ДЛЯ ее
использования необходимо наличие индекса. Если открыто несколько ин
дексов, то нужно перед использованием данной команды "выбрать" какой-
то один, т. к. команда работает с одним индексом. Установить индекс мож
но при помощи команды SET ORDER TO, использование которой будет рас
смотрено далее. Попробуем найти запись в таблице rooms, значение индекса
которой равно 202.
SELECT ROOMS
SET ORDER TO IDROOM
SEEK 202
"спарку" LOCATE и CONTINUE. А используя SET FILTER то, мы можем сразу ого-
бразить все необходимые записи:
SELECT NAMES
SET FILTER TO CFIRSTNAME="MB"
BROWSE
При этом Лис сообщит, что индекс с таким именем уже существует и спро-
сит, не желаем ли мы его перезаписать? Чтобы он не спрашивал, а индекс
переписывался автоматически, нужно добавить в нашу команду еще одно
ключевое слово ADDITIVE:
USE NAMES
INDEX ON ALLTRIM (CFIRSTNAME) TAG FIRSTN ADDITIVE
Создание и использование
запросов
На твой вопрос: "Что такое запрос?" — отвечаю: "Запрос — это вопрос".
Красиво сказано, не правда ли? А ведь в этой шутке есть доля правды, по
тому что запрос это действительно вопрос, с которым пользователь обраща
ется к базе данных. Применительно к нашему случаю.
• Сколько клиентов из России проживало в нашем отеле за период
с 1 сентября по 26 октября?
• В каком из номеров предпочитали останавливаться клиенты за все время
существования отеля?
• Сколько клиентов на сегодняшний день живут в номерах третьего этажа,
оборудованных телефоном?
• Какой номер самый рентабельный?
Список, как ты понимаешь, может быть бесконечным. Ты скажешь: "Ну и
что? Я только что научился находить, выбирать, сортировать данные и при
помощи определенных команд легко отвечу на эти вопросы!" Не спорю, от
ветишь. Количество дополнительных условий, используемых в SET FILTER
то, LOCATE, SCAN и т. д., практически не ограничено. Но ты ответишь на эти
вопросы сегодня, а завтра и послезавтра возникнут другие. Ты захочешь
снова переписывать свою программу? Да и вообще, ведь все вопросы преду
смотреть нельзя (если ты, конечно, не ясновидящий). Вот для того, чтобы
пользователь мог найти ответ практически на любой вопрос, и существуют
такие хитрые и очень мощные "штуковины", как запросы (Query). Еще есть
п
°хожие на них виды или представления данных, но о них разговор будет
Позже.
пункты File | New (Файл | Новый). В диалоговом окне New выбери опцию
Query (Запрос) и нажми кнопку New file (Новый файл) (рис. 16.1).
Как видишь, сразу после выполнения команды меню Лис открывает диало-
говое окно, в котором спрашивает: "А какие таблицы или представления
данных будут добавлены в создаваемый запрос?" (рис. 16.2). Выберем для
начала две таблицы, cities и streets, закроем диалоговое окно, используя
кнопку Close (Закрыть), и поближе познакомимся с конструктором запро
сов (рис. 16.3).
Конструктор запросов содержит панель инструментов Query Designer
(рис. 16.4), описание кнопок которой приведено в табл. 16.1.
Кнопка Описание
Кнопка Описание
Рис. 16.16. Мы построили еще одно выражение, которое также будет включено в запрос
214 Часть I. Процедурное программирование в Visual FoxPro
вый Лис, и он прав, потому что для него главное синтаксис критериев, а
смысл этих критериев ему безразличен. За смыслом выражений должны
следить, естественно, мы с тобой. Вот еще один наглядный пример, на этот
раз с использованием логического оператора AND (рис. 16.19а).
Курсор
Курсор — это не только указатель мыши. В Visual FoxPro курсором
называется временная таблица, которая будет создана для хранения резуль
татов запроса. Данные в курсоре можно только просматривать, нельзя их ни
Добавлять, ни модифицировать, ни удалять. Курсор "живет" только в теку
щем сеансе, при завершении работы Visual FoxPro он будет удален. Знаешь,
почему он так интересно называется? Да потому, что его название как нель
зя точно определяет его суть — CURSOR (Current Set Of Records, текущий
набор записей).
Таблица
Результаты запроса записываются в новую таблицу. Это обычная таблица,
записи которой можно удалять, добавлять, модифицировать. В отличие от
218 Часть I. Процедурное программирование в Visual FoxPro
График
Результаты запроса можно отобразить в графическом виде. Для построения
графиков у Лиса имеется свой "чертежник" — Graph Wizard (Мастер графи
ков). Чтобы наглядно проследить за его работой, давай запустим на выпол
нение наш запрос, предварительно установив опцию Graph в диалоговом
окне Query Destination.
Экран
При выборе данного режима результат запроса будет выводиться просто над
экран Visual FoxPro, но, используя некоторые дополнительные опции, мож-|
но указать еще и дополнительный "пункт назначения" (рис. 16.25).
Отчет
При выборе этого режима результаты запроса будут представлены в виде
отчета (рис. 16.26).
Так как опции данного диалогового окна аналогичны опциям для вывода
отчетов, мы не будем останавливаться на этом вопросе, а сразу обратимся к
Label Wizard — мастеру почтовых наклеек (в "арсенале" у Лиса и такое чудо
Урок 16. Создание и использование запросов 223
I002
226 Часть I. Процедурное программирование в Visual FoxPro
HTML
Visual FoxPro может сохранять некоторые файлы в данном формате, и таб
лицы не являются исключением. Для представления результатов запроса в
формате HTML, их (результаты) сначала нужно представить в табличной фор
ме (CURSOR или BROWSE). После этого необходимо в системном меню File
(Файл) выбрать пункт Save As HTML (Сохранить как HTML) (рис. 16.36).
228 Часть I. Процедурное программирование в Visual FoxPro
SQL-инструкция SELECT
или как все это сделать "вручную"?
Что такое SQL-инструкция SELECT? ЭТО как раз то, написанием чего мы за
нимались всю предыдущую главу. Ты спросишь: "Как же так? Ведь мы за
нимались построением запросов с помощью Query Designer, и никаких та-
ких непонятных инструкций видеть не видели, и знать не знаем..." Про
"знать не знаем" пока согласен, а вот насчет остального... Щелкни-ка
мышью по кнопке SQL, которая расположена на панели инструментов
Query Designer (рис. 16.40).
Вот это и есть SQL-инструкция SELECT. А кто написал весь этот программ-)
ный код? Да ты сам, кто же еще. Вернее не ты, а Лис, но с твоей помощью.
А вот прочитав эту главу, ты вполне сможешь научиться писать SQL-
инструкции самостоятельно и затем использовать их как подпрограммы или
фрагменты программ в своих приложениях.
Урок 16. Создание и использование запросов 231
В данном случае в наш запрос попадут все поля и все записи из таблицы
names, входящей в состав базы данных oidfox, и все это будет отображено
в окне Browse. А где в приведенном примере команда BROWSE? А нигде —
режим отображения BROWSE установлен по умолчанию.
Если нам нужны не все поля, можно просто указать необходимые:
SELECT Cfirstname, Csecondname, Dbirthday FROM OLDFOX!NAMES
Подзапросы
Применяя SQL-инструкции, разрешается использовать до десяти вложен
ных запросов. Конструкция, имеющая вложенные запросы, называется под
запросом. Допустим, нам понадобилось узнать, какой была максимальная
заплаченная сумма за проживание в нашем отеле, а также выбрать клиен-
I
234 Часть I. Процедурное программирование в Visual FoxPro
Функция Описание
COUNT() Подсчитывает количество записей
SUM() Суммирует значения
AVG() Вычисляет среднее значение
MIN() Определяет минимальное значение
МАХО Определяет максимальное значение
COUNT(DISTINCT) Подсчитывает количество неповторяющихся записей
SUM(DISTINCT) Суммирует значения неповторяющихся записей
AVG(DISTINCT) Вычисляет среднее значение среди неповторяющихся записей
Так как в данном примере условие выборки состоит из двух условий, необ
ходимо дважды указать тип объединения:
INNER JOIN OLDFOX'NAMES;
INNER JOIN OLDFOX!ROOMS;
ON ROOMS.IDROOM = NAMES.IDROOMS;
ON COUNTRIES.IDCOUNTRY - NAMES.IDCOUNTRY;
Использование HAVING
Ключевое слово HAVING имеет тот же смысл, что и слово WHERE, но в то вре
мя как WHERE используется для выборки отдельных строк, удовлетворяющих
условию, HAVING "работает" с группами записей. Определим города, из кото-
рых в наш отель прибыло по два постояльца:
SELECT CCITY FROM OLDFOX!NAMES;
GROUP BY CCITY;
HAVING COUNT (*)>2
Использование переменных
в SQL-инструкциях SELECT
До сих пор мы сами задавали условия для выборки тех или иных данных из
таблиц. Но для того чтобы значения критериев отбора мог задавать конеч
ный пользователь, необходимо использовать переменные:
nMYCOST=12000
SELECT CFIRSTNAME, CSECONDNAME, NCOST FROM OLDFOXiDECLIENTS;
WHERE NCOST=NMYCOST
nMYCOST=12000
SELECT CFIRSTNAME, CSECONDNAME, NCOST FROM OLDFOX!DECLIENTS;
WHERE NCOST=NMYCOST;
INTO CURSOR MYQWERY
Значение Описание
Рис. 16.47. Диалоговое окно New Query Рис. 16.48. Диалоговое окно Wizard Selection
Урок 16. Создание и использование запросов 239
Опция Назначение
Sum Итоговые значения равны сумме значений
Count Итоговые значения равны количеству значений
Average Итоговые значения равны среднему значению
Max Итоговые значения равны максимальному значению
Min Итоговые значения равны минимальному значению
Опция Назначение
Sum of data В итоговом столбце — сумма значений текущей
строки
Урок 16. Создание и использование запросов 241
Опция Назначение
Опция Назначение
Save and run cross-tab query Сохранить созданный запрос и запустить его
на выполнение
Save cross-tab query and modify Сохранить созданный запрос и открыть его в
in the Query Designer окне конструктора запросов для модифика
ции
242 Часть I. Процедурное программирование в Visual FoxPro
Теперь посмотрим, как будет выглядеть код для инструкции SQL. Самый
простой способ — модифицировать полученный запрос в конструкторе и
"подсмотреть" SQL-оператор, сгенерированный Visual FoxPro (рис. 16.54).
Номер Значение
Назначение
параметра по умолчанию
1 Имя выходного файла или курсора Xtab.dbf
2 Создание только курсора .Т.
Использование SQL-инструкций
в программах
Так как инструкция сохраняется в виде файла с расширением qpr, для ее
выполнения достаточно использовать простую команду:
DO <имя файла>.qpr
УРОК 17
Использование
представлений данных (видов)
Как всегда, возникает самый главный вопрос — а что это такое? Отвеча-
ем — почти то же, о чем мы читали в предыдущей главе. Почему почти?
А вот это и есть самый важный вопрос, потому что между этими двумя поч-
ти эквивалентными понятиями есть различия и они принципиальны.
• Запросы хранятся в отдельных файлах с расширением qpr, а представле-
ния данных — в самой базе данных.
• Самое главное — представления позволяют обновлять данные.
• С помощью представления можно обновлять данные, сохраняемые в не-
скольких связанных файлах.
• Созданное представление данных можно использовать как обычную таб-)
лицу в отчетах, формах, запросах.
• С помощью представления данных можно ограничить доступ пользовате-
ля к отдельным записям.
Опция Описание
дах и т. п.! Это я тебе точно говорю. А выход очень простой — использовать
в качестве параметров все те же переменные памяти, значения которым
пользователь может присваивать с помощью полей ввода в экранной форме.
Вот и все. Все довольны! Более того, при этом окна для ввода значения па
раметров открываться не будут.
Замечание
В представление данных, помимо обычных полей, можно включать и поля типа
Memo. Включать-то можно, да вот беда — обновляться (см. ранее) они не будут
ни при каких условиях. Се ля ви, что тут поделать.
Внедрение OLE-объектов
Для начала короткая справка, дающая ответ на твой вечный вопрос: "А это
еще что такое?!" В твоем приложении может быть сколь угодно этих самых
OLE-объектов, и несмотря на то, что созданы они не средствами Visual
FoxPro, они являются полноценными членами твоего приложения. В об
щем, можно дать такое "примитивное" определение для OLE-объекта — эта
штука создана в какой-либо программе Windows (не Visual FoxPro), но так
же может использоваться в другой, не "родной" программе, например в
Visual FoxPro. В таблицах Visual FoxPro могут храниться как сами OLE-
объекты, так и связи с этими объектами. И вот именно от этого будет зави
сеть, каким образом будет запоминаться и обновляться информация о дан
ном объекте после того, как он будет помещен в таблицу.
При внедрении объекта в таблице Visual FoxPro хранится сам объект. Если
дважды щелкнуть на таком объекте, то откроется приложение, в котором
данный объект был создан. При этом, используя данное приложение, объ
ект можно редактировать, после чего все внесенные в него изменения будут
сохранены в таблице.
Несколько иная ситуация возникает при связывании объекта — в таблице
хранится только ссылка о месте расположения исходного файла, а сами
данные хранятся в этом файле. Данные будут обновлены только в случае
обновления исходного файла.
Приложение, в котором объект был создан, называется приложение-сервер, а
приложение, в которое данный объект внедряется — приложение-клиент.
Так что же мы можем назвать OLE-объектом? Я думаю, что в свете изло
женного ранее нетрудно догадаться, что этим самым объектом может быть
практически любой объект, созданный в приложениях Windows, поддержи
вающих технологию OLE. Например, документ Word или электронная таб
лица Excel. Файл звукозаписи или видеоизображение. Точечный рисунок,
наконец. Вот в качестве примера использования OLE-объектов мы и рас
смотрим внедрение и связывание рисунков в наши таблицы. В качестве ри
сунков у нас будут выступать фотографии постояльцев отеля Old Fox Hotel.
258 Часть I. Процедурное программирование в Visual FoxP.
Вставка объекта нужно вместо опции Создать новый указать опцию Создать
из файла. При этом диалоговое окно Вставка объекта примет такой вид —
рис. 18.6.
Связывание OLE-объекта
При связывании объекта в таблице Visual FoxPro хранится только ссылка на
данный объект, а сам объект располагается в другом месте. Для того чтобы
связать OLE-объект с его основной копией, можно воспользоваться уже
знакомой командой Insert Object или Paste Special (Специальная вставка).
Рассмотрим оба варианта, а ты уж сам решай, какой предпочтительней.
Открой приложение-сервер и выполни для связываемого объекта команды
Выделить все и Копировать. Этим самым ты поместишь объект в буфер об
мена. Теперь открой в таблице окно редактирования для поля General и вы
полни команду Paste Special (Специальная вставка) (рис. 18.9).
Кнопка Описание
Удаление OLE-объекта
Ну, как говорится, ломать — не строить. Единственная команда меню Edit
(Редактирование) — Clear (Очистить) и все, объект "приказал долго жить".
После команды APPEND GENERAL следует указать имя поля General, а после
ключевого слова FROM пишут имя файла, можно с указанием пути. Но мы в
данном случае не стали явно прописывать имя, а, воспользовавшись макро
подстановкой (&), передали в данную команду значение переменной
&Myfile.
Конечно, здесь еще нужно предусмотреть, чтобы объект "попал" в нужную
таблицу и в нужную запись, но это, как говорится, уже "дело техники".
УРОК 19
Использование
компонентов ActiveX
и библиотек классов
До сих пор мы использовали только те элементы управления, которые дос
тупны из различных панелей управления Visual FoxPro. Это, так сказать,
стандартные элементы управления, входящие в состав Visual FoxPro. Но,
как часто бывает в жизни, здесь мы с тобой видим только надводную часть
"айсберга", а все остальное пока от нас скрыто... Улавливаешь, о чем это я?!
Правильно, кроме уже известных нам элементов управления существует
множество других, как входящих в состав Visual FoxPro, так и разработан
ные сторонними фирмами. Те элементы управления, которые входят в со
став Visual FoxPro, находятся в специальных каталогах, которые называются
библиотеками классов. В Visual FoxPro эти библиотеки объединены под об
щим названием — Visual FoxPro Foundation Classes (Основные классы Visual
FoxPro). Для чего это вообще все нужно? Для того чтобы облегчить нам с
тобой процесс создания приложений, и сейчас мы разберем, каким же обра
зом это происходит.
Элемент Описание
cmdok Кнопка ОК
Кнопка Help
cradhelp
Кнопка Cancel
cmdcancel
Все эти элементы можно размещать в экранных формах точно так же, как и
стандартные элементы управления (рис. 19.4).
Компоненты ActiveX
Компоненты ActiveX представляют собой объекты, включающие в себя дан-
ные и код. Их можно использовать так же, как и элементы управления
Visual FoxPro. Единственное их отличие от базовых компонентов Visual
FoxPro состоит в том, что они создаются не в среде FoxPro, а с помощью
других средств разработки, например Visual C++. А главным преимущест-
вом является то, что их много] Их разработкой занимаются все, кому не
лень — как коммерческие организации, так и программисты. Точное ко-
личество существующих компонентов ActiveX, наверное, одному Богу из
вестно...
Ладно, лирику в сторону, переходим к практике. Для выбора необходимых
компонентов ActiveX необходимо воспользоваться пунктом ActiveX Controls
(Элементы управления ActiveX) из контекстного меню кнопки View Classes
(Просмотр классов) панели Form Controls (Элементы управления), после
чего появится вот такое сообщение — рис. 19.7.
Ничего страшного, просто наш Лис просит указать, какие именно элементы
управления мы собираемся использовать, и просит воспользоваться пунктом
Options (Опции) из системного меню Tools (Инструменты) для выбора ком
понентов. Что ж, так и поступим — рис. 19.8.
В списке Selected мы видим все доступные на нашем компьютере компо
ненты ActiveX. Для того чтобы подключить дополнительные компоненты,
скажем, с компакт-диска, необходимо воспользоваться кнопкой Add (Доба
вить). А для выбора уже имеющихся элементов достаточно отметить их кре
стиками в списке Selected и нажать кнопку ОК.
После этой процедуры мы без хлопот можем добавить наши элементы на
панель Form Controls. Вот и давай выберем несколько наиболее часто при-
Урок 19. Использование компонентов ActiveX и библиотек классов 273
Начнем с первых трех. Для этого создадим новую экранную форму с тремя
вкладками (рис. 19.10).
Разместив на первой вкладке компонент точечный рисунок, вызовем контек
стное меню, в котором выберем пункт Точечный рисунок Object, а затем оп
цию Открыть или Изменить
274 Часть I. Процедурное программирование в Visual FoxPro
Нетрудно догадаться, что oiecontroii не что иное, как имя нашего объекта
ProgressBar. На этом простом примере видно, каким образом можно ис-
пользовать данный компонент для визуализации тех или иных процессов.
Урок 19. Использование компонентов ActiveX и библиотек классов 277
Рис. 19.15. Диалоговое окно настройки свойств Рис. 19.16. Форма с элементом
элемента P r o g r e s s B a r Slider
В СОбыТИИ CHANGE:
MYREC=THIS.VALUE
SELE TABLE1
GO MYREC
THISFORM.REFRESH()
• для второго:
THISFORM.GRID1.FORECOLOR=RGB(THIS.VALUE,THIS.VALUE, THIS.VALUE)
• для третьего:
THISFORM.GRIDl.FONTSIZE=THIS.VALUE
Использование календаря
Одним из интересных примеров применения объектов ActiveX является ис
пользование календаря. С помощью данного элемента мы можем вводить
даты в наши таблицы. Создадим новую форму, источником данных для ко
торой будет являться таблица names, и добавим в нее указанный компонент
ActiveX (рис. 19.19).
Лис и Excel
Самый простой способ передать данные из Visual FoxPro в Excel — восполь
зоваться командой Export (Экспорт) из системного меню File (Файл)
(рис. 20.1).
Рис. 20.1. Для передачи данных используется соответствующий пункт системного меню
Далее, в поле ввода From (Откуда) необходимо указать имя таблицы, из ко
торой будут переданы данные.
°се, да не все... По умолчанию в файл-приемник будут переданы все записи
и все поля указанной таблицы. Иногда такое "изобилие" просто ни к чему,
и для задания условий передачи мы воспользуемся кнопкой Options (Оп-
ции) (рис. 20.4).
282 Часть I. Процедурное программирование в Visual FoxPro
Параметр Описание
При нажатии кнопок For (Для) и While (Пока) появится уже хорошо знаков
мое нам окно Expression Builder (Построитель выражений), в котором мож-
но задать необходимые условия.
Кнопка Fields (Поля) позволяет выбрать те поля исходной таблицы, кото
рые будут переданы (рис. 20.5).
В окне Field Picker находится два списка. В левом отображены все поля ис
ходной таблицы, в правом — те, которые будут передаваться в файл-
приемник. Для переноса полей в правый список используется кнопка Move
(Перенести). Наконец, когда все "формальности" улажены, можно нажать
кнопку ОК и посмотреть, что там у нас из всего этого получилось (рис. 20.6).
IF EMPTY(Thisform.Text1.Value)
=MESSAGEBOX("УКАЖИТЕ ИМЯ ФАЙЛА","СШИБКА")
ELSE
SELE Names
284 Часть I. Процедурное программирование в Visual FoxPro
My_File=ALLTR(Thisform.Textl.Value)
EXPORT TO &My_File TYPE XLS
ENDIF
Вот и все. Чем хорош данный способ? В отличие от предыдущего, здесь по
мимо таблиц можно использовать и представления данных. Да и вообще
удобнее для пользователя. Ты скажешь, а как же ограничить число переда
ваемых полей и записей? Да элементарно — добавь в форму еще несколько
элементов управления (например, раскрывающийся список с наименова-
ниями полей, поле ввода для установки фильтра и т. д.), используй макро-
подстановки и все получится! Это, как говорится, дело техники...
Но при данном способе передачи мы просто получаем книгу Excel и все.
А если нам нужен "красивый" отчет? Например, такой — рис. 20.8.
Чтобы получить такую "красоту", нам необходимо воспользоваться для пе
редачи данных механизмом OLE.
Код для кнопки Экспорт будет следующим — листинг 20.2.
Omyexcelreport=CREATEOBJECT("EXCEL.SHEET";
Qmyexcelreport.Application.Visible=.T.
Omyexcelreport=Omyexcelreport.Sheets[1]
SELE Names
WITH Omyexcelreport
WITH .Range("Al")
.Value="СПИСОК КЛИЕНТОВ"
Урок 20. Экспорт и импорт данных 285
WITH .Font
.Bold-.т.
.Size=14
ENDWITH
ENDWITH
ENDWITH
Nrow=5
SCAN
Nrow=Nrow+l
Qmyexcelreport.Cells(Nrow,1).Value=ALLTR(Names.Cfirstname)+;
" "+ALLTR(Names.Csecondname);
+" "+ALLTR(Clastname)
WITH Omyexcelreport
WITH .Cells(Nrow,1)
WITH .Font
IF Names.Csex="M"
.Bold-.T.
.Colorindex=4
ELSE
.Bold=.F.
.Colorindex=5
ENDIF
ENDWITH
ENDWITH
ENDWITH
ENDSCAN
Qmyexcelreport.Visible=.T.
RELEASE Omyexcelreport
Но есть и еще один способ. Для этого создадим "еще более красивый" отчет
и заполним его значениями из нашей таблицы. Отчет будем создавать
в Excel, после чего обязательно сохраним его под каким-либо именем
(рис. 20.9).
Изменим код кнопки Экспорт таким образом, чтобы данные "попадали" в
только что созданный нами новый файл (листинг 20.3).
Oexcel=CREATEOBJECT("EXCEL.APPLICATION")
Oexcel.Workbooks.Open("C:\OLDFOX\MYREPORT")
WITH Oexcel
• C e l l s (2, ID .Value=DTOC(DATE() )
ENDWITH
286 Часть I. Процедурное программирование в Visual FoxPro
SELE Names
Nrow=ll
SCAN
Nrow=Nrow+l
Oexcel.Cells(Nrow,1).Value=ALLTR(Names.Cfirstname)+"
"+ALLTR (Names. Csecondname) ;
+" "+ALLTR(Names.Clastname)
Oexcel.Cells(Nrow,2).Value=Names.Idrooms
Oexcel.Cells(Nrow,3).Value=DTOC(Names.Darrdate)
Oexcel.Cells(Nrow,4).Value=DTOC(Names.Ddepdate)
ENDSCAN
Oexcel.Visible=.T.
На втором шаге (рис. 20.14) мы можем указать, с какой строки начать им
порт данных (Begin import at row) и на какой строке расположить наимено
вания полей (Field names in row). А зачем нам в таблице их наименования?
Ставим ноль. В списке Worksheet можно указать конкретный лист элек
тронной таблицы, в нашем случае он один-единственный. Также можно
задать формат данных (опция Data Format).
На третьем шаге работы мастера (рис. 20.15) мы можем задать типы полей
нашей таблицы и определить заголовки, которые будут отображены при
Просмотре таблицы.
10 ч»..
290 Часть I. Процедурное программирование в Visual FoxPro ч
А что это мы все про Excel? Кроме Excel существует множество других при-
ложений, с которыми Лис может обмениваться данными. Вот, например,
его младший братец FoxPro for DOS наотрез отказывается воспринимать
таблицы, созданные в Visual FoxPro! Ну, вроде все нормально, обычная таб-
лица, dbf, все как положено — ан нет! "Ругается", пишет что это "Not a
database file". Вот тут-то и приходят на помощь экспортно-импортные oпe-
рации. (Хотя в данном конкретном случае экспорт и не нужен — "визуаль
ный" Лис вполне адекватно воспринимает таблицы, созданные "Досов
ским" Лисом.) Более того, чтобы передать таблицу в формат DOS, доста
точно такой команды:
COPY My_Table TO My_Dos_Table TYPE FOXPLUS AS 886
УРОК 21
Наборы форм
Обрати внимание на то, что у всего набора форм общий источник данных. .
Сохраним наш набор под любым именем и запустим на выполнение
(рис. 21.4).
Урок 21. Наборы форм 295
ON PAD Padone OF Mymenu ACTIVATE POPUP Popone && определяем действия при
&& выборе пункта линейки
ON PAD Padtwo OF Mymenu ACTIVATE POPUP Poptwo
DEFINE POPUP Popone && определяем первое всплывающее меню
DEFINE BAR 1 OF Popone PROMPT "ЗАПУСК ЭКРАННОЙ ФОРМЫ" && определяем
&& заголовки пунктов всплывающего меню
DEFINE BAR 2 OF Popone PROMPT "ВЫХОД"
ON SELECTION BAR 1 OF Popone DO FORM Main && определяем действия
&& при выборе пункта всплывающего меню
ON SELECTION BAR 2 OF Popone QUIT
DEFINE POPUP Poptwo && определяем второе всплывающее меню, пункты подменю
&& и действия при их выборе
DEFINE BAR l OF Poptwo PROMPT "ПЕЧАТЬ ОТЧЕТА"
DEFINE BAR 2 OF Poptwo PROMPT "ПРОСМОТР ОТЧЕТА"
ON SELECTION BAR 1 OF Poptwo DO Procl
ON SELECTION BAR 2 OF Poptwo REPORT FORM Myreport PREVI
ACTIVATE MENU Mymenu && активируем линейку меню
PROCEDURE Procl && а это внешняя процедура
SELE Mytab
SET ORDER TO Myorder
REPORT FORM Myreport TO PRINTER
Здесь нам предлагается два варианта меню: Menu — обычное меню в виде
строки и Shortcut — всплывающее контекстное меню. Начнем с обычного
(рис. 22.4).
Кнопка Описание
Кнопка Описание
Command (Команда)
При выборе данного пункта с правой стороны появится поле ввода для
записи команды (рис. 22.6).
302 Часть I. Процедурное программирование в Visual FoxPro
Submenu (Подменю)
При выборе данного пункта справа появится кнопка Create (Создать), при
нажатии которой откроется диалоговое окно для создания соответствующе
го подменю (рис. 22.7).
Параметр Описание
В поле ввода Pad Name (Имя пункта) можно ввести желаемое наименование
для данного поля ввода. Делается это для улучшения читаемости программ
ного кода, сгенерированного конструктором отчетов.
Для блокировки пунктов меню используется поле ввода Skip For (Пропус
тить для). При нажатии расположенной справа кнопки откроется диалого
вое окно Expression Builder (Построитель выражений), в котором можно за
дать условие для блокировки пункта меню. Для разделения пунктов меню
по определенным категориям можно использовать символы \-. Как это де
лается, отображено на рис. 22.10, 22.11.
Параметр Описание
Генерация меню
Чтобы меню можно было использовать в приложении, сначала его нужно
сгенерировать. Для этого используется пункт системного меню Menu (Ме
ню) и диалоговое окно Generate Menu (Генерация меню) (рис. 22.13).
Запуск меню
Существует несколько способов запустить меню на выполнение:
• в окне проекта приложения установить курсор на наименования нашего
меню и нажать кнопку Run;
• в командном меню написать следующую команду:
DO <имя_меню>. mpr
Создание Shortcut-меню
Shortcut-меню по сути очень похоже на контекстное меню, вызываемое на
жатием правой кнопки мыши. Мы уже не раз с ними встречались в процес
се разработки приложения, а теперь и сами научимся создавать нечто по
хожее.
В диалоговом окне New Menu (Новое меню) нажмем кнопку Shortcut (см.
рис. 22.3). Запустится конструктор меню (рис. 22.18).
Для того чтобы меню такого типа выполнялось при нажатии правой кнопки
мыши, необходимо использовать событие Right Click Event (Щелчок пра
вой кнопкой), для которого написать следующую команду:
DO <имя меню>.mpr
УРОК 23
Создание
справочной системы
Для создания справочной системы нашего приложения мы воспользуемся
программным продуктом HTML HELP Workshop, который поставляется
вместе с Visual FoxPro. С помощью данного приложения, разработанного
корпорацией Microsoft, практически любой программист, не прилагая осо
бых усилий, сможет создать справочную систему для своего приложения.
Если по какой-либо причине у тебя нет данного приложения (хотя оно
должно быть на установочном диске Visual FoxPro) — не беда, его можно
скачать с сайта производителя: www.microsoft.com/workshop/autor/htnilhelp.
Для установки данной системы необходимо дважды щелкнуть мышью на
файле самораспаковывающегося архива HTMLHELP.EXE и следовать даль
нейшим инструкциям.
Главное окно HTML HELP Workshop представлено на рис. 23.1.
Посмотрели — теперь закроем. Сейчас мы займемся созданием самих фай
лов нашей будущей справки. Как видно из названия, данная система рабо
тает с файлами формата HTML. Где их взять? Естественно, нужно создать
самостоятельно. Для этого можно использовать любой HTML-редактор
(простенький редактор имеется в самой системе HTML Help Workshop). Но
гораздо более удобный способ — использовать обычный Word, в котором
создать файлы тем справочной системы и сохранить их в формате HTML.
Так и поступим — рис. 23.2.
После создания всех файлов тем справки запускаем HTML Help Workshop и
в меню File (Файл) выбираем пункт New (Новый).
В диалоговом окне New (рис. 23.3) можно указать тип создаваемого компо
нента справочной системы: Project (Проект), Text (Текст), HTML File
(Файл в формате HTML), Table of Contents (Таблица содержания), Index
(Индексы). Так как мы создаем новое приложение, нам необходимо вы
брать пункт Project (Проект) — рис. 23.4.
312 Часть I. Процедурное программирование в Visual FoxPro
"Укажите, где расположены Ваши файлы тем?" — вот что спрашивает мас
тер на данном этапе создания проекта (рис. 23.7). Для добавления файлов в
проект используется кнопка Add (Добавить), а для удаления — соответст
венно, Remove (Удалить).
В результате перед нами появится окно нашего проекта (рис. 23.8). Слева
расположены кнопки, назначение которых описано в табл. 23.1.
Урок 23. Создание справочной системы 315
Кнопка Описание
Информация API
API information
Данное диалоговое окно содержит две опции: Create a new contents file
(Создать новую таблицу содержания) и Open an existing contents file (От
крыть существующую таблицу). Так как никакой таблицы у нас пока нет,
выбираем первый пункт.
В открывшемся диалоговом окне Save As (Сохранить как) необходимо ука
зать имя таблицы, например MY-TABLE.hhc. Имя может быть любым, а вот
расширение — только hhc. После этого откроется вкладка Contents (Содер
жание) (рис. 23.10).
Кнопка Описание
Свойства содержания
Contents properties
318 Часть I. Процедурное программирование в Visual FoxPr
Кнопка Описание
Вставка заголовка
Insert a heading
Вставка страницы
Insert a page
Редактирование выделенного
Edit selection
Удаление выделенного
Delete selection
Сохранение файла
Save file
П " W 1ПП-)
322 Часть I. Процедурное программирование в Visual FoxPro
Создание
контекстно-зависимых разделов справки
Допустим, есть некая экранная форма (рис. 23.19).
Для того чтобы при вызове справочной системы сразу открывалась страни
ца, связанная только с этой формой, необходимо выполнить указанные да-
лее действия.
У экранной формы есть свойство HeipContextiD. Присвоим данному свойст-
ву уникальное числовое значение, например 50. В метод init экранной
формы вставим следующий код: This.SetAll ("HeipContextiD",50). В ме
тоде обработки события click для кнопки Справка пропишем: Help ID
This.HeipContextiD.
Урок 23. Создание справочной системы . 325
Создание ЕХЕ-приложения
Параметры проекта
При создании проекта можно задать дополнительные параметры, такие как
фамилия разработчика, пиктограмма для исполняемого файла и т. д. Для
этого необходимо воспользоваться пунктом Project Info (Информация о
проекте) меню Project (Проект). Появится диалоговое окно, содержащее
дополнительную информацию о проекте — рис. 24.1.
Окно имеет три вкладки: Project (Проект), Files (Файлы) и Servers (Сер
веры).
В поля ввода вкладки Project заносится информация о разработчике; Author
(Ф.И.О. автора), Company (Наименование компании разработчика), Address
(Адрес), City (Город), Country (Страна), State (Штат, область), Postal code
(Почтовый индекс).
Ноте (Домашний каталог) позволяет указать месторасположение проекта,
флажок Attach icon (Определить значок) и кнопка Icon (Значок) создать
значок (иконку), при щелчке на котором будет запускаться наше приложе
ние. Флажок Debug info (Информация об отладке) позволяет включить в
исполняемый код отладочную информацию, а флажок Encrypted (Шифро
вание) включает механизм шифрования исполняемого кода проекта.
На вкладке Files (Файлы) (рис. 24.2) отображены все файлы, входящие в
наш проект. Файлы представлены в табличном виде, и чтобы упорядочить
их, например по имени, достаточно щелкнуть на заголовке Name (Имя).
Таким же образом файлы можно упорядочить по типу (Туре) или по дате
последнего редактирования (Last Modified). Файлы, включенные в проект
(Included), отмечены крестиком.
Опция Exclude
Такие компоненты приложения, как экранные формы, меню, программы
называются выполняемыми и должны быть включены в состав проекта при
помощи команды контекстного меню Include (Включить), что, кстати, и
происходит по умолчанию. С другой стороны, такие объекты, как индексы
и таблицы, являются компонентами невыполняемыми, и если их включить
в приложение, то они будут доступны только для чтения. Поэтому для таб
лиц необходимо использовать команду Exclude (Исключить) из того же кон
текстного меню (см. рис. 24.3). В принципе, включить или исключить из
приложения можно любой компонент. После исключения рядом с таким
компонентом появится перечеркнутый кружок (посмотри на наши табли-
цы...). Но при исключении компонента он не удаляется, просто ставится
пометка о его удалении. Для того чтобы окончательно очистить проект от
"ненужных" файлов, необходимо выполнить команду Clean Up Project
(Упаковать проект) из системного меню Project (Проект).
вом окне Build Options (Опции построения) (рис. 24.4), которое вызывается
при нажатии кнопки Build (Построить) в окне диспетчера проекта.
DO FORM MAIN
READ EVENTS
Это, как ты догадался, текст основной программы. Более того, если при за
вершении работы не отключить эту штуку, то возникнет еще более непри
ятная вещь — при завершении работы Windows появится сообщение
"Cannot quit Visual FoxPro" (Невозможно завершить работу Visual FoxPro)-
Урок 24. Создание ЕХЕ-приложения 333
Что теперь делать? Есть два способа. Первый — использовать всеми "люби
мое" сочетание клавиш <Ctrl>+<Alt>+<Del>. Второй, менее экзотиче
ский — обязательно включить строку CLEAR EVENTS перед командой QUIT,
которая завершает работу Visual FoxPro:
CLEAR EVENTS
QUIT
УРОК 25
Создание
установочных дисков
Теперь, когда приложение практически полностью готово, осталась самая
малость — каким-то образом предоставить его конечному пользователю.
Проблема частично решается, если у пользователя имеется Visual FoxPro —
достаточно переписать все необходимые файлы на дискеты и с торжествен
ным видом вручить их пользователю — работайте. А если Visual FoxPro не
установлен? В этом случае можно вместе с файлами приложения передать и
дискеты с файлами необходимых динамических библиотек Visual FoxPro, на
в этом случае придется долго растолковывать пользователю: как, куда и что
за чем ставить. Все это конечно, хорошо, но как говорится — "а ларчик
просто открывался..." Дело в том, что в состав Visual FoxPro входит замеча
тельное средство для создания дистрибутива — Setup Wizard (Мастер уста-
новки). Запускается этот хитрый механизм из меню Tools | Wizards | Setup
Wizard (Инструменты | Мастера | Мастер установки).
На первом шаге (рис. 25.1) необходимо указать, в каком каталоге находятся
файлы, включаемые в комплект поставки. Для выбора каталога необходимо
воспользоваться кнопкой, расположенной справа от поля ввода — при этом
откроется уже знакомое нам диалоговое окно Select Directory (Выбор папки).
На этом этапе (рис. 25.2) нужно указать, какие компоненты приложения
будут включены в комплект поставки. Если на компьютере пользователя
отсутствует среда Visual FoxPro, необходимо отметить флажок Visual FoxPro
runtime — при этом в комплект поставки будут включены необходимые
библиотеки. Если твое приложение использует элементы управления
Microsoft Graph 8.0, отметь соответствующий флажок. Если в приложений
используются компоненты ActiveX, файлы HTML-справки или доступ к
данным осуществляется с использованием драйверов ODBC, необходимо
отметить и эти флажки. Причем при установке данных флажков будут вы
ведены соответствующие диалоговые окна для выбора конкретных компо
нентов. Например, в случае использования элементов ActiveX появится та
кое окно — рис. 25.3.
Урок 25. Создание установочных дисков 335
Рассказать секрет? Ладно, все очень просто — нужно перед созданием про
граммы и запуском мастера закрыть окно диспетчера проекта. После по
вторного запуска все пройдет успешно и мы увидим окно статистики
(рис. 25.11).
В данном окне мы видим количество дискет, необходимых для распростра
нения нашего приложения. Для получения более подробной информации
нажмем кнопку Preview Report (Просмотр отчета) и в результате получим
подробнейший отчет — какой файл на каком диске и т. д. (рис. 25.12).
Программа установки Setup находится в каталоге Diskl (рис. 25.13).
А чтобы окончательно убедиться, что эта штука способна работать, мы про
сто запустим ее на выполнение (рис. 25.14—25.16).
340 Часть I. Процедурное программирование в Visual FoxPro
Объекты
А теперь, дружок, я тебя буду пугать страшными словами, без знания кото
рых у тебя ничего не получится, если ты вздумаешь заняться объектно-
ориентированным программированием. Слова следующие: объект или сущ
ность (entities), наследование (inheritance), инкапсуляция (encapsulation), поли
морфизм (polymorphism). Вот. Я думаю, ты уже привык к шуткам автора и
пугаться даже не собирался. И правильно сделал, потому что сейчас я тебе
постараюсь объяснить смысл этих "страшных" терминов и все станет ясно и
прозрачно. Начнем с понятия самого объекта.
Объект представляет собой всего-навсего совокупность данных и функций.
То есть он содержит как данные, так и функции — способы или методы
выполнения каких-то действий. Теперь отвлекись от монитора и посмотри
на обычный телевизор — чем не объект? Он имеет свойства (например,
уровень громкости, число принимаемых каналов, цвет корпуса, размер ки
нескопа и т. д.), он имеет свой интерфейс для "общения" с внешним ми
ром — это кнопки управления, а также он умеет выполнять некоторые дей
ствия — переключать каналы, увеличивать или уменьшать уровень яркости
изображения и т. д. Примерно такие же качественные характеристики имеет
и программный объект. Но внутри телевизора есть много чего такого, о чем
нам с тобой и знать не нужно: например, зачем нам в повседневной жизни
знать, каким образом происходит переключение каналов или на какой угол
отклоняется пучок электронов из пушки кинескопа? Работает, и ладно. Для
нас имеет значение только его средства общения с нами — кнопки, пере
ключатели, пульт дистанционного управления — в общем, все то, с по
мощью чего мы можем "заставить" объект выполнить те или иные действия.
Вот так незаметно мы и поняли суть сразу двух "страшных" слов — объекта
и инкапсуляции. Про объект ясно, а инкапсуляция? А про инкапсуляцию
ты только что прочитал — объект инкапсулирует, т. е. включает в себя (или
содержит в себе) всю необходимую информацию и набор функций, которые
и определяют его поведение.
346 Часть II. Объектно-ориентированное программирование
Классы
Прочитав предыдущий раздел, ты уяснил следующее: в Visual FoxPro можно
создавать объекты. А вот какой в этом практический смысл, наверное, пока
непонятно. Действительно, в чем преимущества нового метода — ведь если
для каждого приложения придется каждый раз создавать новые объекты —
где же тут обещанные комфорт, экономия времени и нервов? А вот именно
для этого и существуют такие штуки, как классы. Именно они и являются
той основой, при помощи которой создаются различные объекты.
Например, возьмем обычную тарелку. Ясно, что каждую тарелку никто не
делает индивидуально. На заводе существует какая-то пресс-форма или
шаблон, с помощью которой можно изготовить миллион одинаковых таре
лок. Улавливаешь аналогию? Правильно, точно так же никто не собирается
писать программный код для однотипных программных объектов — доста
точно создать класс (этакую пресс-форму), а затем "наштамповать" сколько
угодно объектов на основе данного класса. Причем все вновь созданные
объекты будут являться экземплярами этого класса. И эти вновь созданные
объекты унаследуют все методы, события и свойства, присущие классу-
родителю. Вот это и называется наследованием. Чтобы лучше понять, как это
происходит, рассмотрим наглядный пример.
Урок 26. Объекты 347
Вот и все, создана обычная форма да еще и зеленого цвета. Теперь, чтобы
посмотреть, как происходит процесс наследования, создадим объект на ос
нове вновь созданного класса:
Oform=CREATEOBJECT ("Myform")
Oform.SHOW(l)
DEFINE CLASS Myform AS FORM
Autocenter = .T.
Caption = "MYFORM"
Backcolor = RGB(0,255,0)
Name = "Myform"
ENDDEFINE
FormControls
Доступен из
Визуальный
подклассов
(видимый)
контейнер
создания
Имя класса Назначение
Класс-
Для
ActiveDoc Активный документ Нет Да Нет Нет
CheckBox Флажок Да Нет Нет Да
Column Столбец элемента управления G r i d Да Нет Да Да
ComboBox Раскрывающийся список Да Нет Нет Да
CommandButton Кнопка Да Нет Нет Да
CommandGroup Группа командных кнопок Да Нет Да Да
Container Контейнер Да Да Да Да
Control Базовый визуальный класс. "Похож" Да Да Да Нет
на Container, но извне можно обра
щаться только к этому классу, а не
к содержащимся в нем объектам
Cursor Определение курсора в среде дан Нет Нет Нет Нет
ных
Custom Базовый невизуальный класс. Можно Нет Да Нет Нет
использовать в качестве суперкласса
для создания собственных
DataEnvironment Совокупность курсоров и отношений Нет Нет Да Нет
EditBox Поле редактирования Да Да Нет Да
Form Экранная форма Да Да Да Да
FormSet Набор экранных форм Нет Да Да Да
Grid Таблица Да Да Да Да
Header Заголовок столбцов таблицы Да Нет Нет Нет
HyperLynk Гиппересылка Да Да Нет Да
Object
ForrnControls
Доступен из
Визуальный
подклассов
(видимый)
контейнер
создания
Имя класса Назначение
Класс-
Для
Line Линия Да Да Нет Да
ListBox Список Да Да Нет Да
decontrol Элемент управления Нет Да Да Да
OptionButton Переключатель Да Нет Нет Да
OptionButton Группа переключателей Да Да Да Да
Page Вкладка формы Да Нет Да Нет
PageFrame Набор вкладок Да Да Да Да
ProjectHook Проект Нет Нет Да Нет
Relation Отношение между курсорами Нет Нет Нет Нет
Separator Разделитель Да Нет Нет Да
Shape Контур Да Нет Нет Да
Spinner Счетчик Да Нет Нет Да
TextBox Поле ввода Да Нет Нет, Да
Timer Таймер Нет Нет Нет Да
ToolBar Панель инструментов Да Да Да Нет
Композитные классы
Композитными называются такие классы, которые содержат в себе объекты,
созданные на основе других классов. Иначе их называют классы-
контейнеры. Наша зеленая экранная форма также является классом-
контейнером, и сейчас мы рассмотрим, каким образом можно добавить в
этот класс объект из другого класса. Один из способов — использование
команды ADD OBJECT, которая имеет следующий синтаксис:
ADD OBJECT имя_объекта AS имя__класса
WITH переменная=зиачение
350 Часть II. Объектно-ориентированное программирование
Создание классов
в Class Designer
Для создания классов в Visual FoxPro можно использовать два способа: пи-
сать программный код (что мы делали ранее) или (что гораздо удобнее)
воспользоваться услугами специального конструктора — Class Designer.
Этот инструмент очень похож на уже знакомый нам Form Designer (Конст-
руктор форм), но он имеет некоторые отличия — в частности, в меню до
бавлен пункт Class (Класс) — рис. 27.1.
Пример 1 — калькулятор
Сейчас мы попробуем сделать простейший калькулятор. Итак, нам понадо
бятся: экранная форма, поле ввода и два класса кнопок. После того, как мы
должным образом сгруппируем эти объекты, у нас получится симпатичный
и даже более или менее работающий калькулятор. На экранной форме мы
останавливаться не станем — можешь сделать ее какую хочешь, только раз
мести на ней два поля ввода. А вот на кнопочках остановимся подробнее:
все-таки новые классы создаем...
Для начала создадим класс цифровых кнопок и назовем его DigitButto
(рис. 27.4).
Сам класс DigitButton довольно "примитивен" (листинг 27.2).
Урок 27. Создание классов в Class Designer 355
Теперь вернемся к нашей экранной форме и создадим для нее новое свой
ство орег. Как это делается, мы еще не "проходили", вот заодно и научимся.
Дело в том, что, помимо базовых свойств (это те, которые отображены в
диалоговом окне Properties (Свойства)), практически для любого объекта
можно задать новые свойства и методы. Для этого нужно выбрать пункт
356 Часть II. Объектно-ориентированное программирование
New Property (Новое свойство) меню Form (Форма) в окне Form Designer
(Конструктор форм). На экране появится окно New Property (Новое свойст
во) — рис. 27.5.
Теперь создадим еше один класс кнопок, по нажатию которых будет произ
водиться то или иное математическое действие, и назовем его OperButton.
Код такой кнопки представлен в листинге 27.3.
Все, теперь остается разместить наши кнопки на экранной форме. Для это
го нужно нажать кнопку View Classes (Просмотр классов) на панели инст
рументов Form Controls (Элементы управления экранной формы) и в рас
крывшемся меню выбрать пункт Add (Добавить). После чего в открывшемся
диалоговом окне указать нашу библиотеку классов — рис. 27.7.
Получится следующее — рис. 27.8.
Теперь дело за малым — расположить наши объекты на форме, да в методе
init формы прописать следующее: PUBLIC LASTVALUE — рис. 27.9.
А как же получить результат? Придется поработать над событием click для
соответствующей кнопки "=" (листинг 27.4).
IF THISFORM.OPER="+"
THISFORM.TEXTl.VALUE=STR(VAL(THISFORM.TEXTl.VALUE)+VAL(LASTVALUE),20,2)
THISFORM.TEXT2.VALUE=THISFORM.TEXT2.VALUE+"="+
ALLTR(THISFORM.TEXTl.VALUE)
ENDIF
IF THISFORM.OPER="-"
THISFORM.TEXTl.VALUE=STR(VAL(LASTVALUE)-VAL(THISFORM.TEXTl.VALUE),20,2)
358 Часть II. Объектно-ориентированное программирование
THISFORM.TEXT2.VALUE=THISFORM.TEXT2.VALUE+"="+
ALLTR(THISFORM.TEXT1.VALUE)
ENDIF
I F THISFORM.OPER="*"
THISFORM.TEXT1.VALUE=STR(VAL(LASTVALUE)*
VAL(THISFORM.TEXT1.VALUE),20,2) -
THISFORM.TEXT2.VALUE=THISFORM.TEXT2.VALUE+"="+
ALLTR(THISFORM.TEXT1.VALUE)
ENDIF
IF THISFORM.OPER='7"
THISFORM.TEXT1.VALUE=STR(VAL(LASTVALUE)/VAL(THISFORM.TEXT1.VALUE),20,2)
THISFORM.TEXT2.VALUE=THISFORM.TEXT2.VALUE+"="+
ALLTR(THISFORM.TEXT1.VALUE)
ENDIF
G J ^ H H H I ШЯШШШШШЯШ^ШШШШШШЧШ
Папка: | iQ calc д|. : Ф3 IS & Ш"
Рис. 27.9. Наш суперкалькулятор почти готов! Рис. 27.10. Ура! Получилось!
Пример 2 — Puzzle
Когда-то, давным-давно, в FoxPro for DOS имелась встроенная простенькая
игрушка Puzzle (Пазл), более известная в нашей стране как "Пятнашки".
Смысл был такой: щелкая мышью, расположить цифры в порядке возраста
ния от 1 до 15. Не знаю, почему, но в Visual FoxPro такой игры нет. Зато
мы можем, опираясь на только что полученные знания, соорудить нечто
подобное самостоятельно. Например, игрушку вот с таким игровым по
лем — рис. 27.11.
Или вот с таким — рис. 27.12.
Рис. 27.11. "Классический" Puzzle Рис. 27.12. А это уже наша самодельная игрушка
360 Часть II. Объектно-ориентированное программирование
Мне кажется, ты не станешь думать, что я обе эти экранные формы "сотво
рил" в Form Designer (Конструктор форм), расставил кнопки (81 шт!), напи
сал для каждой кнопки обработчик щелчка мыши и т. д.? Правильно, все
это делает одна-единственная программка, размером 4 Кбайта! Сейчас по
смотрим ее код (листинг 27.5), а затем подробно разберем, как там все ра
ботает.
***************************** *pn2ZLE**************************
**********************ди>рр}Орч. DMITRY SHAPOREV*****************
STARTPUZZLE=CREATEOBJECT("STARTPUZZLE")
STARTPUZZLE.SHOW(1)
HEIGHT = 27,;
WIDTH = 60, ;
CAPTION = "ВЫХОД",;
NAME = "COMMANDl"
PROCEDURE TEXT1.VALID
IF EMPTY(THIS.VALUE)
RETURN it.
END IF
IF VAL(THIS.VALUE)<4
RETURN .F.
ENDIF
IF VAL(THIS.VALUE)>9
RETURN .F.
ENDIF
ENDPROC
PROCEDURE C0MMAND2.CLICK
PUBLIC NLEVEL
NLEVEL=VAL(THISFORM.TEXT1.VALUE)
**********************
**********************
#DEFINE COUNT_OF_ITEMS NLEVEL*NLEVEL
LOCAL ARRAY LARAND[COUNT_OF_ITEMS]
LOCAL ARRAY LATEMP[COUNT_OF_ITEMS]
LOCAL I,J, N
RAND(-l)
N=COUNT_OF_ITEMS
FOR 1=1 TO COUNT_OF_ITEMS
LATEMP[I]=1-1
ENDFOR
FOR 1=1 TO COUNT_OF_ITEMS
J=INT(RAND()*N)+1
LARAND[I]=LATEMP[J]
=ADEL(LATEMP,J)
N=N-1
ENDFOR
FOR 1=1 TO COUNT_OF_ITEMS
ENDFOR
**********************
**********************
************************************************************************
PUZZLE=CREATEOBJECT("FORM")
PUZZLE.CAPTION="FOXPUZZLE"
DL=30
WT=30
FOR F = l TO NLEVEL
FOR D=l TO NLEVEL
PUZZLE.ADDOBJECT("PZ"+ALLTR(STR(D))+ALLTR(STR(F)), "PUZZLEBUTTON")
M1="PZ"+ALLTR(STR(D))+ALLTR(STR(F))+".VISIBLE"
M2="PZ"+ALLTR(STR(D))+ALLTR(STR(F))+".LEFT"
M3="PZ"+ALLTR(STR(D))+ALLTR(STR(F))+".WIDTH"
M4="PZ"+ALLTR(STR(D))+ALLTR(STR(F))+".TOP"
M5="PZ"+ALLTR(STR(D))+ALLTR(STR(F))+".CAPTION"
PUZZLE.&M4=(F)*WT
PUZZLE.&M2=DL*(D-1)
PUZZLE.&M1=.T.
PUZZLE.&M3=DL
PUZZLE.WIDTH=DL*D
PUZZLE.HEIGHT=WT*(F+2)
ENDFOR
ENDFOR
1=0
FOR R = l TO NLEVEL
FOR K=l TO NLEVEL
M5="PZ"+ALLTR(STR(R))+ALLTR(STR(K))+".CAPTION"
1=1+1
PUZZLE.&M5=ALLTR(STR(LARAND(I)))
ENDFOR
ENDFOR
PUZZLE.AUTOCENTER=.T.
PUZZLE.SHOW(1)
ENDPROC
Урок 27. Создание классов в Class Designer 363
PROCEDURE COMMANDl.CLICK
THISFORM.RELEASE()
ENDPROC
ENDDEFINE
*— ENDDEFINE: PUZZLE
***********************************************************************
DEFINE CLASS PUZZLEBUTTON AS COMMANDBUTTON
HEIGHT = 2 7
WIDTH = 84
CAPTION = ""
NAME = "PUZZLEBUTTON"
PROCEDURE CLICK
THISNAME=THIS.CAPTION
DIGIT_PART=INT(VAL(RIGHT(THIS.NAME,2)))
IF
TYPE("THISFORM."+"PZ"+ALLTR(STR(DIGIT_PART+1))+".NAME")="C"
NEXTNAME="THISFORM."+"PZ"+ALLTR(STR(DIGIT_PART+1))+".CAPTION"
IF &NEXTNAME="0"
THIS.CAPTION=&NEXTNAME
&NEXTNAME=THISNAME
ENDIF
ENDIF
************************************************************************
IF TYPE("THISFORM."+"PZ"+ALLTR(STR(DIGIT_PART-
1))+".NAME")="C"
NEXTNAME="THISFORM."+"PZ"+ALLTR(STR(DIGIT_PART-1))+".CAPTION"
IF &NEXTNAME="0"
THIS.CAPTION=&NEXTNAME
&NEXTNAME=THISNAME
ENDIF
ENDIF
********************
IF
TYPE("THISFORM."+"PZ"+ALLTR(STR(DIGIT_PART+10))+".NAME")="C"
NEXTNAME="THISF0RM."+"PZ"+ALLTR(STR(DIGIT_PART+10))+".CAPTION"
IF &NEXTNAME="0"
THIS.CAPTION=&NEXTNAME
&NEXTNAME=THISNAME
ENDIF
ENDIF
364 Часть II. Объектно-ориентированное программирование
********************
IF TYPE("THISFORM."+"PZ"+ALLTR(STR(DIGIT_PART-10))+".NAME")="C"
NEXTNAME="THISFORM."+"PZ"+ALLTR(STR(DIGIT_PART-10))+".CAPTION"
IF &NEXTNAME="0"
THIS.CAPTION=&NEXTNAME
&NEXTNAME=THISNAME
ENDIF
ENDIF
ENDPROC
ENDDEFINE
Вот и вся программка. Теперь давай разбираться, чего мы тут с тобой насо
чиняли. Для этого разобьем текст программы на несколько блоков.
"Блок 1" — создаем объект на базе класса, производного от класса формы
(листинг 27.6).
STARTPUZZLE=CREATEOBJECT("STARTPUZZLE")
STARTPUZZLE.SHOW(1)
LEFT = 37,;
TOP - 24, f •
WIDTH = 100,;
NAME = "TEXT1"
PROCEDURE TEXT1.VALID
IF EMPTY(THIS.VALUE)
RETURN .F.
ENDIF
IF VAL(THIS.VALUE)<4
RETURN .F.
ENDIF
IF VAL(THIS.VALUE)>9
RETURN .F.
ENDIF
ENDPROC
PROCEDURE COMMAND2.CLICK
PUBLIC NLEVEL && Это - уровень сложности, а если проще -
количество кнопок
NLEVEL=VAL(THIS FORM.ТЕХТ1.VALUE)
ENDDEFINE
366 Часть II. Объектно-ориентированное программирование
PUZZLE=CREATEOBJECT("FORM")
PUZZLE.CAPTION="FOXPUZZLE"
DL=30
WT=30
FOR F=l TO NLEVEL
FOR D=l TO NLEVEL
PUZZLE.ADDOBJECT("PZ"+ALLTR(STR(D))+ALLTR(STR(F)) , "PUZZLEBUTTON")
M2="PZ"+ALLTR(STR(D) ) +ALLTR(STR(F) J +".LEFT"
M1="PZ"+ALLTR(STR(D))+ALLTR(STR(F))+".VISIBLE"
M3="PZ"+ALLTR(STR(D))+ALLTR(STR(F))+".WIDTH"
M4="PZ"+ALLTR(STR(D))+ALLTR(STR(F))+".TOP"
M5="PZ"+ALLTR(STR(D) )+ALLTR(STR(F) )+".CAPTION"
Урок 27. Создание классов в Class Designer 367
PUZZLE.&M4=(F)*WT
PUZZLE.&M2=DL*(D-1)
PUZZLE.&M1=.T.
PUZZLE.&M3=DL
PUZZLE.WIDTH=DL*D
PUZZLE.HEIGHT=WT*(F+2)
ENDFOR
ENDFOR
1=0
FOR R * l TO NLEVEL
FOR K=l TO NLEVEL
M5=-"PZ"+ALLTR (STR(R))+ALLTR(STR(K))+".CAPTION"
1=1+1
PUZZLE.&M5=ALLTR(STR(LARAND(I)))
ENDFOR
ENDFOR
PUZZLE.AUTOCENTER=.T.
PUZZLE.SHOW(1)
ENDPROC
PROCEDURE COMMAND1.CLICK
THISFORM.RELEASE()
ENDPROC
ENDDEFINE
PROCEDURE CLICK
THISNAME=THIS.CAPTION
DIGIT_PART=INT(VAL(RIGHT(THIS.NAME,2)))
I F TYPE("THISFORM."+"PZ"+ALLTR(STR(DIGITJPART+1))+".NAME")="C"
NEXTNAME="THISFORM."+"PZ"+ALLTR(STR(DIGIT PART+1))+".CAPTION"
368 Часть II. Объектно-ориентированное программирование
IF &NEXTNAME="0"
THIS.CAPTION=&NEXTNAME
&NEXTNAME=THISNAME
ENDIF
ENDIF
*********************************************************************
,
IF TYPE("THISF0P^."V PZ"+ALLTR(STR(DIGITJ>ART-1))V\NAME")="C"
NEXTNAME="THISFORM."+"PZ"+ALLTR(STR(DIGIT_PART-1))+".CAPTION"
IF &NEXTNAME="0"
THIS.CAPTION=&NEXTNAME
&NEXTNAME=THISNAME
ENDIF
ENDIF
**************
IF TYPE("THISFORM."+"PZ"+ALLTR(STR(DIGIT_PART+10))+".NAME")="C"
NEXTNAME="THISFORM."+"PZ"+ALLTR(STR(DIGIT_PART+10))+".CAPTION"
IF &NEXTNAME="0"
THIS.CAPTION=&NEXTNAME
&NEXTNAME=THISNAME
ENDIF
ENDIF
***************
IF TYPE("THISFORM."+"PZ"+ALLTR(STR(DIGIT_PART-10))+".NAME")="C"
NEXTNAME="THISFORM."+"PZ"+ALLTR(STR(DIGIT_PART-10))+". CAPTION"
IF &NEXTNAME="0"
THIS.CAPTION=&NEXTNAME
&NEXTNAME=THISNAME
ENDIF
ENDIF
ENDPROC
ENDDEFINE
Наиболее важным для нас является событие click, наступающее при щелч
ке мышью на объекте. Но и тут ничего сложного: просто с помощью функ
ции TYPE о , возвращающей переменную, обозначающую тип объекта, мы
проверяем — а есть ли вообще "соседние" объекты у нашей кнопки? Если
есть, производим проверку надписи соседнего объекта. Если надпись "0", то
просто меняем надписи на этих двух кнопках между собой. Вот и все. Ко
нечно, это не готовая игрушка, а просто учебный пример, показывающий
тебе удобство использования объектно-ориентированного программирова
ния. Для полноценной игрушки неплохо бы добавить процедуру провер-
Урок 27. Создание классов в Class Designer 369
THIS.SHAPE1.WIDTH=THIS.WIDTH-2
THIS.SHAPE1.HEIGHT=THIS.HEIGHT-2
"Первая"
GO TOP
__SCREEN.ACTIVEFORM.REFRESH()
"Следующая"
IF EOF()
=MESSAGEBOX("Последняя запись", "Конец файла")
ELSE
SKIP
_SCREEN.ACTIVEFORM.REFRESH()
ENDDIF
372 Часть II. Обьектно-ориентированное программирование
"Предыдущая"
IF BOFO
=MESSAGEBOX("Первая з а п и с ь " , "Начало файла")
ELSE
SKIP-1
_SCREEN.ACTIVEFORM.REFRESH()
ENDIF
"Последняя"
GO BOTTOM
SCREEN.ACTIVEFORM.REFRESH()
PROCEDURE COMMANDl.CLICK
GO TOP
_SCREEN. ACTIVE FORM. REFRESH ()
ENDPROC
PROCEDURE COMMAND2.CLICK
374 Часть II. Объектно-ориентированное программирование
IF EOF() = .T.
=MESSAGEBOX("ПОСЛЕДНЯЯ ЗАПИСЬ", "КОНЕЦ ФАЙЛА")
ELSE
SKIP
_SCREEN.ACTIVEFORM.REFRESH()
ENDIF
ENDPROC
PROCEDURE COMMAND3.CLICK
IF BOF()
=MESSAGEBOX("ПЕРВАЯ ЗАПИСЬ", "НАЧАЛО ФАЙЛА")
ELSE
SKIP-1
_SCREEN.ACTIVEFORM.REFRESH()
ENDIF
ENDPROC
PROCEDURE COMMAND4.CLICK
GO BOTTOM
_SCREEN.ACTIVEFORM.REFRESH()
ENDPROC
ENDDEFINE
*
*— ENDDEFINE: NAVIGATOR
Листинг 2 7 . 1 2 . К л а с с ShadowTextBox
********************************************************************
*-- CLASS: MYPROGRESS (C:\CALC\MYLIB.VCX)
*— PARENTCLASS: CONTAINER
*— BASECLASS: CONTAINER
*
DEFINE CLASS MYPROGRESS AS CONTAINER
WIDTH = 4 0 2
HEIGHT =40
BACKSTYLE m 0
BORDERWIDTH = 2
SPECIALEFFECT = 1
NAME = "MYPROGRESS"
PROCEDURE INIT
THIS.LABEL1.LEFT=THIS.WIDTH/2-THIS.LABELl.WIDTH/2
THIS.LABELl.TOP=THIS.HEIGHT/2-THIS.LABELl.HEIGHT/2
THIS.CONTAINERl.WIDTH=0
THIS.CONTAINERl.HEIGHT=THIS.HEIGHT
ENDPROC
Урок 27. Создание классов в Class Designer 379
PROCEDURE LABEL1.INIT
THIS.CAPTION="0%"
ENDPROC
ENDDEFINE
*— ENDDEFINE: MYPROGRESS
********************************************************************
Использование таймера
LEFT = 252, ;
HEIGHT = 23,;
WIDTH = 23,;
INTERVAL = 2000,;
NAME = "TIMER1"
ADD OBJECT IMAGE1 AS IMAGE WITH;
PICTURE = "..\PROGRAM FILES\MICROSOFT VISUAL
^STUDIO\VFP98\FOX.BMP", ;
STRETCH = 1,;
HEIGHT - 48,;
LEFT = 300,;
TOP = 72,;
WIDTH - 84,;
NAME = "IMAGE1"
ADD OBJECT LABEL2 AS LABEL WITH;
AUTOSIZE = .T.,;
FONTBOLD = .T.,;
FONTSIZE = 22, ;
BACKSTYLE = 0, ;
CAPTION - "THE OLD FOX HOTEL",;
HEIGHT = 37, ;
LEFT = 65,;
TOP = 81,;
WIDTH = 251,;
FORECOLOR = RGB(255,255, 255) , ;
NAME = "LABEL2"
ADD OBJECT IMAGE2 AS IMAGE WITH;
PICTURE = "..\PROGRAM FILES\MICROSOFT VISUAL
4>STUDIO\VFP98\FOX.BMP",;
STRETCH = 1,;
HEIGHT = 48,;
LEFT = 0,;
TOP = 72,;
WIDTH = 84,;
NAME ш "IMAGE2"
PROCEDURE TIMER1.TIMER
THISFORM.RELEASE()
ENDPROC
ENDDEFINE
*
*— ENDDEFINE: SPLASH
ды после своего запуска. Еще один пример — "бегущая" строка. Для создания
эффекта "бегущей" строки создадим класс на основе контейнера (рис. 28.3).
Что-то новенькое, да? Я имею в виду PARENT. А на самом деле все просто:
PARENT — это ссылка на объект, в состав которого входит наш элемент
управления. В данном случае мы ссылаемся на наш контейнер. Теперь ос
талось только установить желаемую скорость прокрутки (меняя значения
свойства interval) и можно применять данный класс в любой экранной
форме.
Код созданного класса представлен в листинге 28.2.
*— PARENTCLASS: CONTAINER
*— BASECLASS: CONTAINER
DEFINE CLASS RUNNING_STRING AS CONTAINER
WIDTH = 647
HEIGHT = 2 1
NAME = "MYCLASS"
ADD OBJECT LABELl AS LABEL WITH;
CAPTION = "LABELl",;
HEIGHT = 17,;
LEFT = 120,;
TOP = 4, ;
WIDTH = 4 0, ;
NAME = "LABELl"
384 Часть II. Объектно-ориентированное программирование
D0CREATE - .Т.
B0RDERSTYLE = О
CAPTION = "FORM1"
TITLEBAR = О
BACKCOLOR = RGB(0,0,0)
HOUR = О
MINUTES = О
SEC = О
NAME = "F0RM1"
ADD OBJECT TIMERl AS TIMER WITH;
TOP = 48,;
LEFT = 120,;
HEIGHT = 23, ;
WIDTH = 23,;
INTERVAL = 1000,;
NAME = "TIMERl"
ADD OBJECT LABEL1 AS LABEL WITH;
AUTOSIZE = .T.,;
FONTITALIC = .T.,;
FONTSIZE - 28,;
ALIGNMENT = 2,;
CAPTION = "",;
HEIGHT » 46,;
LEFT = 125, ;
TOP = 2, ;
WIDTH = 2,;
FORECOLOR = RGB(255,255, 255) , ;
BACKCOLOR = RGB(0,0,0),;
NAME = "LABELl"
ADD OBJECT CCMMANDl AS COMMANDBUTTON WITH;
TOP = 48,;
LEFT = 4,;
HEIGHT = 27,;
WIDTH = 60,;
CAPTION = "ПАУЗА",;
NAME = "COMMAND1"
ADD OBJECT COMMAND2 AS COMMANDBUTTON WITH;
TOP = 48,;
LEFT = 68,;
HEIGHT = 27,;
WIDTH = 57,;
CAPTION - "ЗАПУСК",;
NAME = "CCMMAND2"
386 Часть II. Объектно-ориентированное программирование
THISFORM.LABEL1.CAPTION=ALLTR(STR(HR))+":"+ALLTR(STR(MINUTES))+;
":"+ALLTR(STR(NSECONDS))
IF MINUTES=60
MINUTES=0
HR=HR+1
THISFORM.LABEL1.CAPTION=ALLTR(STR(HR))+":"+ALLTR(STR(MINUTES))+;
":"+ALLTR(STR(NSECONDS))
ENDIF
******************************
IF HR=24
HR=0
NSECONDS=0
MINUTES=0
Урок 28. Использование таймера 387
THISFORM. LABEL1.CAPTI0N==ALLTR(STR(HR))+":"+ALLTR(STR(MINUTES))+;
":"+ALLTR(STR(NSECONDS))
END IF
ENDPROC
PROCEDURE COMMAND1.CLICK
THISFORM.TIMER1.INTERVAL=0
ENDPROC
PROCEDURE COMMAND2.CLICK
THISFORM.TIMER1.INTERVAL=1000
ENDPROC
PROCEDURE COMMAND3.CLICK
THISFORM. TIMER1. INTERVALS
THISFORM.LABEL1.CAPTION="0:0:0"
MINUTES=0
HR=0
NSECONDS=0
ENDPROC
PROCEDURE COMMAND4.CLICK
THISFORM.RELEASE()
ENDPROC
ENDDEFINE
*
*— ENDDEFINE: SWATCH
Все хорошо, но не смущает ли тебя тот факт, что кнопки нашего MessageBox
сделаны не на основе уже знакомого нам базового класса CommanddButton, a
390 Часть II. Объектно-ориентированное программирование
Как поместить в свойства формы массив? Точно так же, как и обычные пе
ременные — рис. 29.4.
Теперь нашу форму необходимо "оснастить" новым методом Recurs. Его код
представлен в листинге 29.3.
LPARAMETERS OOBJ, LP
LOCAL NTOTMEM,I,AMEMS[1],М1
Ml - 7
WITH OOBJ
IF THISFORM.NAME # .NAME OR THISFORM.BASECLASS # .BASECLASS
IF TYPE("OOBJ.TOP") - "N" OR TYPE("OOBJ.HEIGHT") - "N";
OR TYPE("OOBJ.LEFT") - "N" OR TYPE("OOBJ.WIDTH") = "N";
OR TYPE("OOBJ.FONTSIZE") - "N"
THISFORM.NKOLM = THISFORM.NKOLM + 1
IF !LP
DIMENSION THISFORM.AMAS[THISFORM.NKOLM,Ml]
IF TYPE("OOBJ.TOP") = "N"
THISFORM.AMAS[THISFORM.NKOLM,1] =COBJ.TOP
ENDIF
IF TYPE("OOBJ.HEIGHT") = "N"
THISFORM.AMAS[THISFORM.NKOLM,2] = OOBJ.HEIGHT
ENDIF
IF TYPE("OOBJ.LEFT") = "N"
THISFORM.AMAS[THISFORM.NKOLM,3] = OOBJ.LEFT
ENDIF
IF TYPE("OOBJ.WIDTH") = "N"
THISFORM.AMAS[THISFORM.NKOLM,4] = OOBJ.WIDTH
ENDIF
IF TYPE("OOBJ.HEADERHEIGHT") = "N"
THISFORM.AMAS[THISFORM.NKOLM,5] =OOBJ.HEADERHEIGHT
ENDIF
IF TYPE("OOBJ.ROWHEIGHT") = "N"
THISFORM.AMAS[THISFORM.NKOLM, 6] = OOBJ.ROWHEIGHT
ENDIF
IF TYPE("OOBJ.FONTSIZE") = "N"
THISFORM.AMAS[THISFORM.NKOLM,7] =OOBJ.FONTSIZE
ENDIF
ELSE
IF TYPE("OOBJ.TOP") = "N"
OOBJ.TOP = THISFORM.AMAS[THISFORM.NKOLM,1]*THISFORM.NKOFH
ENDIF
IF TYPE("OOBJ.HEIGHT") = "N"
OOBJ.HEIGHT = THISFORM.AMAS[THISFORM.NKOLM,2]*THISFORM.NKOFH
ENDIF
I F TYPE("OOBJ.LEFT") = " N "
OOBJ.LEFT = THISFORM.AMAS[THISFORM.NKOLM,3]*THISFORM.NKOFW
ENDIF
Урок 29. Создание экранных форм на основе пользовательских классов 393
IF TYPEC'OOBJ.FONTSIZE") = "N"
IF (THISF0RM.AMAS[THISF0RM.'NK0LM,7]*THISTORM.NK0FH)-THISF0RM.NDELTA > 4
OOBJ.FONTSIZE = (THISFORM.AMAS[THISFORM.NKOLM,7]*THISFORM.NKOFH)-
THISFORM.NDELTA
ELSE
OOBJ.FONTSIZE = 4
THISFORM.NDELTA = THISFORM.NDELTA - 1
ENDIF
ENDIF
IF TYPE("OOBJ.WIDTH") = "N"
IF (OOBJ.BASECLASS ="LABEL" AND !.WORDWRAP);
OR OOBJ.BASECLASS ="CHECKBOX"
IF (TXTWIDTH(OOBJ.CAPTION,OOBJ.FONTNAME,OOBJ.FONTSIZE))*;
FONTMETRIC(6,OOBJ.FONTNAME,OOBJ.FONTSIZE) > OOBJ.WIDTH
THISFORM.NB1 = 1
THISFORM.NB2 = 0
ENDIF
IF (TXTWIDTH(OOBJ.CAPTION,OOBJ.FONTNAME,OOBJ.FONTSIZE+1)) *;
FONTMETRIC(6,OOBJ.FONTNAME,OOBJ.FONTSIZE+1) > OOBJ.WIDTH
THISFORM.NB2 = 0
ENDIF
ENDIF
OOBJ.WIDTH = THISFORM.AMAS[THISFORM.NKOLM,4]*THISFORM.NKOFW
ENDIF
IF TYPEC'OOBJ.HEADERHEIGHT") = "N"
OOBJ.HEADERHEIGHT = THISFORM.AMAS[THISFORM.NKOLM,5]*THISFORM.NKOFH
ENDIF
IF TYPE("OOBJ.ROWHEIGHT") = "N"
OOBJ.ROWHEIGHT = THISFORM.AMAS[THISFORM.NKOLM,6]*THISFORM.NKOFH
ENDIF
ENDIF
ENDIF
ENDIF
NTOTMEM = AMEMBERS(AMEMS,OOBJ,2)
FOR I = 1 TO M.NTOTMEM
OOBJ = EVAL("."+AMEMS[M.I])
IF TYPE("."+AMEMS[M.I]) = "0"
THISFORM.RECURS(OOBJ, LP)
ENDIF
ENDFOR
ENDWITH
Для этого необходимо вызвать пункт New Method (Новый метод) из систем
ного меню Form (Форма), в диалоговом окне указать имя метода и нажать
394 Часть (I. Объектно-ориентированное программирование
А В метод Resize:
THISFORM.NKOFH = THISFORM.HEIGHT/THISFORM.FIRSTHEIGHT
THISFORM.NKOFW = THISFORM.WIDTH/THISFORM.FIRSTWIDTH
THISFORM.NKOLM = 0
THISFORM.NB1 = 0
THISFORM.NB2 = 1
THISFORM.RECURS(THISFORM, .T.)
IF (THISFORM.NB2 > 0 AND THISFORM.NDELTA > 0);
OR (THISFORM.NB1 > 0)
THISFORM.NDELTA = THISFORM.NDELTA + THISFORM.NB1
THISFORM.NDELTA = THISFORM.NDELTA - THISFORM.NB2
ENDIF
Создание
панели инструментов
Класс TooiBar (Панель инструментов) представляет собой разновидность
экранной формы. Обычно он включает в себя такие элементы управления,
как командные кнопки, но в данный контейнер, как и в форму, можно
включить все, что угодно.
Создаем свою панель — рис. 30.1.
PROCEDURE COMMAND2.CLICK
IF !EOF()
SKIP
_SCREEN.ACTIVEFORM.REFRESH()
ENDIF
ENDPROC
PROCEDURE COMMAND4.CLICK
IF !EOF()
GO BOTTOM
_SCREEN.ACTIVEFORM.REFRESH()
ENDIF
ENDPROC
PROCEDURE COMMAND3.CLICK
IF !BOF()
SKIP -1
_SCREEN.ACTIVEFORM.REFRESH()
ENDIF
ENDPROC
ENDDEFINE
Управление классами
Class Browser
В Visual FoxPro имеется удобное средство, с помощью которого можно ра
ботать с классами: создавать новые, редактировать существующие, а также
просматривать библиотеки классов. Называется оно Class Browser (Браузер
классов). Открыть его можно двумя способами: в системном меню Tools
(Инструменты) выбрать команду Class Browser (Браузер классов) или на
брать в командном окне: DO (BROWSER) . Каким бы способом мы его не вы
зывали, результат будет один — рис. 31.1.
При щелчке правой кнопкой мыши на окне Class Browser (Браузер классов)
открывается контекстное меню — рис. 31.2.
Описание команд контекстного меню приведено в табл. 31.2.
Урок 31. Управление классами 403
Команда Описание
Команда Описание
Информация о классе
и пиктограмма класса
Для просмотра информации о классе используется диалоговое окно Class
Info (Информация о классе) (рис. 31.3). Оно вызывается с помощью одно
именной команды из меню Class.
Данное окно содержит две вкладки: Class (Класс) и Members (Члены). На
вкладке Class (Класс) мы можем указать значок (пиктограмму) для каждого
класса. Вернее, значка там можно указать два: один в поле ввода Toolbar
icon (Значок на панели инструментов) — данный значок будет отображаться
на панели инструментов Form Controls, а другой — в поле Container icon
(Значок контейнера) — он будет отображаться в окне Class Browser. He
знаю, как насчет второго, а вот первый рекомендую указывать — ты ведь
уже заметил, что все однотипные объекты твоей библиотеки отображаются
на панели инструментов одинаковыми значками и определить, "кто есть
Урок 31. Управление классами 405
Фундаментальные классы
Visual FoxPro
Конечно, хорошо самому писать различные классы — есть чем и народ уди
вить, и себя показать... Но! Зачем "изобретать велосипед"? Ведь наивно бы
ло бы думать, что, допустим, класс командной кнопки, которая осуществля
ет единственное действие — закрытие экранной формы — придумали вчера.
Нет, конечно. Все эти базовые или фундаментальные классы изобретены
давным-давно. Нам же остается их где-то взять и уметь применять в своих
приложениях. А где их взять? Подсказываю три возможных варианта.
• Купить.
• Украсть (карается законом!).
• Использовать библиотеки фундаментальных классов, входящих в ком
плект поставки Visual FoxPro.
Вот третий вариант и обсудим. В Visual FoxPro есть набор библиотек клас
сов, которые могут быть использованы в наших приложениях для решения
большинства основных задач.
Хранится все это "добро" в обычных файлах с расширением vex, а каталог,
где все это "лежит", так и называется Foundation Classes (Фундаментальные
классы). Какие же такие "хитрые" классы и библиотеки приготовили для
нас отцы-основатели нашего Лиса? Ответ на этот вопрос — в табл. 32.1.
Название
Название класса Описание класса
библиотеки
About Dialog _dialogs.vcx Включает в приложение стандартное
диалоговое окно About
ActiveX Calendar _datetime.vcx Позволяет включить в форму календарь
Application Registry.vcx Операции, связанные с реестром Win
Registry dows
408 Часть //. Объектно-ориентированное программирование
Название
Название класса Описание класса
библиотеки
Array Handler jjtility.vcx Операции с массивами, недоступные
при использовании стандартных средств
Cancel Button _miscbtns.vcx Кнопка Cancel (Отмена), закрывающая
экранную форму
Clock _datetime.vcx Выводит в экранную форму текущее
время
C o n f l i c t Catcher _dataqwery.vcx Диалоговое окно, в котором показаны
конфликтные значения при редактиро
вании данных
Cookies Class Jntenet.vcx Используется в качестве FoxISAPI
Cross Tab _utility.vcx Используется для создания перекрест
ных таблиц
Data E d i t Button Wizbtns.vcx Панель навигации по записям таблицы.
Кнопки Top, Previous, Next, Bottom,
Find, Print, Add, Delete, Edit, Save (Пер
вая, Предыдущая, Следующая, Послед
няя, Найти, Печать, Добавить, Удалить,
Редактировать, Сохранить)
Data Navigation _datanav.vcx Группа кнопок (Top, Previous, Next,
Buttons Bottom) (Первая, Предыдущая, Сле
дующая, Последняя)
Data Session _app.vcx Обслуживает обновление данных в эк
Manager ранных формах при работе с данными
Data V a l i d a t i o n _datanav.vcx Отслеживает конфликты между данными
Data Navigation Jable.vcx Данный класс обязательно используется
Object в сочетании с элементами управления
для перемещения (навигации) по запи
сям таблиц
_dbf3html Jnternet.vcx Курсор для HTML
D i s t i n c t Values _dataqwery.vcx Заполняет поле со списком (ComboBox)
Combo уникальными значениями
Error Object _app.vcx Стандартный обработчик ошибок
F i e l d Mover _app.vcx Диалоговое окно, с помощью которого
можно переносить поля из одного спи
ска в другой. (Мы видели такую штуку
при использовании построителя для
Grid)
F i l e Version _utility.vcx Считывает ресурс версии файла
Урок 32. Фундаментальные классы Visual FoxPro 409
Название
Название класса Описание класса
библиотеки
Название
Название класса Описание класса
библиотеки
Item Locator _dialogs.vcx Диалоговое окно для поиска файла
I N I Access Registry.vcx Осуществляет доступ к системному рее
стру Windows для получения информа
ции из INI-файла
Keywords Dialog Box _dialogs.vcx Диалоговое окно со списком ключевых
слов
Launch Button jnsicbtn.vcx Кнопка для запуска приложения. Ис
пользуется командой RUN
Locate Button Jable2.vcx Кнопка для вызова диалогового окна,
выполняющего функции, аналогичные
команде Locate
Lookup Combobox _dataquery.vcx ComboBox, список значений которого
заполняется данными из полей
M a i l Merge Object Mailmerge.vcx Класс, который использует Mail Merge
Wizard (Мастер слияния данных) для
формирования документа Word
Messagebox Handler _dialogs.vcx Оболочка функции MESSAGEBOX ()
Mover _movers.vcx Элемент управления списком для орга
низации перемещения данных
MouseOver E f f e c t s _ui.vcx Обеспечивает выполнение функций вы
деления элемента управления при пе
ремещении над ним указателя мыши
Navigator Shortcut _table2.vcx Контекстное меню, содержащее коман
Menu ды навигации
Navigation Toolbar _table2.vcx Панель инструментов для перемещения
по записям таблицы
Object State _app.vcx Элемент управления, определяющий
состояние объекта
ODBC R e g i s t r y Registry.vcx Извлекает связанную с ODBC информа
цию из системного реестра Windows
O f f l i n e Switch _dataquery.vcx Набор кнопок, позволяющий переклю
чаться между Online- и Offline-данными
при работе с удаленными представле
ниями
OK Button _miscbtn,vcx Кнопка, которая закрывает экранную
форму и фиксирует все изменения дан
ных
Урок 32. Фундаментальные классы Visual FoxPro 411
Название
Название класса Описание класса
библиотеки
Output Object _reports.vcx Этот класс организует взаимодействие
с источником данных для отчетов
Output Controls _reports.vcx Формирует запросы для ввода опций
при выводе отчета
Output Dialog Box _reports.vcx Диалоговое окно для ввода опций при
выводе отчета
Password Dialog Box _dialogs.vcx Диалоговое окно для ввода пароля
Pivot Table _pivtable.vcx Используется в Pivot Table Wizard для
формирования таблицы Excel
Preview Report _miscbtn.vcx Набор кнопок, используемый при пред
варительном просмотре отчета
QBF _dataquery.vcx Набор кнопок для выполнения запроса
R e g i s t r y Access Registry, vex Используется для получения информа
ции из системного реестра Windows
Resize Object _controls.vcx Данный класс организует изменение
размеров объекта при изменении раз
меров экранной формы
RTF Controls _format.vcx Используется для форматирования тек
ста в формате RTF
Run Form Button _miscbtn.vcx Кнопка для запуска экранной формы
SCX-HTML _innternet.vcx Преобразует файл формата FRX в файл
формата HTML
Sendmail Button _miscbtn.vcx Используется для отправки почтового
сообщения из экранной формы
S h e l l Execute _environ.vcx Кнопка для запуска некоторого прило
жения из текущего приложения
Shortcut Menu Class _menu.vcx Используется при создании контекстных
меню
Simple E d i t Buttons Wizbtns.vcx Набор кнопок Add, Delete, Edit,
Dublicate, Save, Cancel (Добавить, Уда
лить, Редактировать, Копировать, Со
хранить, Отмена) для редактирования
таблиц и видов
Simple Picture _table.vcx Пиктографические кнопки Next (Сле
Navigation Buttons дующая) и Previous (Предыдущая) для
перемещения по записям таблицы или
представления данных
412 Часть II. Объектно-ориентированное программирование
Название
Название класса Описание класса
библиотеки
Название
Название класса Описание класса
библиотеки
Type Library _utility.vcx Извлекает информацию о типе из биб
лиотеки типов и формирует текстовый
файл
URL Combo _intemet.vcx Поле со списком для ввода адреса ин
тернет-страницы
URL O p e r a t i o n _internet.vcx Диалоговое окно для хранения адресов
D i a l o g Box ресурсов Интернет
VCR B u t t o n s _table.vcx Группа кнопок для перемещения по
записям
VCR P i c t u r e s _table.vcx Группа пиктографических кнопок для
Navigation Buttons перемещения по записям
Video Player _multimedia.vcx Загрузка и проигрывание видеофайлов
Web Browser C o n t r o l _webview.vcx Позволяет включать в экранную форму
браузер Internet Explorer
Window Handler _ui.vcx Используется для управления окнами
Галерея компонентов
(Component Gallery)
С помощью галереи компонентов можно группировать такие компоненты,
как проекты, классы, формы, отчеты и т. д. Также она предоставляет сред
ства для создания новых проектов, форм и т. д. А еще, как я уже говорил,
с помощью этой хитрой штуки можно включать в свои приложения фунда
ментальные (и не только) классы.
Для запуска придется выполнить одно из следующих действий: выбрать
команду Component Gallery (Галерея компонентов) из меню Tools
(Инструменты) или набрать команду DO (GALLERY) В командном окне. В
любом случае галерея появится на экране — рис. 33.1.
Как видишь, диалоговое окно разбито на две части. Левая, в которой нахо
дятся каталоги, называется панель каталогов, а правая, на которой располо
жены объекты, — панель объектов.
По умолчанию каталоги в галерее компонентов организованы следующим
образом — табл. 33.1.
Каталог Описание
Опция Описание
FFC Builder Lock (Запуск построителя) При установке данного флажка при
перетаскивании объекта на экранную
форму будет автоматически запущен
соответствующий построитель
Drag and drop to desktop (Перенести При установке данного флажка объект
и оставить на рабочем столе) можно перетащить на рабочий стол.
(Правда, работать он там не будет)
Опция Описание
Open file as new view (Открыть файл) Если установлен этот переключатель,
то объект, который может быть либо
открыт, либо добавлен при двойном
щелчке мыши, будет именно открыт
Add file to current view (Добавить файл) Если установлен этот переключатель,
то объект, который может быть либо
открыт, либо добавлен при двойном
щелчке мыши, будет именно добавлен
Рис. 33.6. Диалоговое окно Component Gallery Options, вкладка Dynamic Views
420 Часть II. Объектно-ориентированное программирование
Ну вот, подходит к концу наша книга, пора подводить итоги. Пройдя все
уроки, ты научился (а мне хотелось бы верить, что это так) создавать сво
бодные таблицы и таблицы базы данных, экранные формы, отчеты, слож
ные (и не очень) запросы и представления данных, перекрестные таблицы,
графики и т. д. В общем, можно сказать, что ты полностью усвоил основ
ные навыки работы с Visual FoxPro. Почему основные? Да потому, что эта
книга лишь приоткрыла для тебя дверь в мир СУБД, и я думаю, что это бы
ла интересная экскурсия...
О Visual FoxPro написано немало книг, справочников, учебных пособий, и
если ты решишь серьезно заняться программированием, тебе не составит
труда найти их. А я напоследок "подарю" тебе список ресурсов Интернет,
посвященных FoxPro.
• Официальные:
http://www.microsoft.com/rus/ — Microsoft в России.
http://msdn.microsoft.com/vfoxpro/default.asp — Microsoft Visual FoxPro.
• Пресса:
www.newsletter.narod.ru/foxtaIk/FoxTalk.htm — "FoxTalk".
• Коллективные:
www.firststeps.ru — "Первые шаги" — Клементьев В. А., Сергей Платонов,
Каев Артем.
www.infocity.kiev.ua — "Виртуальный город компьютерной документа
ции" — Пинкус Михаил.
www.universalthread.com — Michel Fournier, Nick Neklioudov, Evan Delay,
Gerald Santerre, Claudio Lassala, MartHn SalHas.
• Частные:
www.dbrad32.narod.ru — Баянов Дмитрий Александрович.
www.wet.narod.ru — Ветчинов Владимир.
424 Заключение
А теперь хочется сказать слова благодарности всем, кто помогал мне при
создании этой книги. Огромное СПАСИБО:
• моей супруге Елене — за понимание и поддержку в этом нелегком начи
нании;
• семье Ушаковых, Владимиру и Татьяне — за оказанную техническую по
мощь;
• Жанне Манойленко — за полуночное редактирование.
И, конечно же, огромное спасибо тебе, уважаемый читатель — ведь это
не я, это МЫ вместе с тобой написали эту книгу. Успехов тебе и
СЧАСТЛИВОГО ПРОГРАММИРОВАНИЯ!
Дмитрий Шапорев
foxbook@list.ru
ПРИЛОЖЕНИЯ
ПРИЛОЖЕНИЕ 1
Настройка параметров
конфигурации Visual FoxPro
Для настройки параметров, определяющих работу Visual FoxPro, необходимо
вызвать диалоговое окно Options (Параметры) посредством команды Options
(Параметры/Опции) системного меню Tools (Инструменты) (рис. П1.1).
Вкладка Описание
Вкладка Описание
Параметр Описание
Open exclusive Это и есть тот самый эксклюзивный доступ, о
(Открывать монопольно) котором мы говорили ранее. При выборе этой
опции таблица будет открыта в монопольном
режиме, и никто другой не сможет открыть эту
таблицу (имеется в виду работа нескольких
пользователей в сети)
Show field names При выполнении таких команд, как SUM,
(Отображать имена полей) DISPLAY, AVERAGE, L I S T , НЭД с т о л б ц а м и б у д у т
отображаться названия соответствующих полей.
Эта опция соответствует команде SET HEADING
Prompt for code page Определяет, предлагать ли пользователю вы
(Предлагать выбор кодовой брать кодовую страницу. Например, при попыт
страницы) ке просмотра таблицы FoxPro for DOS будет
предъявлено диалоговое окно Code Page. Со
ответствует команде SET CPDIALOG
Ignore deleted records Определяет, каким образом будут обрабаты
(Игнорировать удаленные записи) ваться "удаленные" записи. Дело в том, что
команда DELETE не удаляет записи физически,
а лишь помечает их определенным образом.
Если этот флажок не установлен, то такие
записи будут обрабатываться как и все осталь
ные. Соответствует команде SET DELETED
Настройка параметров конфигурации Visual FoxPro 431
Параметр Описание
Rushmore optimization Определяет, включен ли метод ускоренного
(Оптимизация Rushmore) поиска информации, называемый Rushmore.
Рекомендуется отключать лишь в особых слу
чаях. Соответствует команде SET O P T I M I Z E
Unique records in indexes Соответствует команде SET UNIQUE. При уста
(Уникальные записи в индексах) новке данного флажка индексы будут поддер
живать только неповторяющиеся значения
ключей, несмотря даже на то, что могут быть
записи и с одинаковыми значениями
Collation sequence С помощью раскрывающегося списка можно
(Порядок сортировки) выбрать желаемый порядок сортировки симво
лов. Соответствует команде SET COLLATE
Record counter interval Определяет частоту выдачи сообщений в стро
(Интервал отсчета записей) ку состояния о количестве обработанных запи
сей при выполнении таких команд, как PACK И
RE INDEX. Соответствует команде SET ODOMETR.
Значения могут быть в интервале от 1 до
32 787, но при установке слишком малого ко
личества записей может замедлить работу
приложения, т. к. потребует более частого об
новления экрана
Параметр Описание
Параметр Описание
Environment (Среда) Определяет среду для отладчика. При выборе
Debug Frame (Оболочка отладчика) все окна
отладчика располагаются внутри окна Visual
FoxPro Debugger (Отладчик Visual FoxPro).
При выборе FoxPro Frame отдельные окна от
ладчика можно отображать в главном окне Visual
FoxPro
Display Timer Events При отмеченном флажке в процессе отладки
(Отображать события таймера) будут отображены события таймера
Specify Window Здесь перечислены окна отладчика, для которых
(Определить для окна) можно задать такие параметры, как размер и
цвет шрифта и т. д. Все эти параметры перечис
лены в нижней части вкладки
С помощи вкладки Field Mapping (Поля) (рис. П1.6) можно назначить дей
ствующие по умолчанию элементы управления в зависимости от типа поля.
Для чего это нужно? А вот смотри: раньше тип объекта, связанный с типом
поля, был строго фиксирован и представлял собой в большинстве случаев
434 Приложение 1
текстовое поле. Но, допустим, для поля типа Logical удобнее использовать
такой элемент управления, как флажок. Теперь мы легко это можем опре
делить. Замечу, что началось такое "удобство" с пятой версии Visual FoxPro.
Drag and drop field caption При установке этого флажка заголовок поля
("Перетащить и оставить" будет сформирован на основе свойства
заголовки полей) Caption структуры таблицы и включен при
добавлении поля на экранную форму
Имя
Тип файла Назначение файла (по умолчанию)
Имя
Тип файла Назначение файла
(по умолчанию)
Параметр Описание
Параметр Описание
Параметр Описание
Команда ON OFF
Команда ON OFF
ACTIVATE WINDOW При активизации окна кур При активизации окна пози
сор занимает позицию 0,0 ция курсора не меняется
Команда ON OFF
Команда ON OFF
Если установлен флажок Use Visual FoxPro color palette (Использовать па
литру Visual FoxPro), то Лис будет использовать собственную цветовую па
литру при просмотре растровых изображений. В противном случае будет
задействована палитра, используемая при создании изображения. Данный
параметр соответствует команде SET PALETTE.
Опция Confirm file replacement (Подтверждать замену файла) определяет,
будет ли отображаться сообщение перед записью существующего файла.
Команда SET SAFETY.
Флажок Browse IME Control (Просмотр с помощью IME) устанавливается
только при использовании двухбайтовой символьной системы. IME — это
Input Method Editor (Редактор метода ввода).
А еще на вкладке General (Общие установки) имеются три опции, связан
ные с программированием:
• Cancel programs on escape (Прекращать работу программ при нажатии
клавиши <Esc>). Соответствует команде SET ESCAPE;
• Log compilations errors (Отслеживать ошибки при компиляции) — при
компиляции файлов информация о возникших ошибках выводится на
экран. В то же время вся информация об ошибках сохраняется и в спе
циальном файле с расширением err;
• При установке флажка SET DEVELOPMENT (Режим разработки) перед
запуском откомпилированного файла происходит проверка, не вносились
ли в него изменения. Если изменения обнаружены, файл будет переком
пилирован.
Раскрывающийся список Navigation keys (Клавиши навигации) содержит
два элемента: Windows Compatible и MS-DOS Compatible (соответственно,
444 Приложение 1
Параметр Описание
В поле ввода Text generation (Генерация текста) можно задать имя файла,
который осуществляет сохранение целостности информации между
Microsoft Visual SourceSafe и VFP.
В поле ввода Project class (Класс проекта) можно ввести имя класса, кото
рый будет использован при создании новых проектов.
На вкладке Regional (Региональные) (рис. П1.14) можно задать параметры,
отвечающие за форматы дат, времени, валюты и числовых данных. Самым
"главным" здесь является флажок Use System Settings (Использовать сие-
446 Приложение 1
темные установки). А знаешь почему? Да потому что при его установке все
остальные опции станут недоступными и в работу вступят системные уста
новки. Другое дело, когда данный флажок не установлен — табл. ШЛО.
Параметр Описание
Параметр Описание
Currency Symbol Позволяет определить символ денежной еди
(Символ денежной единицы) ницы. Команда SET CURRENCY TO
1000 Separator Здесь задается символ, который отображает
(Разделитель тысяч) ся после каждой третьей цифры слева от де
сятичного знака — разделяет тысячи
Decimal Separator Символ для разделения целой и дробной час
(Десятичный разделитель) тей числа
Decimal Digits Определяет минимальное количество деся
(Десятичные цифры) тичных знаков.
Диапазон значений от 0 до 18.
Команда SET DECIMALS TO
Week Starts on Здесь можно указать, с какого дня начинается
(Неделя начинается с) неделя. Что? Это у нас с понедельника, а
у "них" немного по-другому...
First Week of Year Тут возможны три значения: Contains Jan 1
(Первая неделя года) (Включая 1 января), First 4-Day Week (Первая
неделя — 4-дневная) и First Full Week (Первая
неделя — полная)
Параметр Описание
Share connection При установке флажка данной опции можно
(Общее соединение) открыть несколько удаленных представлений
данных
Fetch memo Выборка мемо-полей при удаленном соединении
(Выбрать мемо-поля) происходит только в том случае, когда пользо
ватель активизировал Мемо-поле. Данный фла
жок рекомендуется устанавливать для снижения
нагрузки сети
Criteria (Критерий) Используется для управления обновлением SQL.
Возможны четыре значения: Key Fields Only
(Только ключи), Key and update Fields (Ключи и
обновляемые поля), Keys and Modified Fields
(Ключи и модифицированные поля), Key and
TimeStamp (Ключи и поля меток времени)
448 Приложение 1
Параметр Описание
Method (Метод обновления) При выборе первого варианта SQL Update (Об
новление) обновление данных происходит с по
мощью SQL-функции update, а при выборе вто
рого (SQL Delete + SQL Insert— удаление и
вставка) сначала удаляются старые записи, а
затем вставляются другие с новыми значениями
Records to fetch at a time Данная опция предназначена для ограничения
(Одновременно выбрать записи) нагрузки на сеть и определяет количество запи
сей, возвращаемых от запроса за один раз
Maximum records to fetch Позволяет определить максимальное число
(Максимальное число записей, возвращаемых запросом за один раз
считываемых записей)
Use memo for fields >= Некоторые удаленные таблицы могут поддержи
(Использовать тип memo вать длинные символьные поля. Данная опция
для полей) позволяет автоматически преобразовывать та
кие поля в поля типа Memo
Records to batch update Здесь определяется число записей, отправляе
(Число записей для группового мых серверу в одной инструкции SQL
обновления)
Asynchronous execution При установке асинхронного выполнения твое
(Асинхронное выполнение) приложение может не дожидаться, пока пол
ностью закончится обработка инструкции SQL, a
выполнять в это время другие действия
Display warnings Определяет, нужно ли выводить на экран сооб
(Отображать предупреждения) щения об ошибках, возникающих при обработке
инструкции SQL
Batch processing Данная опция определяет, каким образом будут
(Пакетная обработка) считываться несколько результирующих набо
ров
Automatic transactions Определяет, будет ли транзакция SQL обраба
(Автоматическая обработка тываться средствами Visual FoxPro (автоматиче
транзакций) ски)
Show login В некоторых случаях при доступе к удаленным
(Показывать окно регистрации) данным может потребоваться регистрация. Вот в
этом раскрывающемся списке и можно настро
ить отображение окна регистрации: Always
(Всегда), Never (Никогда), Only When Neces
sary (При необходимости)
Connection timeout Указывается интервал времени (в секундах), в
(Время ожидания соединения) течение которого средства соединения будут
ожидать распознавание сервером
Настройка параметров конфигурации Visual FoxPro 449
Параметр Описание
15 3ак. 1002
450 Приложение 1
С помощью вкладки View (Вид) (рис. П1.16) можно указать, что и как будет
отображаться в строке состояния (табл. П1.12).
Параметр Описание
Status bar (Строка состояния) С помощью этой опции можно указать, отобра
жать или не отображать в нижней части экрана
строку состояния. Если строка состояния отсут
ствует, то все системные сообщения будут ото
бражаться в служебном окне в правом верхнем
углу экрана
Clock (Часы) При установке этого флажка в строке состояния
будет отображаться системное время
Command results При установке этого флажка в строке состояния
(Результаты команд) будут отображаться результаты вы