В главе 6 мы рассмотрели создание в конструкторе форм формы, предназначенной для ввода и просмотра данных. Но средства, предлагаемые системой Visual FoxPro, настолько разнообразны, что мы продолжим изучение возможностей ввода данных и в этой главе.
Отображение данных в форме в табличном виде
В Visual FoxPro для отображения в форме данных в табличном виде используется объект Grid (Таблица), который может помещаться в форму, как и любой другой объект интерфейса.
При использовании табличного режима информация лучше воспринимается, и, кроме того, проще вводить данные, т. к. пользователь видит сразу несколько записей и может вводить информацию по аналогии. Без табличного режима трудно обойтись, когда необходимо вводить и просматривать информацию из нескольких связанных таблиц, имеющих отношение "один-комногим".
Использование построителя
Использование построителя ускоряет размещение объекта в форме и определение его свойств. Особенно заметным это преимущество становится при создании сложных объектов, к числу которых относится объект Grid (Таблица). Рассмотрим пример размещения объекта Grid (Таблица) с помощью построителя для таблицы Customer и изучим свойства, которыми наделен данный объект.
Для создания формы, в которой данные будут представлены в табличном виде, выполните следующие действия:
Откройте Проект Sales.
Выберите вкладку Documents (Документы), перейдите в группу Forms (Формы), а затем нажмите кнопку New (Новый).
В открывшемся диалоговом окне New Form (Новая форма) выберите опцию New Form (Новая форма). На экране открывается окно конструктора форм.
Откройте окно среды окружения формы Data Environment (Среда окружения), выполнив команду Environment (Окружение) из меню View (Вид).
Для добавления таблицы в окружение выполните команду контекстного меню Add (Добавить).
В открывшемся диалоговом окне Add Table or View (Добавить таблицу или представление данных) выберите таблицу customer и нажмите кнопку ОК. В окне Data Environment (Среда окружения) появилась выбранная таблица. Закройте окно окружения.
Нажмите кнопку Builder Lock (Закрепитель построителя) LE__i на панели инструментов Form Controls (Элементы управления формы).
Выберите кнопку Grid (Таблица) И' на панели инструментов Form Controls (Элементы управления формы).
Установите указатель в место предполагаемого расположения таблицы, нажмите кнопку мыши и, удерживая ее нажатой, переместите курсор по диагонали, чтобы получилась рамка требуемого размера.
Запускается построитель и на экране открывается диалоговое окно Grid Builder (Построитель таблицы) (рис. 15.1), позволяющее задать основные параметры объекта Grid (Таблица).
Диалоговое окно построителя объекта Grid (Таблица) содержит четыре вкладки, используя которые вы можете настроить его параметры (табл. 15.1).
Таблица 15.1. Назначение вкладок окна Grid Builder
Вкладка
Назначение
Grid Items (Элементы объекта Grid)
Позволяет сформировать список полей, размещаемых в создаваемом объекте
Style (Стиль)
Позволяет задать стиль отображения таблицы, выбрав один из предложенных вариантов: Professional (Профессиональный), Standard (Стандартный), Embossed (Изысканный), Ledger (Бизнес)
Layout (Расположение)
Позволяет переопределить заголовки столбцов объекта Grid (Таблица) и определить тип объекта, отображаемого в столбце таблицы
Relationship
(Отношения)
При создании многотабличных форм позволяет определить отношения между таблицами
Используя кнопки со стрелками, перенесите из списка Available fields (Имеющиеся поля) в список Selected fields (Выбранные поля) поля, которые вы хотите разместить, используя объект Grid (Таблица).
Рис. 15.1. Диалоговое окно Grid Builder
Для задания стиля отображения данных в таблице перейдите на вкладку Style (Стиль). Используя одноименный список, выберите один из вариантов оформления таблицы (рис. 15.2).
По умолчанию заголовки столбцов совпадают с именами полей таблицы, заданными в свойстве Caption (Надпись) конструктора таблиц. Чтобы переопределить заголовки столбцов объекта Grid (Таблица), перейдите на вкладку Layout (Расположение) (рис. 15.3). Она содержит создаваемый объект с реальными данными. При перемещении по столбцам таблицы в поле ввода Caption (Надпись) вкладки отображается наименование данного столбца. Для изменения наименования столбца скорректируйте имя, отображаемое в этом поле.
Рис. 15.2. Определение стиля объекта Grid
Рис. 15.3. Переопределение заголовков столбцов объекта Grid
На вкладке Layout (Расположение) вы можете задать тип объекта,
отображаемого в столбце. Для этого воспользуйтесь раскрывающимся списком Control type (Стиль элементов управления), содержащим перечень всех типов объектов, которые могут отображаться в столбце: Textbox,
Editbox, Spinner, Checkbox и OLEBoundControl. Выберите из списка необходимое значение типа данных столбца.
Замечание
При использовании объекта Grid (Таблица) для создания многотабличных форм вы можете выбрать вкладку Relationship (Отношение) (рис. 15.4) и на ней задать ключевое поле главной таблицы и индекс подчиненной таблицы. Если вторая таблица не добавлена в окружение формы, нажмите кнопку, расположенную рядом со списком Key field in parent table (Ключевое поле в родительской таблице), и в открывшемся диалоговом окне Open (Открыть) выберите необходимую таблицу. Она будет добавлена построителем в окружение формы.
После завершения определения всех параметров нажмите кнопку ОК для закрытия окна построителя.
Рис. 15.4. Вкладка Relationship для установки связи между таблицами
Используя кнопку Label (Текстовый объект) на панели инструментов Form Controls (Элементы управления формы), разместите заголовок в форме.
Свойства объекта Grid
Построитель — очень удобное средство для быстрого создания объекта Grid (Таблица). Однако созданный с его помощью объект требует некоторой модификации внешнего вида. С этой целью рассмотрим основные свойства, характеризующие объект Grid (Таблица).
Щелкните правой кнопкой мыши на объекте Grid (Таблица). В контекстном меню содержится команда Edit (Правка), указывающая, что объект является сложным, т. е. состоящим из нескольких входящих в него объектов.
Такими объектами являются column (Столбец), Header (Заголовок) и Text (Текст). Выделите объект Grid (Таблица) и откройте окно свойств (рис. 15.5). Созданный объект характеризуется свойствами, относящимися ко всему объекту в целом. Помимо этого, объекты column (Столбец), Header (Заголовок) и Text (Текст) обладают своими собственными свойствами.
Объекты, характеризующие столбцы таблицы, представлены в табл. 15.2.
Таблица 15.2. Назначение объектов, характеризующих столбцы таблицы
Объект
Назначение
Column (Столбец)
Определяет свойства, относящиеся к помещаемой в столбец информации
Header (Заголовок)
Определяет свойства, характеризующие заголовок столбца
Text (Текст)
Определяет свойства поля таблицы, когда на нем установлен фокус
Рис. 15.5. Окно свойств объекта Grid
Свойства, определяющие объект Grid
Сначала обратимся к основным свойствам, определяющим объект Grid (Таблица) в целом. К числу таких свойств относятся:
ComumnCount — количество столбцов в создаваемом объекте Grid
(Таблица);
GridLineWidth — толщина сетки таблицы;
GridLineCoior — цвет сетки таблицы;
GridLines — стиль оформления таблицы; может принимать одно из следующих значений:
None (Нет) — в таблице отсутствуют горизонтальные и вертикальные линии;
Horizontal (Горизонтальные) — в таблице присутствуют горизонтальные линии;
vertical (Вертикальные) — в таблице присутствуют только вертикальные линии;
Both (Default) (Горизонтальные и вертикальные) — в таблице присутствуют горизонтальные и вертикальные линии;
Recordsource — задает источник данных помещаемой в объект информации;
RecordSourceType — задает тип источника данных и может принимать одно из следующих значений:
Table (Таблица) — автоматически открывает таблицу, заданную свойством RecordSource;
Alias (Псевдоним) — использует заданный псевдоним таблицы;
Prompt (Запрашиваемое значение) — если для формы в среде окружения не определены таблицы, запрашивается исходная таблица для отображения в объекте Grid (Таблица);
Query (QPR) (Запрос) — в качестве источника данных используются результаты запроса;
SQL statement (SQL-предложение) — в качестве источника данных используется SQL-предложение;
ChildOrder — задает имя индекса, используемого для установления связи между таблицами;
RecordMark — определяет наличие с левой стороны объекта Grid (Таблица) столбца, содержащего указатель текущей записи.
Свойства объекта Column
Объект column (Столбец) является составной частью объекта Grid (Таблица) и определяет информацию, выводимую в столбцах объекта Grid (Таблица).
Используя свойства объекта column (Столбец), можно задать цвет фона столбца, а также цвет выводимой информации, тип шрифта, размер, выделив тем самым наиболее важную информацию в размещенном в форме табличном объекте.
Объект column (Столбец) характеризуется следующими основными свойствами:
CoiumnOrder — задает порядок следования столбцов;
Alignment — выравнивает информацию в столбце;
Controisource — связывает столбец с источником данных.
Свойства объекта Header
Объект Grid (Таблица) состоит из столбцов, каждый из которых имеет собственный заголовок, являющийся объектом Header (Заголовок). В Visual FoxPro заголовок каждого столбца является самостоятельным объектом. Его можно корректировать, изменяя свойства.
Свойство caption (Надпись) объекта определяет наименование заголовка столбца, а свойство Alignment (Выравнивание) задает его расположение в столбце.
Помимо этого, объект Header (Заголовок), как и объект column (Столбец), характеризуется свойствами, определяющими цвет фона, тип и размер шрифта заголовка.
Свойства объекта Text
Объект Text (Текст) определяет вид информации, выводимой в столбцах объекта Grid (Таблица), при установленном курсоре на текущую запись в столбце.
Используя свойства данного объекта, можно задать цвет фона, тип и размер шрифта выводимой информации. ,
Создание многотабличных форм для таблиц, имеющих отношение "один-ко-многим"
Во всех рассмотренных нами ранее примерах по созданию форм использовались связанные таблицы с отношением между ними "один-к-одному" или "многие-к-одному". При создании приложений очень часто возникает необходимость просмотра и редактирования данных, имеющих отношение
"один-ко-многим". В этом случае при создании формы для отображения записей основной таблицы можно использовать поля формы или объект Grid (Таблица), а для отображения данных подчиненной таблицы — объект Grid (Таблица). Рассмотрим создание многотабличных форм с помощью мастера и конструктора форм.
Создание многотабличной формы с помощью мастера
Рассмотрим создание формы для связанных таблиц customer и Phoncust, имеющих отношение "один-ко-многим" с помощью мастера. Таблица customer содержит информацию о клиентах, таблица Phoncust — номера телефонов, по которым можно с ними связываться.
Откройте проект sales.
Перейдите на вкладку Documents (Документы), выберите группу Forms (Формы) и нажмите кнопку New (Новый).
В открывшемся диалоговом окне New Form (Новая форма) выберите опцию Form Wizard (Мастер формы).
Рис. 15,6. Диалоговое окно для выбора мастера многотабличной формы
На экране открывается диалоговое окно, предназначенное для выбора мастера создания формы (рис. 15.6). Поскольку мы создаем форму для связанных таблиц, выберите опцию One-to-Many Form Wizard (Мастер формы с отношением "один-ко-многим") и нажмите кнопку ОК для вызова мастера многотабличной формы.
В области Databases and tables (Базы данных и таблицы) выберите главную таблицу формы Customer. После выбора таблицы в списке Available fields (Имеющиеся поля) появится перечень всех полей данной таблицы. Перенесите из этого списка в список Selected fields (Выбранные поля) поля, которые вы хотите поместить в создаваемую форму из данной таблицы (рис. 15.7). Затем нажмите кнопку Next (Далее) для перехода к следующему шагу.
На втором шаге работы мастера выберите подчиненную таблицу и ее поля, которые будут размещены в форме в виде объекта Grid (Таблица) (рис. 15.8). Для перехода к следующему шагу нажмите кнопку Next (Далее).
Рис. 15.7. Выбор полей главной таблицы
На третьем шаге мастера необходимо установить связь между таблицами, используемыми в форме (рис. 15.9). В диалоговом окне размещены два раскрывающихся списка, содержащие индексы и поля исходных таблиц. В нашем примере для установления связи воспользуемся ключевым полем
icdcustomer Таблицы Customer и индексом icdcustomer таблицы Phoncust.
Установив связь между таблицами, нажмите кнопку Next (Далее).
На четвертом шаге (рис. 15.10) необходимо установить стиль отображения объектов формы, воспользовавшись значениями из списка Style
(Стиль), и тип кнопок управления, выбрав одну из опций в группе Button type (Тип кнопки). Выберите стиль, просмотрите результат выбора в верхней части диалогового окна. Затем выберите тип отображения кнопок управления (с текстовыми надписями или с изображениями). Если вы не хотите размещать кнопки в форме, установите опцию No buttons (Без кнопок). После того как вы установили требуемые параметры, нажмите кнопку Next (Далее).
Рис. 15.8. Выбор полей подчиненной таблицы, помещаемых в объект Grid
Рис. 15.9. Установка связи между таблицами
Рис. 15.10. Выбор стиля отображения полей и управляющих кнопок
На следующем шаге формируется список полей, по которым будет осуществляться сортировка отображаемых в форме данных. Для переноса поля из списка Available fields or index tag (Имеющиеся поля и индексы) в список Selected fields (Выбранные поля) установите курсор на поле или индекс, по значению которого требуется упорядочивать данные, и нажмите кнопку Add (Добавить). Если вы ошибочно перенесли не то поле или индекс, удалить его из списка Selected fields (Выбранные поля) можно с помощью кнопки Remove (Удалить). Установите опцию Ascending (По возрастанию) или Descending (По убыванию), определяющую, по возрастанию или по убыванию значения выбранного поля будут упорядочиваться данные (рис. 15.11). Для перехода к следующему шагу создания формы нажмите кнопку Next (Далее).
На последнем, шестом шаге, в поле ввода Т^ре a title for your form (Тип заголовка формы) задайте заголовок, размещаемый в форме, и выберите один из трех вариантов продолжения работы с формой (рис. 15.12) (табл. 15.3).
Таблица 15.3. Варианты продолжения работы с формой
Опция
Действие
Save form for later use (Сохранить форму)
Созданная форма сохраняется на диске
Save and run form (Сохранить и запустить форму на выполнение)
Созданная форма сохраняется и запускается на выполнение
Save form and modify it in the Form Designer (Сохранить и открыть для модификации в конструкторе форм)
Созданная форма сохраняется и открывается в конструкторе форм для модификации
Рис. 15.11. Установка критерия сортировки данных
После установки требуемой опции нажмите кнопку Finish (Готово) для завершения создания объекта с помощью мастера. В открывшемся диалоговом окне Save as (Сохранить как) выберите папку, в которой хотите разместить форму, и введите имя созданной формы.
Рис. 15.12. Заключительное диалоговое окно мастера
Посмотрите на форму, созданную с помощью мастера (рис. 15.13). Надписи к полям основной таблицы созданы с использованием информации, введенной в поле Caption (Надпись) свойства таблицы. Однако при формировании
названий столбцов объекта Grid (Таблица) мастер не использовал это свойство таблицы. Для изменения наименований столбцов вам потребуется конструктор форм.
Рис. 15.13. Многотабличная форма, созданная с помощью мастера форм
Создание объекта Grid
с помощью конструктора форм
Форма для таблиц, имеющих отношение "один-ко-многим", с помощью мастера создается достаточно быстро. Но она требует определенной доработки в конструкторе форм. Поэтому вам необходимо уметь создавать многотабличные формы с помощью конструктора, чтобы при необходимости уметь их модифицировать. Для создания формы в конструкторе форм следует выполнить следующие действия:
В окне Data Environment (Среда окружения) разместите таблицы, используемые в форме.
Установите связи между таблицами.
Разместите в форме поля главной таблицы.
Создайте в форме объект Grid (Таблица) для отображения данных подчиненной таблицы.
Создание формы, содержащей объект Grid
Рассмотрим создание формы, с помощью которой можно просмотреть информацию о клиентах, их телефонах и сделанных ими покупках. В отчете
будем использовать следующие таблицы: Customer, Phoncust, Ordsalem,
ordsaied и Goods. В таблицах содержится следующая информация:
Сustomer — список клиентов;
Phoncust — средства связи, по которым можно связаться с клиентом;
Ordsalem — информация о продажах: номер заказа, дата заказа, код клиента, итоговая сумма заказа;
Ordsaied — код, количество и стоимость проданного товара по данному заказу;
Goods — информация о товарах.
Отношение между таблицами customer и Phoncust определяется как "одинко-многим", т. к. клиент может иметь несколько номеров телефона или факс для связи.
Отношение между таблицами Customer и Ordsalem также "один-ко-многим", поскольку каждый клиент может сделать несколько покупок.
Приступим к созданию формы.
Откройте проект Sales.
Откройте окно конструктора форм для создания новой формы.
Откройте окно Data Environment (Среда окружения), выполнив команду Environment (Окружение) из меню View (Вид).
Используя команду Add (Добавить) из меню Data Environment (Среда окружения), добавьте В форму таблицы Customer, Phoncust, Ordsalem, Ordsaied и Goods. Между ними существуют следующие отношения:
customer — родительская по отношению к таблицам Phoncust и
Ordsalem;
Ordsalem — родительская по отношению к таблице ordsaied;
ordsaied — родительская по отношению к таблице Goods. Связь между таблицами осуществляется:
customer и Phoncust — по коду клиента;
Customer и Ordsalem — по коду клиента;
Ordsalem и Ordsaied — по коду заказа;
Ordsaied и Goods — по коду товара.
Данные в таблицах customer, Ordsalem и Phoncust должны быть упорядочены по коду клиента, в ordsaied — по коду заказа, а в Goods — по коду товара.
Установив все необходимые связи между таблицами и указав упорядочение данных (рис. 15.14), закройте окно Data Environment (Среда окружения).
Рис. 15.14. Окно Data Environment создаваемой формы
Используя кнопки панели инструментов Form Controls (Элементы управления формы), расположите в форме заголовок, надписи и необходимые
поля таблицы Customer.
Выберите кнопку Grid (Таблица) на панели инструментов Form Controls
(Элементы управления формы).
Установите указатель в место предполагаемого расположения объекта и, удерживая кнопку мыши нажатой, переместите курсор по диагонали, нарисовав рамку требуемого размера.
Для определения параметров созданного объекта выделите его и откройте окно свойств, выполнив команду Properties (Свойства) из меню View (Вид).
Скорректируйте свойство coiumnCount (Количество столбцов) объекта Grid (Таблица), задав количество столбцов в создаваемом объекте равным 3.
Если вы хотите изменить цвет сетки таблицы, определите свойство GridLineCoior (Цвет сетки таблицы) объекта Grid (Таблица).
Используя свойство controisource (Источник данных) каждого из трех объектов column (Столбец), входящих в объект Grid (Таблица), свяжите
столбцы с полями таблицы Phoncust.
Используя свойство caption (Надпись) каждого из трех объектов Header (Заголовок), входящих в объект Grid (Таблица), введите заголовки столбцов Вид связи, Номер кода и Номер. Чтобы заголовки располагались по центру столбцов, скорректируйте для каждого из них свойство Alignment (Выравнивание), установив значение Middle (По середине)
Center (По центру).
Определение первого объекта Grid (Таблица) завершено. Разместим в форме второй объект Grid (Таблица).
Нажмите кнопку Grid (Таблица) на панели инструментов Form Controls
(Элементы управления формы).
Установите указатель в нижней части формы и, удерживая кнопку мыши в нажатом состоянии, переместите курсор по диагонали так, чтобы получилась рамка необходимого размера.
Для определения параметров созданного объекта выделите его и откройте окно свойств.
Скорректируйте свойство CoiumnCount (Количество столбцов) объекта Grid (Таблица), задав количество столбцов (6) в создаваемом объекте.
Если необходимо выбрать цвет сетки таблицы, определите свойство GridLineCoior (Цвет сетки таблицы) объекта Grid (Таблица).
Используя свойство controisource (Источник данных) каждого из пяти объектов column (Столбец), входящих в объект Grid (Таблица), выполните следующие действия:
свяжите первые два столбца с полями cndoc и ddoc таблицы Ordsaiem;
свяжите третий столбец с полем cnmgoods таблицы Goods;
четвертый и пятый столбцы свяжите с полями nquant и nunitprice таблицы Ordsaled.
Шестой столбец таблицы будет содержать вычисляемое поле, определяющее стоимость проданного товара. Используя свойство
Controisource (источник данных) для шестого объекта Column
(Столбец), задайте выражение для вычисляемого поля:
Ordsaled.nQuant*Ordsaled.nUnitPrice
Используя свойство caption (Надпись) каждого из шести объектов Header (Заголовок), входящих в объект Grid (Таблица), введите заголовки столбцов: Номер документа, Дата, Наименование товара, Количество, Цена и Стоимость. Чтобы заголовки столбцов располагались по центру, скорректируйте для каждого из них свойство Alignment (Выравнивание), установив значение Middle (По середине) center (По центру).
Используя свойство ForeCoior каждого из пяти объектов Text (Текст), входящих в объект Grid (Таблица), установите цвет (например, красный) для выделения информации при установке курсора на данное поле.
Добавьте в создаваемую форму кнопки перемещения по записям. Полученная форма показана на рис. 15.15.
Рис. 15.15. Многотабличная форма
Сохраните созданную форму и запустите ее на выполнение. Отметьте, что при перемещении по записям таблицы customer в первом объекте Grid (Таблица) отображается список телефонных номеров, по которым можно связаться с клиентом, а во втором объекте Grid (Таблица) показывается полный список товаров, купленных данным клиентом (рис. 15.16).
Рис. 15.16. Просмотр многотабличной формы
Создание формы, содержащей три объекта Grid
В рассмотренном примере мы использовали поля формы для отображения информации главной таблицы. Модифицируем созданную форму и разместим поля таблицы customer в объекте Grid (Таблица).
Откройте в окне конструктора форм созданную в предыдущем примере форму и сохраните ее под новым именем.
Удалите из формы все поля и надписи, оставив только объекты Grid (Таблица) (рис. 15.17).
Нажмите кнопку Grid (Таблица) на панели инструментов Form Controls
(Элементы управления формы), установите указатель в левой верхней части формы и создайте новый объект Grid (Таблица).
В окне свойств созданного объекта скорректируйте для объекта Grid (Таблица) свойство coiumncount (Количество столбцов), задав количество столбцов (4) в создаваемом объекте.
Свяжите столбцы объекта с полями ccompany, clastname, cfirstname и caddress таблицы Customer.
Рис. 15.17. Удаление из формы полей ввода и надписей к ним
Рис. 15.18. Форма с тремя объектами Grid
Скорректируйте для вновь созданных объектов свойства, определяющие цвет сетки таблицы, расположение заголовков, цвета отображения заголовков и выводимых данных.
Сохраните форму и запустите ее на выполнение. Вид созданной формы показан на рис. 15.18.
Создание формы с вкладками
Visual FoxPro позволяет создавать формы, содержащие несколько вкладок. Объекты данного типа удобно использовать в том случае, когда необходимо разместить большой объем информации или для удобства работы требуется основную, наиболее часто используемую информацию, сгруппировать в одном месте, отделив от менее важной информации.
Чтобы создать вкладки в форме, необходимо воспользоваться кнопкой Page
Frame (Вкладка) панели инструментов Form Controls (Элементы управления формы). Созданный объект содержит в контекстном меню команду Edit (Правка), указывающую, что он является сложным объектом, в котором вкладки наделены своими собственными свойствами. Количество вкладок задается свойством Pagecount (Количество вкладок). В процессе создания формы переход с одной вкладки на другую осуществляется в режиме редактирования.
Создание объекта типа page Frame (Вкладка) рассмотрим на примере разработки многостраничной формы для таблицы customer. Форма будет содержать две вкладки. На первой вкладке будет располагаться объект Grid (Таблица), содержащий список всех клиентов, а на второй — дополнительные данные о выбранном на первой вкладке клиенте.
Откройте проект Sales.
Откройте окно конструктора форм для создания новой формы. Скорректируйте свойство caption (Надпись) формы, введя заголовок формы Список клиентов.
Откройте диалоговое окно Data Environment (Среда окружения), выполнив команду Environment (Окружение) из меню View (Вид).
Используя команду Add (Добавить) всплывающего меню, добавьте в форму таблицу Customer. Закройте диалоговое окно.
Нажмите кнопку Page Frame (Вкладка) на панели инструментов Form Controls (Элементы управления формы).
Установите указатель в форму и, удерживая кнопку мыши в нажатом состоянии, переместите курсор по диагонали так, чтобы получилась рамка размером с форму (рис. 15.19).
Рис. 15.19. Размещение в форме объекта Page Frame
Откройте окно свойств созданного объекта. Убедитесь, что для свойства Pagecount, определяющего количество вкладок формы, по умолчанию установлено значение 2.
Скорректируйте свойство caption (Надпись) для объектов Pagei и Раде2, определяющих заголовок каждой вкладки. Для объекта Pagei введите заголовок Основная информация, а для объекта Раде2 — Дополнительная информация.
Для перехода в режим редактирования объекта Page Frame (Вкладка) выберите команду Edit (Правка) контекстного меню. Вокруг объекта появилась штриховая контурная рамка.
Убедитесь, что вы находитесь на первой вкладке объекта Page Frame (Вкладка). Для этого щелкните мышкой на вкладке Основная информация в верхней части формы.
Используя кнопку Grid (Таблица) на панели инструментов Form Controls (Элементы управления формы), создайте объект Grid (Таблица) для
отображения ПОЛеЙ icdcustomer, ccompany таблицы Customer.
В третьем столбце таблицы для отображения фамилии, имени и отчества представителя в свойстве Control Sour се (Источник данных) введите выражение следующего вида:
a lit rim (customer .cLastname) + " " + allt rim (customer .cFirstname) + " " + alltrim(customer.cSecondname)
Определите заголовки столбцов и другие параметры созданного объекта Grid (Таблица).
В нижней части страницы расположите кнопки перемещения по записям таблицы и выхода из формы.
На рис. 15.20 представлена первая вкладка созданной формы.
Рис. 15.20. Первая страница многостраничной формы
Перейдите на вторую вкладку объекта Page Frame (Вкладка). Для этого щелкните на названии вкладки Дополнительная информация в верхней части формы.
Совет
Если ваша попытка перейти на вторую вкладку оказалось безуспешной, убедитесь, что объект Page Frame (Вкладка) находится в режиме редактирования.
На второй странице объекта расположите все поля таблицы Customer и надписи к ним.
При переходе на другую вкладку формы необходимо обновлять значения данных, отображаемых в ней. Для этого вы можете использовать событие Activate (Активизация) каждой вкладки объекта Page Frame (Вкладка). Откройте окно редактирования процедуры обработки данного события и введите следующую команду, использующую метод Refresh (Обновить):
screen.ActiveForm.Refresh()
Окно процедур для метода Refresh представлено на рис. 15.21.
Сохраните созданную форму и запустите ее на выполнение.
Замечание
Обратите внимание, что после ввода информации в окно процедуры в свойстве данного метода появляется значение [User Procedure].
Рис. 15.21. Окно процедуры для метода Refresh
Используя первую вкладку формы, вы можете, перемещаясь по записям таблицы, просмотреть весь список клиентов. Для просмотра дополнительной информации по любому из клиентов установите на него курсор и нажмите ярлык Дополнительная информация. В результате откроется вторая вкладка формы (рис. 15.22), на которой располагается дополнительная информация о выбранном клиенте.
Рис. 15.22. Вторая вкладка формы
Набор форм
В Visual FoxPro вы можете объединить несколько форм в набор форм. Для этого служит команда Create Form Set (Создать набор форм) из меню Form (Форма), создающая объект FormSet.
Создадим объект FormSet из двух форм. Первая форма содержит данные о клиентах таблицы customer, а вторая — итоговую сумму покупок клиентов. Для создания набора форм выполните следующие действия:
Откройте проект Sales.
Откройте окно конструктора для создания новой формы.
Выберите в меню Form (Форма) команду Create Form Set (Создать набор форм).
Откройте окно Data Environment (Среда окружения) и добавьте в окружение таблицу customer и представление данных sumcust, содержащее сведения об итоговой стоимости покупок клиентов.
Скорректируйте свойство caption (Надпись) для первой формы, введя заголовок Клиенты.
В форме создайте объект Grid (Таблица), разместив в нем необходимые поля таблицы Customer.
Для добавления второй формы выполните команду Add New Form (Добавить новую форму) из меню Form (Форма). В окне конструктора форм откроется вторая форма.
Скорректируйте свойство caption (Надпись) для второй формы, введя заголовок Итоговые суммы покупок,
Во второй форме создайте объект Grid (Таблица), разместив в нем поля представления данных Sumcust.
Рис. 15.23. Просмотр набора форм
Расположите формы на экране таким образом, чтобы они были удобны для поочередного просмотра.
Сохраните созданную форму, нажав кнопку Save (Сохранить) на стандартной панели инструментов.
Запустите форму на выполнение.
На экране открывается две формы (рис. 15.23). Просмотрев данные в первой форме, перейдите во вторую форму. Для этого активизируйте ее, щелкнув мышью в любом ее месте. Во второй форме вы можете просмотреть итоговые суммы покупок интересующего вас клиента.
Таймер
В Visual FoxPro существует объект, обрабатывающий данные системных часов, называемый таймером. Его можно использовать для отображения в форме системных часов, а также для выполнения определенных действий через заданный интервал времени. Например, используя объект данного типа, можно обновлять данные в таблицах.
Для размещения в форме таймера используется кнопка Timer (Таймер) на панели инструментов Form Controls (Элементы управления формы). Объект данного типа обладает свойствами, описанными в табл. 15.4.
Таблица 15.4. Назначение свойств объекта Timer
Свойство
Назначение
Interval (Интервал)
Интервал активизации объекта в миллисекундах
Enabled (Доступно)
Устанавливает режим работы таймера. Если значение свойства равно True (Истина), то таймер начинает отсчитывать время сразу же после запуска формы. В противном случае вы должны запустить таймер по какому-либо внешнему событию (например, при нажатии на кнопку)
Помимо вышеперечисленных свойств, для объекта Timer (Таймер) определяется событие Timer (Таймер), наступающее через каждый установленный в свойстве interval (Промежуток времени) промежуток времени. В процедуре обработки данного события необходимо определить действия, выполняемые с заданным интервалом.
Для запуска таймера используется метод Reset (Установить), не связанный с каким-либо событием. Поэтому вы должны выполнить его при наступлении каких-либо других событий, например, при нажатии кнопки запуска таймера.
Создание формы с использованием таймера
Рассмотрим пример использования таймера в форме, в которой через заданный интервал времени на экран будут выводиться данные о количестве продаж каждого товара на текущий момент времени. Форма будет отображать информацию из представления данных, содержащего наименование товара, суммарное количество проданного товара и сумму продаж по товару:
В Проекте Sales, ИСПОЛЬЗУЯ таблицы Goods, Ordsaled и Ordsalem, создайте представление данных, содержащее наименование товара, суммарное количество проданного товара и суммы продаж по данному товару.
Сгруппируйте данные по коду товара.
Сохраните созданное представление данных.
Откройте новое окно конструктора форм.
Откройте окно среды окружения формы и добавьте в него созданное представление.
Создайте в форме объект Grid (Таблица), разместив в нем все поля представления данных.
Для отображения текущей даты и времени расположите два поля ввода curdate и curtime. Скорректируйте для данных объектов свойство Readonly (Только чтение), установив значение True (Истина).
Для создания объекта-таймера нажмите кнопку Timer (Таймер) на панели инструментов Form Controls (Элементы управления формы) и расположите его в форме.
Откройте окно процедур для метода Timer (Таймер).
Для присвоения значений созданным полям curdate и curtime, а также для обновления данных о продаже товаров через заданный интервал времени введите в окне процедур следующие значения:
This.Parent.CurDate.Value = DATE()
This. Parent.CurTime.Value = TIME()
This.Parent.CurDate.Refresh()
This.Parent.CurTime.Refresh()
ThisForm.Gridl.Refresh()
Определите интервал времени, через который необходимо производить обновление данных в таблице. Для этого воспользуйтесь свойством interval (Промежуток времени), значение которого задается в миллисекундах. Для обновления данных каждые 10 мин введите значение 600 000.
Форма готова. Сохраните ее и запустите на выполнение.
Рис. 15.24. Использование таймера в форме
Рис. 15.25. Просмотр итоговых продаж через заданный промежуток времени
При работе в сети каждый час на экране будет обновляться информация об итоговом количестве продаж товаров и их стоимости. На рис. 15.24 показан вид созданной формы, а на рис. 15.25 — просмотр данных с помощью этой формы.
Добавление данных в список
В главе 6 мы рассматривали использование объектов типа ListBox (Список), которые значительно облегчают ввод данных в поля, одновременно избавляя от дополнительных ошибок, которые могут возникнуть при вводе. Список может формироваться из значений, содержащихся в поле таблицы, массива, запроса и т. п. В этой главе рассмотрим создание списка, значения которого вводятся в интерактивном режиме пользователем с использованием дополнительного поля ввода.
Создание списка рассмотрим на примере редактирования поля, содержащего город, для таблицы Customer. Для создания формы:
Откройте форму для ввода списка клиентов в окне конструктора форм.
Нажмите кнопку List Box (Список) на панели инструментов Form Controls (Элементы управления формы).
Установите указатель мыши на место предполагаемого расположения поля и, удерживая кнопку мыши в нажатом состоянии, переместите курсор по диагонали так, чтобы получилась рамка требуемого размера для поля списка.
Откройте окно свойств для размещенного в форме списка.
Скорректируйте свойство Name (Имя) созданного объекта, присвоив ему имя IstCity.
Чтобы связать созданное поле с полем таблицы customer, выберите свойство controisource (Источник данных). В поле ввода значения свойства воспользуйтесь кнопкой раскрытия списка и из списка всех полей открытой таблицы Customer выберите поле ccity.
Скорректируйте свойство RowSourceType (Тип источника данных), которое указывает тип источника данных. Выберите из списка значение Value (Значение), поскольку список городов будет формироваться с помощью вводимых значений.
Используя кнопку Text Box (Поле ввода) на панели инструментов Form Controls (Элементы управления формы), создайте под списком поле редактирования.
Скорректируйте свойство Name (Имя) поля редактирования, присвоив ему имя txtAddText.
Используя окно процедур свойства Keypress (Нажатие клавиши), введите в нем следующие команды:
LPARAMETERS nKeyCode, nShiftCtrlAlt
IF nKeyCode = 13 && 13 код клавиши <Enter>
IF 1EMPTY(THIS,Value)
* добавляем значение в список
THISFORM.lstCity.Addltem (THIS.Value}
ENDIF
* очищаем поле ввода
THIS.Value = ""
ENDIF
Эта процедура позволит пользователю ввести текст в поле ввода и нажатием клавиши <Enter> добавить значение в список, освободив окно для ввода следующей информации (рис. 15.26).
Рис. 15.26. Определение свойства KeyPress
Теперь при запуске формы на выполнение значения, введенные в поле ввода Поле формирования списка, при нажатии клавиши <Enter> переносятся в список городов (рис. 15.27).
Рис. 15.27. Формирование списка с помощью поля ввода в диалоговом режиме
Знаете ли Вы, в чем ложность понятия "физический вакуум"?
Физический вакуум - понятие релятивистской квантовой физики, под ним там понимают низшее (основное) энергетическое состояние квантованного поля, обладающее нулевыми импульсом, моментом импульса и другими квантовыми числами. Физическим вакуумом релятивистские теоретики называют полностью лишённое вещества пространство, заполненное неизмеряемым, а значит, лишь воображаемым полем. Такое состояние по мнению релятивистов не является абсолютной пустотой, но пространством, заполненным некими фантомными (виртуальными) частицами. Релятивистская квантовая теория поля утверждает, что, в согласии с принципом неопределённости Гейзенберга, в физическом вакууме постоянно рождаются и исчезают виртуальные, то есть кажущиеся (кому кажущиеся?), частицы: происходят так называемые нулевые колебания полей. Виртуальные частицы физического вакуума, а следовательно, он сам, по определению не имеют системы отсчета, так как в противном случае нарушался бы принцип относительности Эйнштейна, на котором основывается теория относительности (то есть стала бы возможной абсолютная система измерения с отсчетом от частиц физического вакуума, что в свою очередь однозначно опровергло бы принцип относительности, на котором постороена СТО). Таким образом, физический вакуум и его частицы не есть элементы физического мира, но лишь элементы теории относительности, которые существуют не в реальном мире, но лишь в релятивистских формулах, нарушая при этом принцип причинности (возникают и исчезают беспричинно), принцип объективности (виртуальные частицы можно считать в зависимсоти от желания теоретика либо существующими, либо не существующими), принцип фактической измеримости (не наблюдаемы, не имеют своей ИСО).
Когда тот или иной физик использует понятие "физический вакуум", он либо не понимает абсурдности этого термина, либо лукавит, являясь скрытым или явным приверженцем релятивистской идеологии.
Понять абсурдность этого понятия легче всего обратившись к истокам его возникновения. Рождено оно было Полем Дираком в 1930-х, когда стало ясно, что отрицание эфира в чистом виде, как это делал великий математик, но посредственный физик Анри Пуанкаре, уже нельзя. Слишком много фактов противоречит этому.
Для защиты релятивизма Поль Дирак ввел афизическое и алогичное понятие отрицательной энергии, а затем и существование "моря" двух компенсирующих друг друга энергий в вакууме - положительной и отрицательной, а также "моря" компенсирующих друг друга частиц - виртуальных (то есть кажущихся) электронов и позитронов в вакууме.
Однако такая постановка является внутренне противоречивой (виртуальные частицы ненаблюдаемы и их по произволу можно считать в одном случае отсутствующими, а в другом - присутствующими) и противоречащей релятивизму (то есть отрицанию эфира, так как при наличии таких частиц в вакууме релятивизм уже просто невозможен). Подробнее читайте в FAQ по эфирной физике.