Анимация
JavaScript


Главная  Библионтека 

0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 [ 118 ] 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146

ThisForm.ChangeGraphType Опишем для формы пользовательский метод ChangeGraphType: LOCAL NType

nType = ThisForm.cmbType.Value IF ThisForm.opgShow.Value = 1

* Двухмерный график ThisForm.olbGraph.Type = NType

ELSE

* Трехмерный график ThisForm.olbGraph.Type = NType + 8

ENDIF

Для выбора двухмерного или трехмерного вида графика разместим в форме две кнопки выбора в группе кнопок выбора opgShow.

В коде события InteractiveChange для объекта opgShow предусмотрим выполнение пользовательского метода:

ThisForm.ChangeGraphType

Опишем для формы пользовательский метод RefreshGraph: LOCAL cGraphString, nY lim cGraphString = ""

* Сколько полей должно участвовать в построении графика nY lim = Graphs.Y number + 1

SELECT Datafile

* Создаем список полей, разделенных через табулятор,

* в конце строки записываем символ CHR(13) FOR iCounter = 1 TO nY lim

cGraphString = cGraphString + FIELDS(iCounter) ; + IIF(iCounter << nY lim, CHR(9), CHR(13))

ENDFOR

* Приводим к символьному типу данные

* и формируем строку для передачи в OLE-объект

SCAN

FOR iCounter = 1 TO nY lim

cGraphString = cGraphString + IIF(TYPE(Fields(iCounter))=C,;

EVALUATE(FIELDS(iCounter)); ,str(EVALUATE(FIELDS(iCounter))));

+ IIF(iCounter << nY lim, CHR(9), CHR(13))

ENDFOR ENDSCAN

SELECT Graphs

APPEND GENERAL graph DATA cGraphString

Построение графиков с помощью MS Excel 7.0

Работу с объектами Excel проиллюстрируем на примере создания формы для анализа данных в виде графиков, функционально аналогичной рассмотренной выше. При использовании Excel мы не связаны такими жесткими ограничениями на работу с данными, как в MS Graph, за счет того, что в Excel есть доступ к данным, на основании которых строится график через объект Sheet. В MS Graph данные располагаются в DataSheet, но к ним можно обеспечить только интерактивный, а не программный доступ. В то же время использование возможностей Excel требует больше ресурсов компьютера и лицензионной копии пакета на компьютере пользователя, в то время как MS Graph поставляется в составе всех пакетов разработки Microsoft. Посмотрите оба варианта форм для вывода графиков и выберите для себя более подходящий.

Для воплощения нашей идеи в Конструкторе формы создадим следующие объекты.

* oleChart - это объект OLE Container Control, с помощью которого мы встраиваем график Excel в форму. Нажимаем на панели инструментов Form Controls кнопку OLE Container Control и обводим в форме контур будущего графика. На экран выводится диалоговое окно Insert Object, в котором мы выбираем объект Excel Chart. Нажимаем кнопку OK и в обведенном контуре появляется график Excel, построенный на основании принятых по умолчанию данных, расположенных на втором рабочем листе таблицы. Одновременно, в соответствии с принципом редактирования на месте, изменяется главное меню Visual FoxPro для предоставления нам возможности отредактировать внешний вид представленного графика. Впоследствие можно вернуться к интерактивному



редактированию графика, нажав на этом объекте правую кнопку мыши и выбрав в контекстном меню команду 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



>> 3 = 0

IF ThisForm.nSubType ThisForm.nSubType

ENDIF

ThisForm.nSubType = ThisForm.nSubType + 1 ThisForm.OleChart.SubType = ThisForm.nSubType

Для некоторых типов графиков в Excel существует меньшее число подтипов или их вообще не существует. В этом случае при нажатии на кнопку "Подтип" изменений в графике не произойдет. При необходимости можно учесть эти нюансы, слегка модернизировав приведенный выше фрагмент.

В событии Click для объекта cmdExit для закрытия формы запишем следующий код:

RELEASE ThisForm

В завершение нам осталось включить в объект DataEnvironment формы таблицы, которые будем использовать в качестве источника данных для графика. Внешний вид формы приведен на рис. 10.7.

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 запишем следующий код:



0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 [ 118 ] 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146