- •Глава1 Постановка задачи и разработка бизнес-правил
- •1.1.Некоторые определения
- •Глава2 Основы теории проектирования баз данных
- •Глава3 Обзор возможностей и особенностей различных СУБД
- •3.5.MS SQL Server
- •Глава4 Основы языка программирования
- •4.3. "Горячая десятка"
- •Глава5 Объектно-ориентированное программирование
- •5.1.Объектная модель и ее свойства
- •Объекты для работы с данными
- •Объекты для управления работой приложения
- •Объекты для оформления интерфейса пользователя
- •Объекты-контейнеры
- •Невизуальные объекты
- •Объекты OLE
- •Глава6 Создание базы данных
- •6.1.Visual FoxPro
- •Создание и модернизация структуры базы данных
- •Использование словаря данных
- •Создание и модернизация структуры таблиц
- •Глава7 Средства работы с данными
- •Запросы выборки
- •Запросы добавления
- •Запросы обновления
- •Запросы удаления
- •Запрос добавления
- •Запрос - Создание таблицы
- •Запрос удаления
- •Запрос обновления
- •Перекрестный запрос
- •Microsoft Access
- •Глава8 Использование технологии клиент-сервер
- •8.1. Работа с внешними данными с помощью технологии ODBC
- •Команды Transact-SQL
- •Создание представлений
- •Создание триггеров
- •Синхронный и асинхронный процессы
- •Создание внешних представлений
- •9.1.Инструментарий разработчика
- •Создание формы "Прием заказов" на Access
- •Разработка меню в Visual FoxPro
- •Разработка меню в Access
- •Глава10 Использование готовых компонентов в приложении
- •10.1.Основные преимущества модульного проектирования прикладных программ
- •Управление объектами Excel
- •Управление объектами Word for Windows
- •Построение графиков с помощью MS Graph 5.0
- •Построение отчета в Word for Windows
- •Запись информации в Schedule+
- •10.4.Применяем ActiveX
- •Иерархический список
- •Календарь
- •Глава11 Подготовка отчетных данных
- •11.1.Создание отчетов в Visual FoxPro
- •Управление режимом печати
- •Глава12 Подготовка и отладка пользовательского приложения
- •12.1.Общие принципы отладки приложения
- •Отладка программы в Access
- •Обработка ошибок процессора баз данных в Access
- •Отладка программы в Visual Basic
- •Визуальные средства проектирования
- •Поставка программного пакета
- •Требования к установке
- •Project Manager
- •Работа с кодом программы
- •Создание базы данных
- •Работа с данными
- •Расширение возможностей технологии клиент-сервер
- •Построение пользовательского интерфейса
- •Расширение функций OLE
- •Отладка приложения
converted to PDF by HupBaH9I
GETOBJECT([FileName ][, ClassName])
Параметр FileName позволяет указать имя существующего файла (и при необходимости путь к нему), содержащего OLE-объект, который необходимо активизировать. С помощью параметра ClassName можно указать имя объекта верхнего уровня (класс OLE-объекта). Это необходимо в том случае, если, как мы это показали на примере Microsoft Excel, в приложении в одном файле может храниться несколько объектов верхнего уровня, например таблицы, графики и т. д. В данном случае для параметра должен использоваться следующий синтаксис:
<<"Имя приложения">>.<<"Имя объекта верхнего уровня">> Например:
oSht = GETOBJECT("C:\VFP\SAMPLE\VAT.XLS","EXCEL.SHEET")
В Visual Basic и соответственно Access мы можем использовать аналогичные функции, но для обеспечения ссылки на объект необходимо применять оператор Set, как показано в следующих примерах:
` В первом примере создаем объект MS Excel Dim oExlApp As Object
' Объявляем переменную для ссылки на объект
Set oExlApp = CreateObject("Excel.Application") ` Создаем объект
oExlApp.Visible = True ' Выводим объект на экран
...
oExlApp.Quit ' После окончания работы закрываем Excel Set oExlApp = Nothing ' Стираем ссылку на объект из памяти ` Во втором примере ссылаемся на объект MS Excel
Dim oExlApp As Object
Set oExlApp = GetObject("C:\VFP\SAMPLE\VAT.XLS","Excel.Sheet")
...
Set oExlApp = Nothing
Управление объектами Excel
Для того чтобы остановиться на проблемах взаимодействия пользовательского приложения с объектами Excel, нам придется более подробно обсудить специфические в данном случае особенности работы функций CREATEOBJECT() и GETOBJECT(). Поэтому систематизируем необходимые данные для важнейших объектов верхнего уровня Microsoft Excel и приведем их в табл. 10.2.
Таблица 10.2. Поведение объектов верхнего уровня Microsoft Excel
Объект Функция |
Описание поведения |
Application CreateObject Всегда запускает невидимую копию Microsoft Excel. Файл
рабочей книги не загружается.
GetObject Если параметр FileName
представляет собой пустую строку, запускается новая невидимая копия Microsoft Excel без загрузки файла рабочей книги. Если параметр пропущен, то
предпринимается попытка получить ссылку на уже запущенную копию Microsoft Excel и в случае неудачи генерируется ошибка. Не
указывайте в параметре FileName имя файла. Для
этого случая используйте объекты Sheet или Chart.
Sheet или CreateObject Если не существует
|
converted to PDF by HupBaH9I |
Chart |
запущенной копии Microsoft |
|
Excel, то запускается |
|
невидимая копия и создается |
|
рабочая книга с именем |
|
"Object" и один рабочий лист |
|
с именем "Sheet1". Для |
|
объекта Chart помимо этого |
|
создается еще один рабочий |
|
лист с именем "Chart1". Как |
|
только ссылка на созданный |
|
объект перестает |
|
существовать (стирается), |
|
рабочая книга удаляется, но |
|
Excel остается загруженным в |
|
памяти компьютера. Если |
|
одна или несколько копий |
|
Microsoft Excel уже |
|
запущены, то добавляется |
|
рабочая книга с |
|
параметрами, как это было |
|
описано в предыдущем |
|
абзаце. В случае, когда уже |
|
работает несколько копий |
|
Excel, предугадать, в какой |
|
из них будет добавлена |
|
таблица, невозможно. |
GetObject |
Если параметр FileName |
|
является допустимым |
|
(существующим) именем |
|
файла и Microsoft Excel не |
|
запущен, то запускается |
|
новая невидимая его копия с |
|
невидимой рабочей книгой. |
|
Если хотя бы одна копия |
|
Microsoft Excel уже запущена, |
|
рабочая книга открывается в |
|
ней. При этом будет |
|
получена ошибка, если |
|
указанное в функции имя |
|
файла совпадет с уже |
|
открытым файлом в |
|
загруженной копии Excel. |
|
Если параметр FileName |
|
задан в виде пустой строки |
|
("") и если не существует |
|
запущенной копии Microsoft |
|
Excel, то запускается |
|
невидимая ее копия и |
|
создается рабочая книга с |
|
именем "Object" и один |
|
рабочий лист с именем |
|
"Sheet1". Если параметр |
|
FileName задан в виде пустой |
|
строки ("") и если хотя бы |
|
одна копия Microsoft Excel |
|
загружена в память, то в |
|
одной из них открывается |
|
рабочая книга, как это было |
|
описано выше. Если |
|
параметр FileName не указан, |
|
всегда генерируется ошибка. |
Как вы можете заметить, изучив табл. 10.2, создание объектов OLE Automation или обращение к ним в Microsoft Excel зачастую может привести к совершенно различным последствиям. Почти
converted to PDF by HupBaH9I
всегда Excel создает невидимую копию приложения. Для того чтобы сделать ее видимой для пользователя, надо присвоить свойству Visible объекта Application значение "истина":
...Application.Visible = .T.
Если создается невидимая копия рабочей книги, то сделать ее видимой можно, присвоив значение "истина" свойству Visible окна:
...Window(n).Visible = .T.
В некоторых случаях Excel при запуске посредством OLE Automation не открывает новый файл. Тогда это придется сделать с помощью метода Add коллекции Workbooks:
...Workbooks.Add
Для завершения обсуждения проблем, связанных с объектами верхнего уровня Microsoft Excel, приведем несколько примеров.
Объект Application
oApp = CREATEOBJECT("EXCEL.APPLICATION") oApp = GETOBJECT(" ","EXCEL.APPLICATION")
Любая из этих строк приведет к запуску новой копии Excel в скрытом виде.
oApp = GETOBJECT(,"EXCEL.APPLICATION")
Обеспечит ссылку на текущее приложение Excel. Если же Excel на компьютере не запущен, будет сгенерировано сообщение об ошибке.
Объект Sheet
oExSheet = CREATEOBJECT("EXCEL.SHEET") FOR nVal = 1 TO 10
oExlSheet.Cells(nVal, nVal).Value = nVal * nVal ENDFOR
*Если хотите увидеть результат, уберите комментарий в следующий строке
*oExlSheet.Application.Visible = .T.
oExlSheet.SaveAs("TEMP.XLS")
Создает новый рабочий лист в запускаемой невидимой копии Excel и заполняет его цифрами так, как это показано на рис. 10.4. Созданная таблица сохраняется в файле TEMP.XLS в папке, установленной по умолчанию для Excel.
converted to PDF by HupBaH9I
Рис. 10.4. oExlSheet = GETOBJECT("RAS_1.XLS", "EXCEL.SHEET") oExlSheet.Range("G2").Value = 16 oExlSheet.Range("G3").Value = 10 oExlSheet.Parent.Save && Сохраняем рабочую книгу
? oExlSheet.Range("G4").Value
Создает ссылку на первый рабочий лист в файле RAS_1.XLS. Файл в данном случае должен располагаться в папке, указанной по умолчанию для приложения, использующего OLE Automation, иначе необходимо указать путь к нему. В этот файл, содержащий результаты расчетов, мы заносим новые данные в ячейки G2 и G3, сохраняем данные, а затем выводим результат вычислений из ячейки G4, где записана формула, вычитающая G3 из G2.
Объект Chart
oExlChart = CREATEOBJECT("EXCEL.CHART")
* Стираем данные по умолчанию на рабочем листе со значениями oExlChart.Parent.Sheets(2).Range("A1:D10").Clear
FOR nVal = 1 TO 10
* Заполняем таблицу новыми значениями oExlChart.Parent.Sheets(2).Cells(nVal,1).Value = nVal oExlChart.Parent.Sheets(2).Cells(nVal,2).Value = nVal * nVal
NEXT
*Строим график по новым значениям по колонкам oExlChart.ChartWizard(oExlChart.Parent.Sheets(2).Range("A1:B10"),,,2)
*Смотрим, что получилось
oExlChart.Application.Visible = .T. WAIT
Создается новый рабочий лист с диаграммой. Сначала мы аполняем необходимыми данными второй рабочий лист, на котором размещаются данные. Затем с помощью метода ChartWizard обновляем диаграмму на первом рабочем листе. В методе ChartWizard из большого числа параметров мы устанавливаем только область данных и условие построения его по колонкам. Остальные параметры принимают значения по умолчанию. После этого выводим Excel на экран и используем команду WAIT для того, чтобы рабочая книга не была выгружена после завершения работы программы.
oExlChart = GETOBJECT("RAS_1.XLS", "EXCEL.CHART") oExlChart.ChartTitle.Text = "Результаты продаж"
Создает ссылку на первый рабочий лист с диаграммой в файле RAS_1.XLS. В файле должен быть предварительно создан объект Chart с помощью команды Chart в меню Insert.
Управление объектами Word for Windows
converted to PDF by HupBaH9I
При работе с объектами Word for Windows функция CREATEOBJECT() запускает новую копию приложения только в том случае, если на компьютере это приложение еще не работает. При этом функция GETOBJECT() не может использоваться для ссылки на документ. Если она используется
в виде
oWrd = GETOBJECT(" ","WORD.BASIC")
то ее применение аналогично функции CREATEOBJECT().
Задание функции в виде
oWrd = GETOBJECT(,"WORD.BASIC")
всегда приводит к ошибке.
В отличие от Excel текстовый процессор Word for Windows имеет только один объект OLE Automation - WordBasic (в синтаксисе мы пишем Word.Basic). Это означает, что управлять документом Word из другого приложения мы можем только посредством выполнения команд
WordBasic.
Для того чтобы продемонстрировать пример создания объекта Word, решим классическую для любого начинающего программиста задачу - выведем на экран слово "Hello!" В связи с тем, что
читатель одиннадцатой главы этой внушительной по объему книги вряд ли захочет относить себя к начинающим программистам, усложним задачу. Загрузим на компьютере Word и Access. Теперь, находясь в Access, напишем заветное слово в документе Word.
Для решения этой задачи в контейнере БД Access перейдем на вкладку Модули. На панели инструментов нажмем кнопку Вставить процедуру. В появившемся диалоговом окне напишем ее название, например CallWord. В окне Модуль напишем следующий код:
Public Function CallWord() As Integer Dim oWbApp As Object
Set oWbApp = CreateObject("Word.Basic") oWbApp.FileNew ` Открываем новый документ oWbApp.Insert "Hello!" ` Вписываем в документ слово
Set oWbApp = Nothing Exit Function
End Function
Запустите этот модуль на выполнение. Напоминаем простейший способ сделать это - нажмите кнопку на панели инструментов Окно отладки и в появившемся окне наберите имя процедуры, после чего нажмите клавишу Enter. Смело переходите в Word и рассматривайте появившееся там слово.
Если вас испугало многообразие объектов в Excel и вы уже обрадовались наличию в Word всего одного объекта, то, возможно, ваша радость преждевременна. При управлении документом Word с помощью OLE Automation есть одна существенная для программиста неприятность.
Команды WordBasic используют поименованные аргументы, а посредством OLE Automation ссылаться на аргументы можно только по их положению. Например, вы хотите отключить вывод предупреждения при сохранении документа. В файле контекстной справки WordBasic вам будет подсказан следующий синтаксис команды ToolsOptionsSave
ToolsOptionsSave [.CreateBackup = number] [, .FastSaves = number] [, .SummaryPrompt = number]
В макросе Word вы, соответственно, можете написать: ToolsOptionsSave .SummaryPrompt = False
Для того чтобы выполнить эту команду из OLE-контроллера, необходимо знать порядковый номер этого аргумента в команде:
oWbApp.ToolsOptionsSave , , 0
10.3. Использование OLE Automation для передачи данных
В практике создания систем автоматизации обработки данных программисту очень часто приходится сталкиваться с задачей графического представления данных. В комплекте со всеми средствами разработки Microsoft поставляется специальная утилита Microsoft Graph 5.0, которая как нельзя лучше подходит для этих целей.
В этом параграфе мы расскажем, как в пользовательском приложении можно использовать Microsoft Graph 5.0, а также остановимся на основных возможностях графического представления
converted to PDF by HupBaH9I
данных, которые предоставляет Microsoft Excel.
С помощью Microsoft Graph 5.0 мы можем легко встроить в форму в виде OLE-объекта графики самого разнообразного вида, которые помогут пользователю лучше разобраться с тенденциями изменения интересующих его показателей. MS Graph 5.0 имеет интуитивно понятный интерфейс, разобраться с которым в крайнем случае поможет обширная справочная информация. Но если мы
не хотим заставлять пользователя нашей прикладной программы изучать еще и англоязычный интерфейс MS Graph, нам придется позаботиться об управлении процессом графического представления данных из программы с помощью средств OLE Automation. В связи с актуальностью этого вопроса остановимся на нем возможно подробнее.
На рис. 10.5 представлена иерархическая схема объектов MS Graph 5.0, а в табл. 10.3 - их краткое описание.
Таблица 10.3. Описание объектов MS Graph 5.0
Объект |
Описание |
Application |
Содержит установки в целом для |
|
приложения |
Axis |
Горизонтальные или вертикальные оси |
|
графика |
AxisTitle |
Заголовок одной из осей графика |
Border |
Рамка |
Chart |
График |
ChartArea |
Область графика, которая простирается |
|
и за внешние границы области, в |
|
которой вычерчивается график (поля, |
|
заголовки осей, описания данных и т. д.) |
ChartGroup |
Группа серий данных, представленных в |
|
виде одного графика. Простейший |
|
график содержит один объект ChartGroup |
ChartTitle |
Заголовок графика |
DataLabel |
Дополнительное описание для графика |
|
одной серии данных (может иметь |
|
отношение ко всей серии или к одной |
|
точке) |
DownBars |
Прямоугольник, который на линейном |
|
графике соединяет значение одной |
|
серии данных с более низким значением |
|
другой серии данных |
DropLines |
Вертикальные линии, соединяющие |
|
точки графика со значениями на оси Y |
ErrorBars |
Линии, графически отображающие |
|
ошибку расчета значения в графиках X-Y |
Floor |
Координатная поверхность, служащая |
|
основанием для трехмерного графика |
Font |
Шрифт |
GridLines |
Линии координатной сетки |
HiLoLines |
Вертикальные линии, которые соединяют |
|
максимальное и минимальное значения |
|
для различных серий данных |
Interior |
Графическое оформление (фон, тень и т. |
|
д.) |
Legend Описание серии данных для графика
LegendEntry Наименование серии данных, которое
берется из колонки с данными и может быть изменено только на листе с данными
LegendKey Обозначения для серии данных
PlotArea Область непосредственного
расположения графика Point Точка в серии данных
converted to PDF by HupBaH9I
Series Серия данных
SeriesLines Линия для обозначения серии данных TickLabels Значения для засечек на оси графика TrendLine Линия тренда
UpBars Прямоугольник, который на линейном
графике соединяет значение одной серии данных с более высоким значением другой серии данных
Walls Боковые координатные поверхности для
трехмерных графиков
Перечисленные 27 объектов позволяют достаточно гибко программировать внешний вид графиков, предоставляя доступные для них свойства и методы, список которых приведен в табл. 10.4. Все объекты имеют свойства Application (возвращает имя приложения, создавшего объект), Creator (возвращает идентификатор приложения, создавшего объект - для Apple Macintosh) и Parent (возвращает имя родительского объекта), поэтому они не указаны в таблице.
Таблица 10.4. Свойства и методы объектов MS Graph 5.0
Объект |
Свойства |
Методы |
Application ChartWizardDisplay, HasLink, |
SaveAsOldExcelFile-Format |
|
|
Name, Visible, Chart, Quit |
|
Axis |
AxisBetweenCategories, |
Delete |
|
AxisGroup, AxisTitle, Border, |
|
|
Crosses, CrossesAt, |
|
|
HasMajorGridlines, |
|
|
HasMinorGridlines, HasTitle, |
|
|
MajorGridlines, |
|
|
MajorTickMark, MajorUnit, |
|
|
MajorUnitIsAuto, |
|
|
MaximumScale, |
|
|
MaximumScaleIsAuto, |
|
|
MinimumScale, |
|
|
MinimumScaleIsAuto, |
|
|
MinorGridlines, |
|
|
MinorTickMark, MinorUnit, |
|
|
MinorUnitIsAuto, |
|
|
ReversePlotOrder, ScaleType, |
|
|
TickLabelPosition, TickLabels, |
|
|
TickLabelSpacing, |
|
|
TickMarkSpacing, Type |
|
AxisTitle |
Border, Caption, Font, |
Delete |
|
HorizontalAlignment, Interior, |
|
|
Left, Name, Orientation, |
|
|
Shadow, Text, Top, |
|
|
VerticalAlignment |
|
Border |
Color, ColorIndex, LineStyle, |
- |
|
Weight |
|
Chart |
Area3DGroup, AutoScaling, |
BarGroups, ChartGroups, |
|
Bar3DGroup, ChartArea, |
ChartWizard, ColumnGroups, |
|
ChartTitle, Column3DGroup, |
Delete, DoughnutGroups, |
|
Corners, DepthPercent, |
LineGroups, OmitBackground, |
|
DisplayBlanksAs, Elevation, |
PieGroups, RadarGroups, |
|
Floor, GapDepth, HasAxis, |
SeriesCollection, SetEchoOn, |
|
HasLegend, HasTitle, |
XYGroups |
|
HeightPercent, Legend, |
|
|
Line3DGroup, Perspective, |
|
Pie3DGroup, PlotArea,
PlotVisibleOnly,
RightAngleAxes, Rotation,
SizeWithWindow, SubType,
SurfaceGroup, Type, Walls,
WallsAndGridlines2D,
|
|
converted to PDF by HupBaH9I |
|
ApplyDataLabels, |
|
|
AreaGroups, AutoFormat, |
|
|
Axes |
|
ChartArea |
Border, Font, Height, Interior, Clear, ClearContents, |
|
|
Left, Name, Shadow, Top, |
ClearFormats, Copy |
|
Width |
|
Chart- |
AxisGroup, |
SeriesCollection |
Group |
DoughnutHoleSize, |
|
|
DownBars, DropLines, |
|
|
FirstSliceAngle, GapWidth, |
|
|
HasDropLines, HasHiLoLines, |
|
|
HasRadarAxisLabels, |
|
|
HasSeriesLines, |
|
|
HasUpDownBars, HiLoLines, |
|
|
Overlap, RadarAxisLabels, |
|
|
SeriesLines, SubType, Type, |
|
|
UpBars, VaryByCategories |
|
ChartTitle |
Border, Caption, Font, |
Delete |
|
HorizontalAlignment, Interior, |
|
|
Left, Name, Orientation, |
|
|
Shadow, Text, Top, |
|
|
VerticalAlignment |
|
DataLabel |
AutoText, Border, Caption, |
Delete |
|
Font, HorizontalAlignment, |
|
|
Interior, Left, Name, |
|
|
NumberFormat, Orientation, |
|
|
Shadow, ShowLegendKey, |
|
|
Text, Top, Type, |
|
|
VerticalAlignment |
|
DownBars Border, Interior, Name |
Delete |
|
DropLines Border, Name |
Delete |
|
ErrorBars |
Border, EndStyle, Name, |
Delete |
|
Clear Formats |
|
Floor |
Border, Interior, Name |
Clear Formats |
Font |
Background, Bold, Color, |
- |
|
ColorIndex, FontStyle, Italic, |
|
|
Name, OutlineFont, Shadow, |
|
|
Size, Strikethrough, |
|
|
Subscript, Superscript, |
|
|
Underline |
|
GridLines |
Border, Name |
Delete |
HiLoLines |
Border, Name |
Delete |
Interior |
Color, ColorIndex, |
- |
|
InvertIfNegative, Pattern, |
|
|
PatternColor, |
|
|
PatternColorIndex |
|
Legend |
Border, Font, Height, Interior, Clear, ClearContense, Copy, |
|
|
Left, Name, Position, Shadow, Delete, LegendEntries |
|
|
Top, Width |
|
Legend- |
Font, Index, LegendKey |
Delete |
Entry |
|
|
LegendKey Border, Interior, |
ClearFormats, Delete |
|
|
InvertIfNegative, |
|
|
MarkerBackgroundColor, |
|
|
MarkerBackgroundColorIndex, |
|
|
MarkerForegroundColor, |
|
|
MarkerForegroundColorIndex, |
|
|
MarkerStyle, Smooth |
|
PlotArea |
Border, Font, Height, Interior, ClearFormats |
|
|
Left, Name, Top, Width |
|
Point |
Border, DataLabel, Explosion, |
ApplyDataLabels, |