лабы / gorev_akhajan_makakshiripov_ehffektivnaja_rabota_s_subd
.pdfредактированию графика, нажав на этом объекте правую кнопку мыши и выбрав в контекстном меню команду Edit.
•cmdExit - кнопка управления для выхода из формы. Свойству Caption присвоим значение
"OK".
•cmdType - кнопка управления для изменения типа графика. При нажатии на кнопку будет происходить изменение типа графика. Свойству Caption присвоим значение "Тип".
•cmdSubType - кнопка управления для изменения подтипа графика. При нажатии на кнопку будет происходить изменение подтипа графика. Свойству Caption присвоим значение "Подтип".
•cmbData - комбинированный список для изменения данных для графика. Для этого объекта установим следующие значения свойств, отличных от принятых по умолчанию, после того как разместим элемент управления в форме:
BoundColumn = 2
ColumnCount = 2
ColumnWidths = 150,0
FirstElement = 1
Name = cmbData
NumberOfElements = ALEN(aDataTables)
RowSource = aDataTables
RowSourceType = 5
Style = 2
Value = "Total1"
Как видно из перечисленных свойств, для формирования данных в списке мы будем использовать двумерный массив aDataTables. Первую колонку массива отведем для списка данных, доступных для графического отображения. Именно этот список будет видеть пользователь. Во второй колонке разместим названия источников данных (таблиц или курсоров). При запуске формы в списке будет выбран первый пункт, и для построения графика будет использована таблица Total1.
Остальные элементы управления не являются обязательными и служат для улучшения внешнего вида формы.
Для описания массива, используемого в комбинированном списке в событии Load объекта Form, запишем:
PUBLIC aDataTables(3,2) aDataTables(1,1) = "Результаты продаж" aDataTables(2,1) = "Доход" aDataTables(3,1) = "Прибыль" aDataTables(1,2) = "Total1" aDataTables(2,2) = "Total2" aDataTables(3,2) = "Total3"
Этот массив можно описать в пользовательской программе и вне формы, и тогда набор данных, доступных для графического отображения, можно будет изменять. С этой целью в качестве источника данных для комбинированного списка можно использовать и таблицу с двумя полями, которую легче редактировать, чем массив.
Для изменения данных на графике в соответствии с изменением выбранного пункта в списке в событии InteractiveChange объекта cmbData запишем следующий код:
ThisForm.LockScreen = .T. SELECT (ThisForm.cmbData.Value)
&& Устанавливаем рабочую область nRow = 2
SCAN && Считываем данные
ThisForm.oleChart.Object.Parent.Sheets("Sheet1").; Cells(nRow,2).;
Value = Sum1 ThisForm.oleChart.Object.Parent.Sheets("Sheet1").; Cells(nRow,3).;
Value = Sum2 ThisForm.oleChart.Object.Parent.Sheets("Sheet1").;
Cells(nRow,4).; Value = Sum3
Ⱦɚɧɧɚɹ ɜɟɪɫɢɹ ɤɧɢɝɢ ɜɵɩɭɳɟɧɚ ɷɥɟɤɬɪɨɧɧɵɦ ɢɡɞɚɬɟɥɶɫɬɜɨɦ %RRNV VKRS Ɋɚɫɩɪɨɫɬɪɚɧɟɧɢɟ ɩɪɨɞɚɠɚ ɩɟɪɟɡɚɩɢɫɶ ɞɚɧɧɨɣ ɤɧɢɝɢ ɢɥɢ ɟɟ ɱɚɫɬɟɣ ɁȺɉɊȿɓȿɇɕ Ɉ ɜɫɟɯ ɧɚɪɭɲɟɧɢɹɯ ɩɪɨɫɶɛɚ ɫɨɨɛɳɚɬɶ ɩɨ ɚɞɪɟɫɭ piracy@books-shop.com
nRow = nRow + 1 ENDSCAN ThisForm.LockScreen = .F.
Здесь мы использовали блокировку изменения данных в форме, чтобы предотвратить последовательное изменение данных в каждом столбце графика (первая и последняя строка фрагмента кода). После ссылки на объект oleChart необходимо использовать свойство Object для того, чтобы Visual FoxPro понял, что указанное далее свойство Parent относится к объекту Excel. В противном случае Visual FoxPro решит, что мы ссылаемся на объект Form - родительский объект для объекта oleChart. Свойство Parent для объекта Excel нам необходимо для того, чтобы сослаться на объект Workbook. Только после этого мы можем использовать метод Sheets для получения ссылки на рабочий лист Sheet1, на котором находятся данные. Метод Cells позволяет нам указать конкретную ячейку таблицы, в которой мы хотим поменять данные с помощью свойства Value. Значения Sum1, Sum2 и Sum3 - это поля в таблицах, которые используются как источники данных для построения графиков и отображают изменение какого-то показателя во времени.
Для отображения данных из первой таблицы при запуске формы в событии Init объекта Form следует поместить такой код:
ThisForm.cmbData.Value = ThisForm.cmbData.List(1,2)
ThisForm.cmbData.InteractiveChange
Добавим в форму собственные свойства NType и nSubType для задания типа и подтипа выводимого графика. Для этого достаточно в меню Form выбрать команду New Property. По умолчанию присвоим им значения 3 и 1 соответственно.
В событии Click для объекта cmdType запишем следующий код:
IF ThisForm.nType >> 13
ThisForm.nType = 0
ENDIF
ThisForm.nType = ThisForm.nType + 1
ThisForm.OleChart.Type = ThisForm.nType
Это обеспечит приращение значения для типа графика при нажатии на кнопку "Тип" и сброс значения на начало отсчета при исчерпании числа типов графика.
В событии Click для объекта cmdSubType запишем следующий код:
IF ThisForm.nSubType >> 3
ThisForm.nSubType = 0
ENDIF
ThisForm.nSubType = ThisForm.nSubType + 1
ThisForm.OleChart.SubType = ThisForm.nSubType
Для некоторых типов графиков в Excel существует меньшее число подтипов или их вообще не существует. В этом случае при нажатии на кнопку "Подтип" изменений в графике не произойдет. При необходимости можно учесть эти нюансы, слегка модернизировав приведенный выше фрагмент.
Всобытии Click для объекта cmdExit для закрытия формы запишем следующий код: RELEASE ThisForm
Взавершение нам осталось включить в объект DataEnvironment формы таблицы, которые мы будем использовать в качестве источника данных для графика.
Внешний вид формы приведен на рис. 10.7.
www.books-shop.com
Рис. 10.7. Форма для представления графиков с помощью MS Excel 7.0
В современных условиях все больше специалистов могут самостоятельно использовать стандартные пакеты программ. Например, готовить графики и другую расчетную информацию с помощью пакета Excel. В этом случае достаточно только правильно импортировать данные из СУБД в Excel. Один из возможных способов представлен ниже. Он реализован в форме "Характеристика модели автомобиля", разработка которой была описана в предыдущей главе.
Программный код для передачи данных в Microsoft Excel:
oleExcel=CREATEOBJECT("Excel.Application") &&Создаем объект Excel oleExcel.Visible=.T. && Делаем его видимым
oleExcel.Workbooks.Add && Добавляем Книгу oleExcel.Selection.ColumnWidth = 20 && Ширина 1 колонки oleExcel.Range("B1").Select oleExcel.Selection.ColumnWidth = 12 && Ширина 2 колонки oleExcel.Range("C1").Select oleExcel.Selection.ColumnWidth = 12 && Ширина 3 колонки oleExcel.Columns("A:A").Select && Отмечаем 1 колонку oleExcel.Selection.WrapText = .T.
&&Перенос непоместившихся символов на следующую строку oleExcel.Range("A1:C1").Select oleExcel.Selection.HorizontalAlignment =7
&&Заголовок размещаем в 1, 2 и 3 ячейках первой строки oleExcel.Range("A2:C2").Select oleExcel.Selection.HorizontalAlignment = -4108
&&Центрируем 1, 2 и 3 ячейки второй
&&строки
oleExcel.Columns("A:B").Select oleExcel.Selection.Borders(2).Weight=2 && Линия справа oleExcel.Columns("A:C").Select oleExcel.Selection.Borders(3).Weight=2 && Нижняя линия oleExcel.Range("A2:C2").Select oleExcel.Selection.Borders(3).Weight=-4138
&&Верхняя линия oleExcel.Selection.Borders(4).Weight=-4138
&&Нижняя линия
oleExcel.Range("A1:C1").Select oleExcel.Selection.Font.Bold = .T. oleExcel.Selection.Font.ColorIndex = 25
oleExcel.ActiveCell.FormulaR1C1 = "Характеристика модели автомобиля" oleExcel.Range("A2").Select
oleExcel.ActiveCell.FormulaR1C1 = "Наименование модели" oleExcel.Range("A2:C2").Select oleExcel.Selection.Font.Bold = .T. oleExcel.Range("B2").Select
www.books-shop.com
oleExcel.ActiveCell.FormulaR1C1 = "Мощность" oleExcel.Range("C2").Select oleExcel.ActiveCell.FormulaR1C1 = "Крутящий момент"
******* Добавления значений *******
FOR I=1 TO KOL_Z oleExcel.Cells(i+2,1).Value = all_value(i,1) oleExcel.Cells(i+2,2).Value = all_value(i,2) oleExcel.Cells(i+2,3).Value = all_value(i,3) ENDFOR
******* Строим диаграмму *******
oleExcel.ActiveSheet.ChartObjects.Add(245, 10, 340, 270).Select oleExcel.ActiveChart.; chartwizard(oleExcel.range(oleExcel.cells(2,1),oleExcel.cells(12,3)),; -4100,5,1,1,1,2,"Десять лучших","","","")
&&Где:
&&Gallery - -4100,
&&Format - 5,
&&PlotBy - 1,
&&CategoryLabels - 1,
&&SeriesLabels - 1,
&&HasLegend - 2,
&&Title - "Десять лучших",
&&CategoryTitle - "",
&&ValueTitle - "",
&&ExtraTitle - ""
******* Изменяем угол просмотра *******
oleExcel.ActiveChart.Elevation = 0 oleExcel.ActiveChart.Rotation = 328
Результат выполнения данного кода представлен на рис. 10.8.
Рис. 10.8.
Построение отчета в Word for Windows
Чрезвычайно популярным пакетом для подготовки текстовой информации в нашей стране является текстовый процессор Word for Windows. Поэтому вполне объяснимо желание пользователя увидеть нужные ему данные в любимом редакторе и самостоятельно преобразовать
www.books-shop.com
их в требуемый вид. Приведем образец кода для передачи данных из формы "Характеристика модели автомобиля" в Microsoft Word:
oleWord=CREATEOBJECT("Word.Basic")
oleWord.FileNewDefault
oleWord.AppShow
oleWord.FilePageSetup(,,"2,54 см","2,54 см","2,5 см","1,5 см","0 см","21 см","29,7 см") oleWord.FormatFont("14",0,9,0,0,0,0,1,0,"0 пт","0 пт",0,"", ,"Times New Roman Cyr", , 1) oleWord.FormatParagraph( "0 см", "0 см","0 пт","0 пт", 0,"",1,1, 0, 0, 0, 0, 0,"0","0 см") oleWord.Insert("Характеристика модели автомобиля")
oleWord.InsertPara
oleWord.InsertPara
*********Создание таблицы***************
oleWord.TableInsertTable( ,"3",ALLT(STR(Kol_z+1))) oleWord.TableSelectColumn && Выделение колонки oleWord.LeftPara && Выравнивание по левому краю oleWord.TableSelectTable && Выделение таблицы oleWord.TableRowHeight("0",2,"25 пт","0 см", 0,1) oleWord.TableSelectColumn && Выделение колонки oleWord.LineDown(1)
oleWord.LineUp(1)
oleWord.TableSelectColumn && Выделение колонки
oleWord.TableColumnWidth("11 см","0,38 см") && Установка ширины выделенной колонки oleWord.NextCell
oleWord.NextCell
oleWord.TableSelectColumn && Выделение колонки oleWord.TableColumnWidth("3,5 см","0,38 см") oleWord.NextCell
oleWord.NextCell
oleWord.TableSelectColumn && Выделение колонки oleWord.TableColumnWidth("3,5 см","0,38 см") oleWord.TableSelectTable && Выделение таблицы
oleWord.FormatBordersAndShading (3, 0, 2, 2, 2, 2, 1, 1, 0, 0, 0, 0, 0, 0, "0 пт", 0, 0, 0,"0", -1) oleWord.CharRight(1)
oleWord.LineUp(1)
oleWord.TableSelectRow && Выделение ряда oleWord.TableHeadings
oleWord.Bold
oleWord.CenterPara oleWord.FormatParagraph("","","","",4,"25 пт") oleWord.CharLeft(1) oleWord.Insert("Наименование модели") oleWord.NextCell
oleWord.Insert("Мощность") oleWord.NextCell oleWord.Insert("Крутящий момент") oleWord.NextCell
******* Добавления значений в таблицу*******
FOR I=1 TO KOL_Z oleWord.Insert(all_value(i,1)) oleWord.NextCell oleWord.Insert(STR(all_value(i,2))) oleWord.NextCell oleWord.Insert(STR(all_value(i,3))) IF I<<KOL_Z
oleWord.NextCell ENDIF
ENDFOR
Результат выполнения данного кода представлен на рис. 10.9.
www.books-shop.com
Рис. 10.9. Пример передачи данных в Microsoft Word
Запись информации в Schedule+
Используя возможности OLE Automation и наличие в составе пакета Microsoft Office специальной программы для планирования - Schedule+, мы можем расширить возможности нашего приложения за счет включения в него функций бизнес-планирования.
Microsoft Schedule+ является средством бизнес-планирования, которое может использоваться в локальном режиме и в режиме совместного доступа. Программа Schedule+ является OLEсервером, и поэтому мы можем использовать объекты этой программы для хранения, планирования и управления сведениями о встречах, собраниях, задачах, контактах и событиях. При планировании в расписание заносится оповещение, что позволяет не забыть о важной встрече, задаче или событии.
Организация объектов в Schedule+ несколько отличается от Excel или MS Graph. Здесь имеются два типа объектов: таблица и пункт. Каждая таблица состоит из определенного количества строк, которые и представляются пунктами. Каждый пункт имеет определенный набор свойств. Описанная структура приведена на рис. 10.10.
Рис. 10.10. Структура объектов в Schedule+
В качестве объектов типа таблица рассматриваются основные функциональные возможности Schedule+. Это запланированные события (Appointments), записи о лицах (Contacts), предупреждения (Alarms) и т. д. В свою очередь каждое событие, запись и т. п. является объектом типа пункт и имеет набор свойств. Например, для того чтобы записать сведения о новом лице в Visual Basic, необходимо выполнить такую программу:
Sub NewContact()
www.books-shop.com
Dim oSchedApp As Object, oSchedTable As Object, oSchedItem As Object * Запускаем скрытую копию Schedule+
Set oSchedApp = CreateObject("SchedulePlus.Application")
*Проводим процедуру регистрации
If Not oSchedApp.LoggedOn Then oSchedApp.LogOn
End If
*Устанавливаем ссылку на объект типа таблица.
*Свойство ScheduleLogged возвращает объект планирования для
*зарегистрированного пользователя.
Set oSchedTable = oSchedApp.ScheduleLogged.Contacs
*Устанавливаем ссылку на объект типа пункт (новый пункт в таблице) Set oSchedItem = oSchedTable.New
*Записываем в пункт данные с помощью его свойств oSchedItem.SetProperties FirstName:="Андрей", LastName:="Горев", _ Notes:="Эффективная работа с СУБД на основе решений Microsoft", _ PhoneBusiness:="(812)259-4277", PhoneFax:="(812) 112-6872"
`Стираем ссылки на объекты
Set oSchedItem = Nothing
Set oSchedTable = Nothing
Set oSchedApp = Nothing
End Sub
После выполнения этой программы откройте Schedule+, и вы увидите, что на вкладке Contacts появилась новая запись.
Совершенно аналогично можно записать в Schedule+ какое-либо планируемое событие. В этом случае дата и время начала и окончания планируемого события должны быть указаны обязательно.
Sub NewAppoint()
Dim oSchedApp As Object, oSchedTable As Object, oSchedItem As Object
Set oSchedApp = CreateObject("SchedulePlus.Application")
If Not oSchedApp.LoggedOn Then
oSchedApp.LogOn
End If
'Устанавливаем ссылку на таблицу планируемых событий
Set oSchedTable = oSchedApp.ScheduleLogged.Appointments
'Создаем новое событие, в котором хотим участвовать
Set oSchedItem = oSchedTable.New
'Описываем это событие oScedItem.SetProperties Text:="DevCon97", _
Notes:="Ежегодная международная конференция разработчиков Microsoft", _ Start:=("06/10/97 10:00"), _
End:=("06/13/97 18:00")
'Стираем ссылки на объекты
Set oSchedItem = Nothing
Set oSchedTable = Nothing
Set oSchedApp = Nothing
End Sub
10.4. Применяем ActiveX
В этом параграфе на примерах иерархического списка и календаря мы опишем, как можно использовать элементы ActiveX в пользовательском приложении.
Иерархический список
Одним из поставляемых компонентов ActiveX (OCX) для средств разработки Microsoft является Outline. Необходимо сказать, что элемент управления Outline (файл MSOUTL32.OCX) представляет собой особую разновидность списка, в котором можно отображать элементы в иерархическом порядке. Этим пользуются при схематическом изображении каталогов и файлов в файловой системе. Именно такой метод применен в Windows 95 и Windows NT 4.0.
У каждого элемента в списке Outline могут быть подчиненные элементы, которые визуально
www.books-shop.com
представляются дополнительными уровнями с отступами. Когда элемент развертывается, его подчиненные элементы становятся видимыми. Когда элемент сворачивается, его подчиненные элементы скрываются. Элементы в списке Outline могут также сопровождаться графикой, служащей визуальным обозначением состояния элемента.
Элемент списка может сопровождаться любыми графическими элементами из числа следующих:
•Линии древовидной структуры. Вертикальные и горизонтальные линии, связывающие первичные элементы с подчиненными. Линия дерева генерирует события Expand и Collapse.
•Отступ. Характеристика уровня подчиненности элемента. Каждый уровень отступа соответствует определенному уровню подчиненности, который вы задаете с помощью свойства Indent.
•Значок "плюс/минус". Указывает, видимы подчиненные элементы или скрыты. Если щелкнуть мышкой на значке "плюс", подчиненные элементы становятся видимыми и значок "плюс" заменяется значком "минус". Если щелкнуть мышкой на значке "минус", подчиненные элементы скрываются и значок минус заменяется значком "плюс".
•Изображения типа. Отображают состояние элемента. На рисунках с изображением типа обычно показывается, допускает ли элемент, обладающий подчиненными элементами, развертывание или свертывание. Например, изображение закрытой папки указывает на то, что элементы каталога можно развернуть. Состояние элемента определяется пользователем. Рисунок с изображением типа генерирует события PictureClick и PictureDblClick.
•Текст. Символьная строка, отображаемая для элемента.
Каждый графический элемент может представлять собой область, которая способна реагировать на действия пользователя. Если щелкнуть на изображении элемента, активизируется специальная группа событий.
Свойство Style позволяет задать или запретить отображение всех или некоторых графических элементов для каждого элемента списка Outline.
Чтобы выбрать элемент списка, необходимо щелкнуть (или дважды щелкнуть) на строке с соответствующим текстом. Щелчка мышкой только на графическом элементе недостаточно.
В качестве примера рассмотрим создание формы для Администратора БД, с помощью которой он может проконтролировать доступ пользователей к полям и таблицам БД. Для отображения структуры данных в БД Auto_Store используем элемент управления Outline.
Итак, начнем с того, что в Visual FoxPro создадим новую форму. Затем, выбрав команду Options из меню Tools, активизируем вкладку Controls. На данной вкладке в списке Selected установим крестик на пункте Outline Control, как это показано на рис. 10.11. Далее нажмем кнопку View Classes панели инструментов Controls и в открывшемся меню выберем OLE Controls. На рис. 10.12 показано меню кнопки View Classes. Таким образом, у вас появится возможность визуально поместить данный элемент управления в форму посредством нажатия кнопки Outline Control (рис. 10.13). Однако в Visual FoxPro есть и более простой способ подключения элементов управления ActiveX, включающий в себя ледующие действия:
www.books-shop.com
Рис. 10.11.
Рис. 10.12.
Рис. 10.13.
1.Создаем новую форму.
2.Нажимаем кнопку OLE Container Control панели инструментов Controls.
3.Обводим мышкой контур на форме для элемента управления Outline Control.
4.В открывшемся диалоговом окне Insert Object выбираем кнопку Insert Control и в списке
Control Type дважды щелкаем по элементу Outline Control (рис. 10.14).
Независимо от выбранного варианта действия в форме появится новый объект (рис. 10.15). Для определения свойств объекта Outline нажмите правую кнопку мыши на данном объектом и из контекстного меню выберите команду Properties.
www.books-shop.com
Рис. 10.14. Диалоговое окно Insert Object для размещения объекта Outline Control
Рис. 10.15. Элемент управления Outline в разрабатываемой форме
Для определения собственных изображений в иерархическом списке в диалоговом окне
Properties активизируем вкладку Pictures, где для свойств PictureClosed и PictureOpen установим соответствующие графические файлы. Найти их на диске можно с помощью диалогового окна, вызываемого при нажатии кнопки Browse (рис. 10.16).
www.books-shop.com
