Книга
Книга
ЧАСТЬ I. ОСНОВЫ И ОБЩИЕ ПРИНЦИПЫ
РАЗРАБОТКИ ДОКУМЕНТОВ И ПРИЛОЖЕНИЙ MS OFFICE ИЗ ВНЕШНИХ ПРОГРАММ... 15
Глава 1. Объектные модели MS Office 17
Объектная модель MS Word* ..17
Объектная модель MS Excel 20
Глава 2. Особенности встроенного языка программирования MS Office..27
Глава 3. Общие принципы создания контроллеров автоматизации MS Office 31
Глава 4. Обзор инструментов среды разработки приложений Delphi для работы с MS Office 35
ЧАСТЬ IL РАЗРАБОТКА ДОКУМЕНТОВ И ПРИЛОЖЕНИЙ MS WORD В DELPHI39
Глава 5. Работа с объектом Word.Application-・.41
Создание объекта Word.Application, запуск и визуализация окна приложения41
Создание документа 43
Открытие документа* 45
Работа со списком открытых документов 50
Запись и чтение текста документа “52
Запись текста в документ 52
Чтение текста из документа -54
Сохранение документа 57
Закрытие документа и приложения Word 61
Обработка ошибок выполнения при работе с объектом Application61
Глава 6. Создание простого документа65
Выделение текста65
Объект Selection67
Шаблон документа77
Поиск текста в документе 78
Почтовый конверт 81
Платежное поручение 83
Глава 7. Создание таблиц и работа с ними 87
Создание, выделение и удаление таблиц в документе87
Форматы таблиц 90
Изменение положения таблицы и ее строк 93
Границы и заливка ячеек таблиц 95
Добавление и удаление строк и столбцов таблицы 98
Текст в ячейках таблицы101
Задание шрифта текста в документе и в таблице:102
Направление текста106
Разработка табличного документа ——бланк счета-фактуры 106
Глава 8. Работа с объектами в документе Word113
Коллекция объектов Shapes 113
Надписи114
Заливка надписи 118
Линия границы надписи123
Выноски127
Линии 129
Геометрические фигуры** * 129
Внешние объекты (OLE)131
Настройка страницы133
Печать документа 137
Пример программы — формирование товарного ярлыка138
Глава 9. Работа с объектом Word.Basic141
Объектная модель Word Basic141
Загрузка объекта Word Basic и визуализация окнаприложения Word143
Создание документа Word145
Открытие существующего документа Word147
Поиск и редактирование текста в документе Word148
Создание и редактирование таблиц в документе Word152
Рисунки и другие внешние объекты155
Печать документа Word 156
Запись документа Word на диск и окончание работы157
Пример программы ——платежное поручение —158
Глава 10. Программирование свойств MS Word 163
Элементы управления приложения MS Word...» 163
Элементы коллекции Command Bars, их отображение и расположение166
Создание пользовательской панели или менк> 172
Элементы управления и их свойства 174
Главное меню 177
Создание нового элемента управления.......** 178
Создание и использование макроса Visual Basic средствами Delphi181
Коллекция диалогов 186
Пример лрограммирования панели 188
ЧАСТЬ Ш. РАЗРАБОТКА ДОКУМЕНТОВ И ПРИЛОЖЕНИЙ MS EXCEL В DELPHI 191
Глава 11. Работа с объектом Excel.Application193
Создание объекта ExceLApplication, запуск и визуализация окна приложения193
Создание рабочей книги. 195
Создание рабочей книги на основе шаблона 1%
Открытие существующей рабочей книги Excel*197
Доступ к рабочей книге 200
Сохранение рабочей книги *.201
Настройка окон рабочей книги 204
Работа с листами рабочей книги 205
Чтение и запись информации ячейки листа рабочей книги210
Глава 12. Работа с ячейками 215
Объекты Range и Cells:…. 215
Чтение и запись значений ячеек; очистка ячеек *.*216
Формат отображения данных ячейки ..218
Формулы.,.»221
Запись и чтение комментариев* 224
Область (интервал ячеек)* * 224
Вырезание, вставка и удаление ячейки .一230
Поиск и замена текста 232
Высота и ширина ячейки 236
Выравнивание текста в ячейке 237
Шрифт* *241
Границы ячейки 243
Заливка ячейки -244
Пример программы — подготовка формы налоговой декларации НДС..247
Глава 13. Работа с объектами в книге ExceL 251
Коллекция объектов Shapes *251
Надпись 252
Линии границы 255
Зэливкз .г... ♦…丁 ■:.♦+ 262
Выноски-— 270
271273274279279280285286289290292293296299305307308309310311312312314315319319322324324325327330331332335335336346348.ЗЯ--370271273274279279280285286289290292293296299305307308309310311312312314315319319322324324325327330331332335335336346348.ЗЯ--370
271273274279279280285286289290292293296299305307308309310311312312314315319319322324324325327330331332335335336346348.ЗЯ--370
271273274279279280285286289290292293296299305307308309310311312312314315319319322324324325327330331332335335336346348.ЗЯ--370
Линии
Произвольные фигуры
Объекты WordArt
Глава 14. Диаграммы в рабочей книге Excel
Программирование диаграмм Excel в Delphi Коллекция Charts, размещение диаграммы и исходных данных. Тип диаграммы:
Объектная модель диаграммы Область диаграммы Заголовок диаграммы Область построения диаграммы, основание и стены диаграммы Легенда Оси Ряды и точки
Объемные диаграммы Особенности некоторых типов диаграмм
Линии серий (рядов)
Линии проекции
Коридор колебания (изменения)
Полосы понижения и повышения Некоторые дополнительные элементы рядов
Линии выноски для подписей данных Полоса погрешностей Линия тренда
Глава 15. Печать
Разрыв страницы
Объект PageSetup
Задание области печати
Задание полей страницы Колонтитулы Ориентация и размер бумаги, номер первой страницы, масштаб Печать заголовков строк и столбцов и линий сетки, черновая печать Предварительный просмотр и печать объектов рабочей книги Excel. Печать документа
Глава 16. Программирование свойств MS Excel
Элементы управления приложения MS Excel
Элементы коллекции CommandBars
Создание пользовательской панели (меню)
Элементы управления и их свойства
Главное меню....,.,
Создание пользовательского элемента управления Использование Visual Basic Editor
Коллекция диалогов
Пример программирования панели
ЧАСТЬ IV. РАЗРАБОТКА В DELPHI И ИСПОЛЬЗОВАНИЕ ДИНАМИЧЕСКИХ БИБЛИОТЕК ДЛЯ РАБОТЫ С MS OFFICE…….……373
Глава 17. Создание пользовательской библиотеки DLL 375
Создание пользовательской библиотеки 375
Создание пользовательской динамической библиотеки 382
Неявная загрузка модуля DLL 384
Явная загрузка модуля DLL 386
Глава 18. Использование DLL в макросах MS Office 391
Описание внешних функций и процедур в модуле документа.....392
Соглашение о вызовах* 394
Создание в среде Delphi динамической библиотеки для ее использования в макросах Excel—* **395
Использование созданной динамической библиотеки 401
ПРИЛОЖЕНИЯ 405
Приложение L Объекты, свойства и методы 407
Приложение MS Word * 407
Документы Word 4!2
Область Range— 418
Область Selection* ..423
Шрифт, свойства и методы— 425
Коллекция таблиц, свойства и методы •.…* 426
Таблица, свойства и методы .427
Коллекция объектов Shapes, свойства и методы...428
Объект Shape, свойства и методы..,. 429
Приложение MS Excel* 432
Рабочая книга Excel 439
Лист рабочей книги Excel 443
Приложение 2. Ответы на вопросы 455
Как подключиться к выполняющемуся приложению Excel?*455
Как освободить память после окончания работы в Excel? 456
Как вставить в документ Word рисунок, не перемещая текст?-456
Как выбрать масштаб отображения документа Word? 458
Как добавить новую страницу в документ Word? * 461
Как пронумеровать страницы в документе Word? .462
Как изменить положение таблицы по горизонтали? 464
Как решить проблему с добавлением новойтаблицы в документ Word?466
Как решить типичную проблему настройкиразмеров диаграммы?..466
Как копировать лист в Excel?* 468
Как обратиться к существующей диаграммев открытой книге?470
Как в выбранной ячейке таблицы документа Word писать снизу вверх?471
Как заполнять ранее созданные надписи книги Excel из проекта Delphi?472
57890 012 3 334444445 5 55 5 5666 77777 8 888 8 008888888888888888 844444444 4 44444444444444444 457890 012 3 334444445 5 55 5 5666 77777 8 888 8 008888888888888888 844444444 4 44444444444444444 4984984
57890 012 3 334444445 5 55 5 5666 7
7777 8 888 8 008888888888888888 8
44444444 4 44444444444444444 4
57890 012 3 334444445 5 55 5 5666 7
7777 8 888 8 008888888888888888 8
44444444 4 44444444444444444 4
9
8
4
9
8
4
Как работать с абзацами?
Как перевести символы текста в верхний или нижний индекс?
Как создать новый стиль текста?
Как определить координаты положения для ячейки таблицы Excel? Как перемещать курсор по тексту документа Word? Как выделить область листа, заполненную данными? Как вычислить адрес и размеры выделенной области? Как закрепить на экране область листа Excel?
Приложение 3. Описание компакт-диска.
Prog03
Prog05
Prog06
Prog07
Prog08*
Prog09
Prog 10
Progil
Prog12
Prog13
Prog14
Prog 15
Prog 16
Prog 17
Prog 18
Prog 19
Prog20
Список литературы
Предметный указатель
От автора
Выражаю благодарность всем, кто ждал эту книгу и вселял в меня силу и уверенность,—— в основном это читатели моих статей в компьютерном издании ^'Компьютерные Вести" (http://www.kv.by). Их число не так велико (до 10 000), но благодаря их активности я рискнул продолжить работу уже в виде книги. Неслучайно один из разделов посвящен ответам на наиболее частые вопросы моих читателей.
Отдельно благодарю первых читателей и критиков и одновременно коллег по работе — Ольгу Нетребину и особенно Ивана Ивановича Бардаша, который, являясь специалистом высокого класса, всегда готов поделиться опытом и знаниями, высказать свое мнение и оказать бескорыстную помощь как начинающим, так и более опытным специалистам.
В период работы над книгой я познакомился с замечательным коллективом редакции издательства Т'БХВ-Петербург", который обладает удивительными» почти волшебными способностями и делает замечательное пело. Этот коллектив, работая над рукописью совместно с автором, превращает ее в интересную и полезную для читателей книгу. Выражаю признательность ди ректору издательства Сергееву Вадиму Александровичу и главному редактору Кондуковой Екатерине Владимировне за понимание, поддержку и политику редакции, позволяющую потенциальным авторам создавать книги, а также зам. главного редактора Шишигину Игорю Владимировичу за терпение, настойчивость и профессиональный подход, помогающие автору правильно расставить акценты и рассчитать силы при подготовке материалов книги* Особую благодарность выражаю редактору Темкиной Татьяне Анатольевне, благодаря профессионализму и усилиям которой работа над книгой была завершена. Я также благодарю всех сотрудников издательства "БХВ-Пе- тербург'*, отвечающих за верстку, корректуру и оформление книги.
Читателей прошу рассматривать эту книгу как инструмент, отправную точку для дальнейшего самостоятельного развития своих навыков в этой области про грам м нровання.
Корняков Василий Николаевич
www.kornjakov.ru
vasily@komjakov.ru
Введение
Разрабатывая программные продукты, мы по-разному, в большей или меньшей степени задумываемся и представляем себе то? как с ними будет работать пользователь. Но если вообще не учитывать это обстоятельство, забыв о человеке, который будет работать с нашей программой, или пытаться навязать ему свои представления, то нас ждут неудачи н разочарование. Пользователь нас не поймет и не оценит наши усилия и интеллект, потому что мы просто не смогли их проявить. Главное — дать человеку почувствовать уверенность в собственных силах и то, что программный продукт был создан именно для него.
Несомненно то, что в отношениях пользователя с программой есть противоречия, и совершенно ясно, что проблема интерфейса "программа- пользователь" отчасти определяет эти противоречия н может быть решающей. Известно, что при создании приложений, с которыми будут общаться пользователи, разработка интерфейса требует больших затрат, особого подхода, опыта и знаний. Где взять опыт, который так необходим для построения взаимодействия человека и программы? Можно накопить и применять собственный опыт» а можно пойти другим путем и использовать существующие инструменты построения интерфейса, которые являются общеизвестными и общедоступными.
В данной книге речь пойдет об использовании программных продуктов, которые можно применять в качестве инструментов построения интерфейса. Такими инструментами могут служить программные продукты фирмы Microsoft.
口 Приложения MS Office вобрали в себя богатый опыт взаимодействия пользователя персонального компьютера и программного продукта и являются универсальными инструментами, которые могут быть интегрированы в приложения, создаваемые в различных средах разработки н служить тем связывающим элементом, который может положить начало успешному внедрению ваших разработок.
口 Подавляющее большинство пользователей изучили MS Word и Excel и работают с этими приложениями, не помышляя переходить к другим.
Многие справочные и правовые системы обладают обширными наборами различных шаблонов документов, выполненных в формате документов Word и Excel, и их можно и нужно использовать.
Документы MS Word и Excel, как и приложения MS Word и Excel, имеют четкие объектные модели и могут управляться как внутренними, так и внешними программами.
Эти факты служат аргументами в пользу того, чтобы использовать данные продукты в качестве универсального интерфейса для разрабатываемых программных продуктов.
В этой книге речь пойдет об использовании приложений из состава MS Office, а именно — процессора электронных таблиц MS Excel и текстового процессора MS Word, для формирования выходных документов (например, отчетов), экспорта и импорта информации н т. д. в приложениях, разрабатываемых в среде визуального программирования Delphi.
Delphi ——один из самых популярных и эффективных инструментов разработки сложных приложений, и возможность интегрировать средства приложений MS Office в разрабатываемые в этой среде проекты —— бесспорное тому доказательство.
В настоящее время есть достаточно много разнородной, отрывочной и разобщенной информации по использованию MS Word и MS Excel в приложениях Delphi. В основном эти сильно размытые сведения существуют в виде интернет-страниц в различных каталогах для программистов. Эта книга —попытка создать единый источник с целостным представлением, а также показать пути и методы решения задач, возникающих в связи с использованием Word и Excel в разрабатываемых приложениях.
Книга состоит из четырех частей.
Часть / посвящена обзору объектных моделей документов и приложений MS Office, особенностям встроенного языка Visual Basic. В ней также рассмотрены инструменты и общие принципы создания контроллеров автоматизации MS Office,
Часть II книги полностью посвящена разработке в среде Delphi контроллеров автоматизации приложения и документов MS Word. В этой части рассмотрены практические вопросы работы с текстом документа Word, создание простого текстового документа по шаблону м методы, используемые для заполнения шаблона. Отдельные главы посвящены работе с таблицами и созданию табличных документов, работе со шрифтом, с внутренними и внешними объектами документа Word. Рассмотрено использование процедур встроенного языка Word Basic — основного встроенного инструмента ранних версий MS Word. Приведены примеры его использования для соз-
Дания документов Word из приложений Delphi. Также в этой части описаны объекты самого приложения MS Word с их свойствами и методами на основе практических примеров программирования меню, панелей управления, кнопок. На отдельных примерах рассмотрен доступ к макросам из приложений Delphi.
Часть 〃/ книги посвящена разработке в среде Delphi контроллеров автоматизации MS Excel, основы создания которых приведены в главе II* На практических примерах рассматриваются объекты м методы, обеспечивающие доступ к рабочим книгам и листам MS Excel из приложений, создаваемых в Delphi. В главе 12 описаны объекты и методы, обеспечивающие доступ к отдельным ячейкам и к областям ячеек листа рабочей книги. На основе этой информации разбирается пример программы, реализующей заполнение налоговой декларации на основе подготовленного шаблона документа. Глава 13 посвящена внутренним объектам (надписи, выноски, геометрические фигуры)* В ней рассматриваются все вопросы, связанные с созданием этих объектов и настройкой их свойств из приложений Delphi. Отдельные главы третьей части посвящены детальному рассмотрению объектной модели диаграммы и программированию ее свойств, а также настройке параметров страницы, настройкам принтера и печати документов. В заключение третьей части рассматриваются объектные модели элементов управления приложения MS Excel — панели, меню, кнопки, их создание и программирование их свойств; описан доступ из приложений Delphi к элементам проектов, созданных с использованием встроенного языка Visual Basic, которые могут входить в состав рабочих книг MS Excel. Описание работы всех объектов и методов подкрепляется фрагментами исходного тек- ста9 который можно использовать в своих приложениях.
Часть IV книги посвящена динамическим библиотекам. Рассматривается создание и использование динамических библиотек, содержащих процедуры и функции: для работы с документами MS Office из приложений Delphi; для использования в макросах документов Word н Excel* В главе 17 описана структура исходных файлов таких библиотек и рассмотрены варианты и примеры их явной и неявной загрузки. В главе 18 на примере использования двух функций, одна из которых преобразует числовое значение переменной в его текстовый эквивалент, а другая отображает диалоговое окно и возвращает введенные в нем пользователем значения в документ, продемонстрировано использование разрабатываемых динамических библиотек в документах MS Office.
Книга содержит три приложения. Приложение / является справочником по рассматриваемым в книге объектам, их свойствам и методам. Приложение 2 посвящено ответам на типичные вопросы, возникающие при работе с документами MS Office в среде Delphi. В Приложении 3 описан сопроводительный компакт-диск книги.
В Списке литературы указаны дополнительные источники информации. Предметный указатель способствует быстрому поиску нужного термина. Книга построена по принципу “от простого к сложному", содержит много примеров, позволяющих быстро использовать полученные знания. Она адресована разработчикам программного обеспечения, которые работают в среде Delphi, имеют достаточный опыт работы и стремятся к получению дополнительных знаний и совершенствованию опыта работы. Книга полезна и начинающим программистам, знакомым с основами работы в среде программирования Delphi. Знание и опыт использования встроенного языка Visual Basic приложений MS Office ускорят обучение и помогут достичь лучших результатов.
Книга сопровождается компакт-диском, на котором отдельно для каждой главы размещены полные исходные тексты примеров. Все примеры выполнены в виде законченных проектов, которые можно откомпилировать и запустить на выполнение. Каждый проект размещен в отдельной папке м устанавливается на жесткий диск компьютера путем выбора определенного пункта меню загрузочной программы. На сопроводительном компакт-диске также размещены библиотеки, которые вы можете использовать в своих проектах, и несколько проектов, предназначенных для формирования бухгалтерских документов в виде документов приложений Word н Excel. Это проект "Платежные документы" и проект с отлаженным фрагментом программы формирования налоговой декларации в формате Excel. Все предложенные на сопроводительном компакт-диске примеры выполнены таким образом, чтобы их исходный текст можно было легко, без существенных изменений и временньгх затрат перенести в любой разрабатываемый вами проект.
Основы и общие принципыразработки документови приложений MS Officeиз внешних программ
Глава 1. Объектные модели MS Office
Глава 2. Особенности встроенного языка программирования MS Office
Глава 3. Общие принципы создания контроллеров автоматизации MS Office
Глава 4. Обзор инструментов среды разработки приложений Delphi для работы с MS Office
ГЛАВА 1
Объектные модели MS Office
Если предстоит решать сложную задачу, мы всегда задумываемся о том, с чего начать и как подойти к ее решению, как правильно распределить время и как сохранить при этом силы. Если перед нами стоит задача автоматизации разработки документов в формате MS Word или MS Excel, то с чего можно было бы начать?
Текстовый процессор MS Word и табличный процессор MS Excel, входящие в состав MS Office, являются СОМ 'объектам и. Это означает, что любая программа, написанная для современных версий Windows, может управлять этими объектами, если она поддерживает интерфейс СОМ. Тонкости механизма работы этого замечательного интерфейса описаны в специальной литературе, а мы займемся объектами Word, Excel и документами, с которыми они работают, поскольку они также являются объектами.
Ответ на вопрос "с чего начать?" напрашивается сам собой — начать нужно с рассмотрения структуры моделей объектов MS Office, взаимосвязей их составных частей, особенностей встроенного языка программирования, подойти к рассмотрению общих принципов автоматизации MS Office и разобраться, как этим можно управлять из программ, написанных в среде Delphi.
Рассмотрим структуру объектных моделей MS Office.
Объектная модель MS Word
Как видно из рис. 1.1, объектная модель MS Word имеет древовидную структуру, на вершине которой находится объект Application. Коллекции (Collection), входящие в состав объектной модели» представляют собой списки однотипных объектов, доступ к которым осуществляется по индексу. Отдельные объекты могут содержать коллекции, в свою очередь элементы
коллекции являются обычными объектами. Доступ к любому объекту или элементу коллекции возможен только через корневой объект Application. На рис, 1」 объектная модель изображена в укрупненном виде. Можно виде* лить и более детально рассмотреть некоторые части этой модели, например, элемент коллекции Documents — объект Document (документ). На рис. 1.2 представлена структура объекта Document в том виде, который дает представление о его основных элементах и их взаимосвязи*
Рис» 1,1. Объектная модель MS Word
В состав объекта Document входят как элементы, описывающие его в целом, так и элементы, являющиеся содержанием документа. Например, коллекция свойств, описывающих пользовательские характеристики документа (название, тема, автор и др.), относится к документу в целом и визуально не отображается в документе. Коллекция таблиц —— элемент, который является частью содержания документа и отображается на его страницах. В свою очередь элемент коллекции может содержать свои объекты и коллекции. Например, каждая таблица содержит коллекции строк и столбцов, а также элементы типа ,тячейка". Коллекции могут включать не только полностью однотипные элементы, но и элементы, которые могут существенно отличаться друг от друга. Коллекция форм (Shapes) содержит элементы, однотипные по способу создания и размещения, а по содержанию ——различные.
Рис. 1.2. Объектная модель документа MS Word
Элемент коллекции Shapes может содержать надпись (Textbox), внешний объект (OLEObject), линию (Line), полилинию (Polyline) и другие типы объектов. Основной объект документа это, конечно, текст. Для доступа к тексту можно использовать коллекцию Words или объект Range. Элементы коллекции Words — объекты, которые отображают слова в тексте и содержат их характеристики. Объект Range описывает текст или часть текста целиком. Конечно, объектная модель документа на рис. 1.2, описывает его далеко не полностью. Полезно рассмотреть еще и объектную модель элементов управления, объект °шрифтн (см. главу 7) и объект, который описывает параметры страницы (см. главу 8). На рис. 1.3 приведен общий вид структуры объектной модели элементов управления MS Word.
Как видно из рис. L3, все элементы управления MS Word собраны в одну коллекцию, имеющую древовидную структуру, каждый узел которой может содержать как объекты, так и вложенные коллекции. Эту структуру можно настраивать и дополнять. Пользователь и программист, используя опреде-
ленные инструменты, могут добавить, удалить, модифицировать или активизировать любой узел или объект этой структуры. При этом будут выполнены методы, соответствующие активизированным элементам управления.
Рис. 1.3. Объектная модель элементов управления MS Word
Мы рассмотрели основу объектной модели MS Word, представление о кото рой поможет нам при создании приложений.
Объектная модель MS Excel
Объектная модель MS Excel по общим принципам идентична объектной модели MS Word. Эта модель также имеет иерархическую структуру, в корне которой находится объект Application (ExceLApplication), через который обеспечивается доступ к любой коллекции или внутреннему объекту при^ ложения MS Excel или к компонентам открытых рабочих кннг. Общая структура объектной модели MS Excel представлена на рис. 14
Рис. 14. Объектная модель MS Excel
Как уже сказано, вершиной объектной модели MS Excel является объект Application, непосредственно включающий такие объекты и коллекции, как Selection — текущий выделенный объект, WorkBooks ——коллекция открытых рабочих книг, коллекции различных элементов управления, диалоговых окон и другие свойства приложения MS Excel. Объект Selection имеет свойства текущего выделенного объекта, поэтому нет смысла рассматривать здесь структуру модели этого объекта. Если выделена ячейка, то Selection = Ячейка, если диаграмма, то Selection = Диаграмма. Когда выделена область ячеек, Selection = Коллекции столбцов и строк. Коллекция рабочих книг представляет собой список открытых рабочих книг, доступ к которым осуществляется по индексу. Каждый элемент такой коллекции представляет собой объект "рабочая книга". Панели управления, меню, кнопки, диалоги и другие объекты, предназначенные для управления приложением, собраны в соответствую щи е коллекции элементов управления.
Основным элементом объекта "рабочая книга" является коллекция рабочих листов. Элементом коллекции является отдельный рабочий лист, который может представлять собой обычный лист (в виде таблицы) или быть в виде
диаграммы. В последнем случае он ничего, кроме диаграммы, содержать не может. Рассмотрим вариант листа в виде таблицы (рис. 1.5).
Рис. 1.5* Объектная модель листа рабочей книги
Основной объект рабочего листа, с которым приходится работать, — ячейка. Ячейка как объект сама обладает множеством свойств и объектов, входящих в нее. Из них наиболее важными и часто используемыми являются: текст, шрифт, стиль текста, границы, заливка. Чтобы получить доступ к ним, необходимо получить доступ к самой ячейке, а затем изменять ее свойства. Ячейки объединены в области ячеек Range* Свойства области ячеек во многом совпадают со свойствами самой ячейки, но есть и отличия, состоящие в задании координат и размеров области. Ячейки объединены в строки и столбцы. Объединения строк и столбцов представляют собой коллекции, доступ к которым производится по числовому индексу или по буквенному обозначению столбца. На рабочем листе могут располагаться внешние объ-
екты: рисунки, фрагменты документов Word, звуки, видеозаписи и другие объекты, которые объединены в коллекцию внешних OLE-объектов. Прорисовка млн, точнее, воспроизведение этих объектов полностью выполняется внешними программами, зарегистрированными в системе как OLE-cep- веры. Доступ к таким объектам производится через элементы коллекции OLEObjects, а доступ к нх свойствам возможен только через эти OLE' серверы. Приложение Excel обладает большим набором собственных графических объектов, которые можно разместить на рабочем листе. Мы можем использовать рисунки, надписи, геометрические фигуры, диаграммы, которые обычно объединены в коллекции. Например, коллекция ChartObjects содержит набор диаграмм, которые располагаются на рабочем или на отдельном листе. Каждая диаграмма, в свою очередь, также содержит набор объектов н коллекций. Рассмотрение свойств, состава н содержания диаграмм ——отдельная тема этой книги (см. главу 14).
Рис. 1.6. Объектные модели диалогов Найти в Excel (а) и Найти и заменить в Word (6)
Чтобы убедиться в гибкости, универсальности и больших возможностях для программирования объектов MS Office, рассмотрим еще одну коллекцию объектов, присутствующую как в Word, так и в Excel. Это коллекция диало» гов (диалоговых окон), которые пользователь обычно открывает нажатием той или иной кнопки или выбором команды меню. Она принадлежит объ^ екту Application. В объектной модели все диалоги представлены в виде элементов коллекции Dialogs, доступ к которым обеспечивается через числовой индекс. Посредством параметров метода Show элемента коллекции происходят передача параметров в диалог и его выполнение — такова модель дна” логов для приложений Excel (рис. 1.6, а), для приложений Word модель
диалога несколько отличается. Отличие заключается в том, что в диалог Word параметры передаются через свойства объекта-элемента коллекции (рис. 1.6, й).
У объекта ltem() наряду с типичными свойствами и методами есть присущие только ему свойства н методы. Например, у диалога Найти и заменить есть свойство Find, определяющее текст для поиска ——до запуска диалога.
В Excel объект коллекции Dialogs несколько отличается от диалогов Word* Здесь рассмотрим только объектную модель коллекции диалогов для Excel в целом (рис. 1.7).
Рис. 17. Объектная модель коллекции диалогов Excel
На этом рисунке представлена только малая часть всевозможных диалогов коллекции — показаны диалоги, наиболее часто используемые программистами и пользователями. Обычно в диалог передаются значения, которые устанавливают значения элементов управления, а возвращаются значения True или False, в зависимости от результата действия пользователя.
Можно подвести итог: приложения из состава MS Office, например Word и Excel, представляют собой взаимосвязанные объекты и коллекции объектов. Каждый объект или коллекция включает в себя множество параметров и других объектов, коллекций. В свою очередь, сами объекты и коллекции имеют хозяина (Parent), в состав которого они входят. На вершине объектной модели находятся объекты Word Application для текстового процессора Word и Excel.Application — для табличного прцессора Excel Через эти объекты, в основном, и осуществляется связь этих приложений с внешними программами. Как все это работает, вы узнаете из следующих глав книги.
ГЛАВА 2
Особенности встроенного языка программирования MS Office
В состав приложений MS Word и MS Excel входит язык программирования Visual Basic. Он появился не сразу — в первых версиях MS Office применялся язык написания макросов, который постепенно развился в полноценный язык, позволяюишй разрабатывать в среде MS Office довольно сложные приложения. Чтобы разрабатывать приложения Delphi, использующие контроллеры автоматизации, необходимо знать некоторые особенности встроенного языка MS Office. Для начала можно ознакомиться с ними, используя справочную систему, где он достаточно хорошо описан (рис. 2.1). Справку по Visual Basic можно установить, используя установочный диск MS Office.
Однако для оперативного создания и отладки некоторой части программы справки может быть недостаточно или в ней не найдется подходящего примера. Как поступил» в этом случае? Для решения таких вопросов в Word и Excel предусмотрен режим автоматической записи действий пользователя в формате встроенного языка. Записывая таким способом части текста программы, анализируя и изменяя их, мы существенно сокращаем время на разработку приложений. Рассмотрим, как это делается, на простом примере: в документе Word создадим таблицу и заполним текстом несколько ячеек. Для начала включим режим записи макросов, выполнив команду Сервис > Макрос > Начать запись главного меню (рис. 2.2, а) или нажав кнопку Записать макрос на панели Visual Basic (рис. 2.2,仇.
Откроется диалоговое окно, в котором нужно ввести имя макроса, определить документ, для которого он будет доступен, и задать его описание. Назовем наш макрос Макрос! и приступим к работе с документом — как это обычно делают пользователи, используя команды меню и кнопки панелей инструментов. После того как таблица создана м заполнено несколько ячеек, выключим режим записи макроса (рис. 22 б) и откроем окно редактора Visual Basic с помощью пункта Сервис > Макрос > Редактор Visual Basic главного меню или кнопки на панели Visual Basic.
Рис. 2.1. Доступ к справке по Visual Basic для WordРис. 2.1. Доступ к справке по Visual Basic для Word
Рис. 2.1. Доступ к справке по Visual Basic для Word
Рис. 2.1. Доступ к справке по Visual Basic для Word
а)
Записать макрос]Остановить зались|
6)в)
Рис. 22 Включение (а, б) и выключение (в) режима записи макроса
В окне редактора Visual Basic мы увидим примерно такой программный текст на встроенном языке (рис. 2.3), операторы которого повторяют и описывают действия пользователя.
Sub Макрос!()
1 Иакрос! Нэкрос ' Макрос saiXHcaet 02 .01. ОЯ Корняков Василий Николаевич
Act iveDocuitient;. Tab lea, Add Range: •Selftc tlon. Range, MutnRo «я г "2 г NmwColvarns :"< Selection.Pagesecup.TopMar gin ■ CenclmetersTaPolnts(1.75)
Selection.Titles(1> .Rotr?.SetLefcIndene LeftXndenc:-55.05, RulerStyle:-vdAtljustNone Act iveVlndow. Ac c LvesPane: .La мдеЗиго丄 1 ToRight: ■ 1 ActiveWindov.AccivePane.Ho rIzontalPercencScrolled ■ 0 Selection.TypeTexc Te*t;・"> n/n" Selection.HoveRight Unit:■vdCell Select ion. TypeTescc Text: ■" Товар** Зе 1 ection>floveRighc Unit:*vdCell Se 1 ection«Т^реТехъ Text:""Цела*' Selection.BoveRighc Unit:ewdCell Selection,TvpeText Text: ="Количество"" Selection. RoveRighc Unit:" ifdCeiX Selection.TypeText TextL"l" Encl Sub
Рис. 2.3. Текст записанного макроса в окне редактора Visual Basic
Очевидно, что возможность автоматической записи макросов существенно облегчает понимание и сокращает время создания приложений в MS Office. Из синтаксиса операторов видно, что мы имеем дело с объектами и объектно-ориентированным языком.
К этому можно добавить, что для приложения Word встроенный язык Visual Basic имеет одну особенность. Он сам является объектом, и его процедуры и функции доступны из внешних программ аналогично тому, как это реализовано для объекта Application. Для доступа к Visual Basic используется идентификатор Word.Basic.
:Обеспечение доступа к встроенному языку Visual Basic приложения Word
uses CcsnObj;
var В:variant;
procedure TForml.ButtonlClick(Sender: TObject);
begin
В:=CreateOleObj ect('Word,Basic*);
messagebox(handle,'Word.Basic - запущен1f1 Внимание!1,0);
В.FileQuit;
B:=UnAssigned;
end;
В данном примере мы просто загружаем объект Word.Basic н выгружаем его без какого-либо практического применения (конечно, его возможности этим не исчерпываются).
Объект Word.Basic можно также использовать для создания документов из приложений, написанных на Delphi, но все же лучше использовать объект Application, т. к. мы работаем с документом как с объектом, и дополнительное звено в цепи Нприложение-объект "Документ Word"" может оказаться лишним и стать помехой. В конечном итоге, выбор пути решения поставленной задачи ——дело самого программиста.
Другой важной особенностью встроенного языка MS Office является возможность использования в макросах внешних процедур и функций из динамических библиотек (DLL, Dynamic Link Library — библиотека динамической компоновки). Для этого достаточно описать спецификацию процедуры или функции с указанием ссылки на динамическую библиотеку. Использование внешних процедур и функций, написанных в том числе и в среде Delphi, позволяет интегрировать пользовательские приложения в документы Word и Excel и создавать сложные документы н отчеты на комплексной основе* Эта возможность важна, напрнмер, если отчеты создаются с помощью баз данных, с которыми Excel, Word и Visual Basic не работают или работают некорректно, или если вы хотите использовать эксклюзивные возможности среды программирования Delphi, или если просто требуется вызывать функции API Windows или любого приложения. На рис. 2.4 представлена структура объявления (описания) процедур и функций, импортируемых из динамических библиотек. Подробно этот материал будет рассмотрен в главе 18.
Здесь можно добавить только одно важное замечание о совместимости типов данных, используемых в качестве переменных процедур и функций. Типы данных, используемых во встроенном языке и в среде программирования Delphi, должны быть идентичны друг другу. Подробности можно узнать из справки по Visual Basic и Delphi.
После того как в общих чертах рассмотрены модели MS Word, MS Excel и особенности встроенного языка, можно перейти к рассмотрению общих принципов создания контроллеров автоматизации.
Рис. 2.4. Синтаксис описания внешних процедур и функций в макросах Word и Excel
ГЛАВА 3
Общие принципы создания контроллеров автоматизации MS Office
Одной из замечательных особенностей многозадачных операционных систем является поддержка взаимодействия и обмена информацией между различными программами. Операционная система (ОС) Windows — не исключение из этого правила и предоставляет множество механизмов такой поддержки. Работа ОС Windows предусматривает передачу и обработку сообщений как между ОС и приложением, так и между приложениями, а также использование динамических библиотек. Этот механизм был использован еще в первых версиях Windows и отразился на методах разработки приложений для этой ОС. Основой программирования в первых версиях Windows стало программирование объектов, потому что любая программа этой ОС представляла собой объект. С развитием операционной системы развивались н механизмы взаимодействия программ. Развитие шло от обмена сообщениями, использования DLL (Dynamic Link Library, динамически подключаемые библиотеки процедур и функций) и механизма DDE (Dynamic Data Exchange, динамический обмен данными) к современным технологиям, основанным на OLE (Object Linking and Embedding, связывание и внедрение объектов), COM (Component Object Model, компонентная модель объектов), DCOM (Distributed Component Object Model, распределенная компонентная модель объектов). Этот переход был обоснован тем, что стало недостаточным использование только функций и процедур, предоставляемых внешними программами и библиотеками. На первый план вышла необходимость управления целыми объектами, которые представляют собой приложения или документы и расположены как в одном адресном пространстве управляющей программы, так и вне этого пространства или даже на другом компьютере локальной сета. Такая постановка задачи повлекла за собой революционные изменения как в структуре ОС Windows, так м в программах, предназначенных для разработки приложений. Приложения MS Office представляют собой объекты-серверы, которые могут управляться внешними программами, и здесь не последнюю роль играют механизмы СОМ и OLE.
Модель СОМ предоставляет возможность создания многократно используемых объектов в различных приложениях, поддерживающих этот интерфейс. Объектами СОМ являются приложения-сер веры, специальным образом оформленные и зарегистрированные в системе. Они могут быть представлены в формате ЕХЕ- или DLL-модулей> Эти серверы могут загружаться и выполняться как в адресном пространстве вызывающего приложения, так и в виде самостоятельного процесса, или на другом компьютере сети (распределенная модель СОМ — DCOM). Они должны быть написаны на любом языке, поддерживающем интерфейс СОМ.
Развитие технологии СОМ продолжает ее подмножество — технология OLE Automation (автоматизация OLE). Ее отличие в том, что она позволяет использовать возможности СОМ не только языкам - ком пилятора м, но и интерпретаторам, и обеспечивает связь с вызываемыми методами на стадии выполнения приложения. Такой способ вызова называется поздним связыванием. Методы при таком способе вызова выполняются медленнее, причем заранее нельзя проверить правильность написания объектов и их методов. Преимушеством такого метода является независимость выбора среды разработки от объекта, который нужно программировать.
Среда Delphi поддерживает вызовы методов серверов автоматизации.
Примечание )
Сервер автоматизации представляет собой программу, которая может управляться внешней программой ——контроллером автоматизации^ Сервером в данном случае является Word или Excel, а контроллер разрабатывается программистом.
Для этого используются переменные типа Variant, которые содержат ссылки на объекты автоматизации. На этапе выполнения программы серверу автоматизации передается команда в виде строки, предварительно записанной в переменную типа Variant. Рассмотрим в качестве примера следующий фрагмент программы:
Загрузка Internet Explorer
Uses ComObj;
Var IE:variant;
procedure TMainForro.ButtonlClick(Sender: TObject); begin
IE: =Create01e0bject (' InternetExplorer.Application1);
IE.Visiblet =true;// Нужно выбрать один из операторов
IE.Visible:=false; // и проверить, как это работает
end;
「пава 3. 06sMe прнни酬пн созазнмн контроллер。日 автоматизаимл MS О用се33
Переменная IE типа Variant не имеет никаких свойств и методов, но, тем не менее, программа откомпилируется и будет выполняться. Если мы вместо свойства Visible напишем любое другое свойство, которое не поддерживает IE, то компилятор ошибки не выдаст, а на стадии выполнения произойдет ошибка. Это особенности позднего связывания —— свойства и методы проверяются в самом приложении-сервере на стадии выполнения. Можно добавить, что весь этот механизм работает за счет COM APL В данной книге нет смысла подробно рассматривать вызовы его функций и процедур. Наша задача — научиться создавать и использовать контроллеры автоматизации (что это такое, рассказано чуть позже) для приложений MS Office Word и Excel, которые наиболее часто используются как приложения для пользователей и как серверы для создания приложений. Используя контроллеры автоматизации, в приложениях, созданных в среде Delphi, можно так же просто, как при обычной работе с Word и Excel, создавать документы со всеми возможными элементами* Таблицы, надписи, текст, диаграммы и другие компоненты полноценных документов появятся в таком виде, как будто они созданы пользователем. Далее в книге все примеры будут описывать в основном только работу с Word и Excel и позднее связывание.
Перейдем непосредственно к контроллерам автоматизации. Из уже сказанного понятно, что контроллер автоматизации — это программа, которая “умеет" управлять приложениями MS Office и процессом создания документов в среде Word и Excel. Для того чтобы все это работало корректно, программа-контроллер должна выполнить следующие функции:
Проверить, запущено приложение (Word, Excel) или нет.
Если приложение не запущено, запустить его.
Выполнить ряд необходимых манипуляций с приложением, документом.
Закрыть документ и приложение.
Очистить память.
Как уже сказано, доступ к документам и приложениям можно осуществлять через объекты, стоящие на вершине объектной модели приложений MS О口 fice> Через них мы получаем доступ к внутренней структуре документов и приложений, поэтому при создании контроллеров автоматизации мы можем использовать только их. В табл. ЗА и 3.2 приведены эти объекты и дана их краткая характеристика.
Таблица 3* 1, Объекты MS Word
Идентификаторы
Краткая характеристика
Word. Application
Word.Application.8 (9,10)
С помощью этих идентификаторов осуществляется доступ к объекту Application и запускается приложение Word
Таблица ЗЛ (окончание)
Идентификаторы
Краткая характеристика
Word.Document
Word.Documents (9,10)
Word .Template.8
С помощью этих идентификаторов осуществляется доступ к объекту Document, запускается приложение Word, если оно не было запущено, создается новый документ. Если до этого приложение Word было запущено, то новый документ создается в нем
Таблица 32 Объекты MS Excel
Идентификаторы
Краткая характеристика
Excel. Application
Excel.Application.8 (9.10)
С помощью этих идентификаторов осуществляется доступ к объекту Application и запускается приложение Excel
Excel.Addln
С помощью этого идентификатора запускается приложение Excel и создается специальный объект Add-In
Excel.Chart
Excel.Chart.8
С помощью этих идентификаторов запускается приложение Excel и создается рабочая книга, содержащая диаграмму и рабочий лист с данными для диаграммы
Excel. Sheet
Excel. Sheets
С помощью этих идентификаторов запускается приложение Excel и создается рабочая книга, содержащая рабочий лист
Мы подошли к вопросам создания контроллеров автоматизации в среде Delphi. В следующей главе мы рассмотрим инструменты среды Delphi.
ГЛАВА 4
Обзор инструментов среды разработки приложений Delphi для работы с MS Office
Среда разработки приложений Delphi предоставляет программистам массу возможностей по созданию приложений, способных взаимодействовать с внешними программами, такими как Word, Excel, Internet Explorer, Outlook н другими, использующими механизмы Windows для обмена данными> Даже ранние версии Delphi поддерживали технологию DDE и OLE. Начиная с пятой версии Delphi, возможности были дополнены целым набором компонентов для работы с приложениями MS Office. Благодаря странице Servers Палитры компонентов, разработчик получил возможность достаточно быстро создавать для своих приложений отчеты в формате Word, Excel, работать с почтовой программой и другими приложениями MS Office. Страница Servers содержит компоненты для работы с приложениями Word, Excel, документами и рабочими книгами н компоненты для работы с текстом. На рис. 4.1 показан внешний вид страницы Servers.
Wb 111 $m>taa| Aettv^K ?•*«* } fXamntrft | iwum | Uto Ml 7Ям4мЛ| KMoukal
优 勦办:同饑感^窺嚙■■%■匡电■禽U&由 元珍今災気©
Рис. 4.1. Страница Servers — компоненты для работы с приложениями MS Office
Упомянем компонент, просто необходимый в приложениях, работающих с документами в Интернете, Это WebBrowser ——замечательный компонент, обладающий всеми возможностями приложения Internet Explorer, потому что на самом деле это и есть Internet Explorer в виде внешнего компонента (рис. 4.2). В вашем приложении его можно разместить в форме, после чего у нее появятся все качества обозревателя Интернета.
Если вам нужно больше гибкости и универсальности, используйте компонент OleContainer со страницы System (рис. 4.3). Расположив этот компо-
нент в форме своего приложения, вы с легкостью сможете придать ему функции как приложения Word или Excel, так и любого другого приложения, зарегистрированного в системе как сервер OLE.
Susieml Data Access] Data Control* | ADO | iriterBete) Midas ] IriwnetExaes® liMemet ] Fa&tNei J_LL 1Я事量国务8法我 sy^WRMB^iHBmh^^fe^ei「'■—=• 育慢
Рис. 4.2. Компонент WebBrowser на странице Internet Палитры компонентов
:Standaid I Additional | Win32 S^en*(D^aAcceu| Data Cenbol* I ADO ] InterBase I Mto [ InteJ-LL
丑夕 mxpqr.r
Рис* 4.3. Компонент OleContainer на странице System Палитры компонентов
Было бы несправедливо обойти вниманием набор компонентов для работы с базами, представленный на странице ADO (ActiveX Data Object) Палитры компонентов.
^] 1пЛ«В«зе I Midas Г InternetExoren 1 Jnlwnet j FestNei 1 Decwio*J-l_L
Рис. 4.4. Страница ADO — компоненты для работы с базами данных
Для реализации больших возможностей, предоставляемых приложениями' серверами, в дополнение к компонентам, описанным выше, Delphi предоставляет возможность подключения внешних компонентов ActiveX. На рис. 4.5 приведено диалоговое окно подключения внешних компонентов ActiveX.
Их особенностью является то, что они напоминают обычные компоненты Delphi, но могут быть написаны на любом языке программирования, лишь бы это средство разработки поддерживало возможность их использования в разрабатываемых приложениях. Технология ActiveX базируется на технологии Microsoft СОМ.
Обычно компоненты ActiveX располагаются на одноименной странице Палитры компонентов. Если вы ее откроете, то увидите несколько компонентов, в том числе FIBook (рис. 4.6).
При определенных навыках и опыте разработчика программного обеспечения универсальным инструментом для создания отчетов в формате Word и Excel может стать библиотека ComObj.pas Delphi. Достаточно и одной функции из этой библиотеки —— разумеется, это функция function CreateOleObjectfconst ClassName: string): (dispatch; (она возвращает
ссылку на интерфейс объекта, предназначенный для управления этим объектом). Эта функция всегда используется для позднего связывания —— когда в момент написания и компиляции исходного текста программы неизвестно, будет работать приложение или нет* Ошибки синтаксиса при позднем связывании проявляются только в момент выполнения программы. Книга посвящена, в основном, таким методам создания приложений.
Рис. 4.5. Диалоговое окно импорта внешнего компонента ActiveX в системуРис. 4.5. Диалоговое окно импорта внешнего компонента ActiveX в системуI Win 31 ] Semdet 例加第 | Setveis I KEornooneni* I mwes J kobo hd] TReacter321 KMm础,I■p 浮毁z国;!^MKEg£^^b=..tr,i.f^«r ■? ■叫『*^gj^gg^^g^jg^|^^^I Win 31 ] Semdet 例加第 | Setveis I KEornooneni* I mwes J kobo hd] TReacter321 KMm础,I■p 浮毁z国;!^MKEg£^^b=..tr,i.f^«r ■? ■叫『*^gj^gg^^g^jg^|^^^FIBookFIBook
Рис. 4.5. Диалоговое окно импорта внешнего компонента ActiveX в систему
Рис. 4.5. Диалоговое окно импорта внешнего компонента ActiveX в систему
I Win 31 ] Semdet 例加第 | Setveis I KEornooneni* I mwes J kobo hd] TReacter321 KMm础,I
■p 浮毁z国
;!^MKEg£^^b=..tr,i.f^«r ■? ■叫『*^gj^gg^^g^jg^|^^^
I Win 31 ] Semdet 例加第 | Setveis I KEornooneni* I mwes J kobo hd] TReacter321 KMm础,I
■p 浮毁z国
;!^MKEg£^^b=..tr,i.f^«r ■? ■叫『*^gj^gg^^g^jg^|^^^
FIBook
FIBook
Рис. 4.6. Компонент FIBook на странице ActiveX Палитры компонентов
В следующей главе рассмотрим использование позднего связывания для доступа к приложению и документам Word.
ЧАСТЬ II
Разработка документови приложений MS Word в Delphi
Глава 5.
Работа с объектом Word.Application
Глава 6.
Создание простого документа
Глава 7.
Создание таблиц и работа с ними
Глава 8.
Работа с объектами в документе Word
Глава 9.
Работа с объектом Word > Basic
Глава 10.
Программирование свойств MS Word
ГЛАВА 5
Работа с объектом
Word.Application
В данной главе мы приступим к практическому созданию контроллера ав^ томатизации для текстового редактора MS Word. Как уже сказано, для создания контроллера автоматизации необходимо получить доступ к объекту, стоящему на вершине объектной модели приложения Word, — к объекту Application (для доступа к нему используется идентификатор Word.Application).
Создание объекта Word.Application, запуск и визуализация окна приложения
Функция, реализующая механизм доступа к OLE-объекту, находится в библиотеке ComObj.pas — функция CreateOleObject. Ее единственным аргументом является строка-идентификатор, а возвращает она ссылку на объект.
Рассмотрим пример использования этой функции.
Создадим новый проект Delphi, в котором есть одна форма. В модуле формы укажем ссылку на использование библиотеки ComObj и объявим переменную W:variant. В форме расположим кнопку. В процедуре обработки нажатия кнопки напишем следующий программный текст.
;Создание объекта Word.Application
uses ComObj;
var W:variant;
procedure TForml.ButtonlClick(Sender: TObject);
begin
W:=Create01 eObject (* Word. Application*); end;
Если выполнить этот фрагмент программы, то приложение Word запустится, но его окно не отобразится на экране монитора. В память компьютера будет загружен объект Application, обеспечиваю ши й доступ ко всем внутренним объектам, коллекциям и свойствам. В данный момент нас интересует только одно свойство этого объекта — Visible. Если его значение установить в True, то окно приложения Word станет видимым. Расположим в нашей форме компонент CheckBoxl, в процедуре отклика которого напишем следующий программный текст:
Задание видимости окна приложения Word
procedure TForml.CheekBoxlClickfSender: TObject); begin
W.Visible:sCheckBoxl.Checked;
end;
Манипулируя состоянием объекта CheckBoxl, мы обнаружим, что окно приложения то появляется, то пропадает с экрана монитора. Приложение загружено в память, без каких-либо открытых документов (рис. 5.1).
Рис. 5.1. Отображенное окно запущенного приложения Word
При формировании документов свойство Visible лучше установить в значение False, н устанавливать его в значение True только для отображения полностью созданных документов свойство Visible. Так можно сократить
время создания отчетов и повысить производительность работы приложений. Отлаживая приложение или изучая свойства объекта Application, лучше видеть все действия на мониторе. Поэтому установим Visible := True и приступим к работе с документами Word.
Создание документа
Итак, объект Application загружен в память компьютера, м у нас есть доступ к нему через переменную W:variant. Исследуем свойства этого объекта. Обратим внимание на коллекцию Documents* Она содержит документы, их свойства и методы для работы с ними. Элементами коллекции являются открытые в настоящий момент документы. Доступ к ним осуществляется через объекты ltem(doc:variant), где doc — имя или индекс документа в коллекции, Поле Count коллекции содержит количество элементов коллекции, если Count=0, то нет ни одного открытого документа. Создадим новый документ. Для этого используем метод ADD этой же коллекции. Разместим в форме кнопку, в процедуру отклика которой на нажатие запишем следующий текст:
:Создание документа в коллекции документов
procedure TFoml. Button2Click (Sender: TObject); begin
W. Documents * Add;
end;
После выполнения метода ADD будет создан документ, который отобразится в окне приложения (рис» 5.2).
Обращаться к методу ADD коллекции Documents можно как без аргументов, так н с аргументом. Когда аргумента нет, создается обычный документ. Если метод вызывается с аргументом (строкой-указателем на файл шаблона), то создается документ по шаблону. В комплекте поставки MS Office есть несколько шаблонов, которые вы, вероятно, используете в своей рабо* те. Шаблоны находятся в папке \Microsoft Office\Шаблоны. Для своих приложений можно создать дополнительные шаблоны документов, например шаблон формы платежного поручения или налоговой декларации. В дальнейшем, используя метод ADD с указанием на шаблон, легко создать нужный документ, заполняемый информацией из программы. Использование шаблонов при формировании новых документов позволит создавать гибкие и удобные для пользователя приложения в среде Delphi. Создадим новый документ на основе шаблона. Для этого разместим в форме кнопку и напишем следующий фрагмент программы.
Рис. 5.2. Документ, созданный методом ADD без аргументов
Рис. 5.3. Документ, созданный методом ADD с использованием шаблона
;Создание документа по шаблону
procedure TEorml.Button3Click(Sender: TObject);
var dir_:string;
begin
GetDir (0, dir_);
if not OpenDialogl.Execute then begin chdit(dir_); exit; end; chdir (dir_);
W. Documents .Add(OpenDialogl. FileName); end;
Данный фрагмент программы позволяет открыть диалоговое окно, найти и выбрать файл шаблона, используемый при создании нового документа. Выберем файл Стандартное резюме.DOT из папки ...\Microsofi О^се\Шаблоны \Другие документы. Результат выполнения метода ADD представлен на рис. 53
Если требуется внести изменения в созданный ранее документ, тогда открываем его, используя методы коллекции Documents.
Открытие документа
Ранее созданный документ можно открыть с помощью метода Open. При вызове метода можно указать и несколько аргументов, но главный из них — ссылка на путь н имя файла. Откроем ранее созданный документ. Фрагмент текста программы выглядит так:
? Открытие документа
procedure TForml.Button4Click(Sender: TObject);
var dir__: string;
begin
GetDir £0,dir_);
if not OpenDialog2.Execute then begin chdir(dir_); exit; end;
chdir(dir_);
W. Docijments * Open (OpenDialog2. FileName); end;
Результат выполнения данного фрагмента программы представлен на рис. 5.4.
Метод Open коллекции Documents можно вызывать с несколькими аргументами. Обратимся к справочной системе Visual Basic м рассмотрим синтаксис н аргументы этого метода (табл. 5.1).
Рис. 5*4. Документ, открытый методом OpenРис. 5*4. Документ, открытый методом Open;Синтаксис метода Open
Рис. 5*4. Документ, открытый методом Open
Рис. 5*4. Документ, открытый методом Open
Documents. Open (FileNaine, ConfirmConversions, Readonly, AddToRecentFiles, PasswordDocument, PasswordTemplate, Revert, WritePasswordDocument, WritePasswordT^nplate, Format)
Таблица 5.1* Аргументы метода Open, их типы и функциональное значение
Аргумент
Тип
Значение
FileName
String
Путь и имя файла
ConfirmConversions
Boolean
False — не открывать диалоговое окно Преобразование файла при открытии файла, формат которого отличается от DOC
Readonly
Boolean
True — открыть документ в режиме ''только для чтения11
AddToRecentFiles
Boolean
True — добавляет имя файла в список файлов меню File
PasswordDocument
String
Пароль для открытия документа
Таблица 5.1 (окончание)
Аргумент
Тип
Значение
Passwo rdT е m plate
String
Пароль для открытия шаблона
Revert
Boolean
True — возврат к сохраненному документу, если этот документ открывается повторно
WritePasswordDocument
String
Пароль для сохранения измененного документа в файл©
WritePasswordTemplate
String
Пароль для сохранения изменений в шаблоне
Format
Число1
Формат открываемого документа
При вызове метода Open можно игнорировать некоторые аргументы н не указывать их, например, вызов W.Dociiments.OpentFileName); просто открывает файл без каких-либо дополнительных возможностей. Если немного изменить синтаксис вызова — W.Documents.Open(FileName:= *с:\Документ1 .doc1);, то конечный результат будет таким же, как и в первом случае. Когда нам потребуется открыть документ в режиме "только для чтения", то используем следующий синтаксис:
W.Documents.Open(FileName: = 'с:\Документ1.doc3 Readonly: =True);
Разместим в нашей форме кнопку и напишем программный текст, позволяющий открывать документы в режиме "только для чтения'1.
Открытие документа в режиме “только для чтения*1
procedure TForml.ButtonbCIick(Sender: TObject);
var dir__: string;
begin
GetDir(0,dir_);
if not OpenDialog2.Execute then begin chdir (dir__) ; exit; end;
chdir (dir_);
W. Documents. Open (OpenDialog2. FileName r Readonly: =t rue); end;
Если для открытия документа используется не два, а три аргумента, независимо от их последовательности, то синтаксис изменится на одну запись.
【Некоторым свойствам (имеющим разные числовые типы) можно присваивать значения типа Integer или Extended, это нс вызовет ошибки.
Например: откроем документ в режиме "только для чтения", который защищен паролем.
W. Documents. Open (FileName: =' с: \Документ1. doc', Readonly:-True, PasswordDocument :=r 123*);
Здесь строка ‘123’ —— значение пароля.
Обратим внимание на последний аргумент метода ADD ——Format. Этот аргумент может принимать целые числовые значения и определяет формат открываемого документа (табл. 5.2).
Таблица 52 Значения аргумента Format и форматы открываемых документов
Константа
Значение
Формат открываемого документа
WdOpenFormatAuto
0
Выбирается автоматически
WdOpenFormatDocument
1
Документ Word (файл с расширением имени DOC)
WdOpenFormatRTF
3
Документ в формате RTF (файл с рас- ширекием имени RTF)
WdOpenFormatTemplate
2
Шаблон Word (файл с расширением мменм DOT)
WdOpenFormatText
4
Текст (файл с расширением имени TXT)
WdOpenFormatUnicodeText
5
Кодированный текст (файл с расширением имени TXT) — текст в формате UNICODE
Откроем текстовый файл, используя возможность задания формата открываемого документа. Для этого добавим в форму кнопку и напишем следую* ший фрагмент программы:
;Открытие документа в формате TXT
procedure TForml ,Button7Click(Sender: TObject);
const WdOpenFormatText=4;
var dir_:string;
a_: integer;
eee_: string;
begin
Get Dir (0, dir__);
if not OpenDialog3,Execute then begin chdir(dir_); exit; end;
chdir(dir_);
W. Documents. Open (OpenDialog3. FileName, Format: =wdOpenFormatText); end;
Результат выполнения этой процедуры представлен на рис. 5.5.
Рис. 5.5. Документ в формате TXT, открытый методом Орел
Но если мы попробуем открыть документ в формате DOC, указав значение Format:=wdOpenFormatText, то получим сообщение об ошибке (рис. 5.6, а).
В режиме выполнения приложения сообщение об этой ошибке будет выглядеть, как показано на рис. 5.6, б.
Подобные ошибки, возникающие во время работы с объектом Application, можно обрабатывать в приложении. Для этого используется синтаксис Delphi для обработки исключительных ситуаций, например:
try
// программный код, который может вызвать исключительную ситуацию except
// програм14ный код для обработки исключительной ситуации end;
О том, как использовать обработку исключительных ситуаций на практике, рассмотрим в конце главы, когда создадим несколько функций нашей будущей библиотеки для работы с приложением Word. Сейчас продолжим ис-
Часть 〃. Разработка ^окум&нго圧川 пр抬ложен找而 MS 他rd s Delphi следование. В запущенном приложении Word объект Application содержит несколько созданных и открытых документов, поэтому далее рассмотрим работу со списком открытых документов.
Pg5ch2Pg5ch2
Pg5ch2
Pg5ch2
О Не удается открыть документ.
Попробуйте выполнить следующие действия:
* Чтобы открыть документ, выберите комащу и0ткрыть" в мено "弔айн"
* Убедитесь, что Файл документе имеет расширение DOC. (C:WIND0WS\PA504Hn CTOfl\WORD.TXT)
б)
Рис. 5.6. Сообщение об ошибке при попытке открыть документ в формате DOCкак текстовый файл: режим отладки приложения (а), режим выполнения приложения (6)
Работа со списком открытых документов
Вся информация об открытых и созданных документах содержится в коллекции Documents, элементами коллекции являются документы, а свойство коллекции Count определяет количество документов. Для начала получим список открытых документов, используем свойство Count коллекции и переберем все элементы коллекции. Создадим новую форму и разместим в ней компонент типа List Box 1 :TListBox. В момент появления этой формы на экране заполним ListBoxl именами документов, используя следующий программный текст.
;Получение списка открытых документов
procedure TUG5CH21_. FormShow(Sender: TObject); var a_:integer;
eee__: string;
begin
ListBoxl. Items. Clear;
for a :=1 to W.Documents.count do begin
©66_;^.Documents.Item(а_) .Name;
ListBoxl. Items. Add (eee_);
end;
end;
В результате выполнения этой процедуры получим список документов, открытых в данный момент времени. Пример формы с таким списком показан на рис. 5.7,
Рис* 5.7. Список открытых документов приложения WordРис* 5.7. Список открытых документов приложения Word
Рис* 5.7. Список открытых документов приложения Word
Рис* 5.7. Список открытых документов приложения Word
Когда документы открыты, мы можем выполнять с ними любые действия, например редактировать и сохранять, но перед этим нужно выбрать в списке документ, с которым будем работать. Для этого можно использовать метод Select или Activate элемента коллекции Documents. Первый метод выбирает и выделяет документ, второй — только выбирает. Вызвать метод Activate можно двумя следующими способами, но в обоих случаях результат будет одним и тем же.
口 W. Docmuents. Item (<номер документа в списке>). Activate;
口 W. Documents. Item (<имя документа в сдиске>) * Activate;
■ т ■ “те”/ 1:*т,."*,н,,比 t,v.f” *.,■ т ■ “те”/ 1:*т,."*,н,,比 t,v.f” *.,В нашем примере на рис. 5.7 по нажатию кнопки выполняется процедура, которая выбирает документ в списке ListBoxl по номеру документа. Номер первого документа в коллекции ——1.
■ т ■ “те”/ 1:*т,."*,н,,比 t,v.f” *.,
■ т ■ “те”/ 1:*т,."*,н,,比 t,v.f” *.,
Выбор документа в списке по номеру
procedure TUG5CH21_>ButtonlClick(Sender: TObject); begin
W.Documents.Item(ListBoxl.Itemlndex+li .Activate; end;
После того как документ создан (или открыт) и выбран, можно приступить к внесению в него изменений, т. е. к редактированию. Самое простое —— записать текст в документ.
Запись и чтение текста документа
Для того чтобы работать с документом, он не обязательно должен быть активным, но для удобства в основном будем рассматривать примеры работы с активным документом.
Рассмотрим объект Range, который входит в объект-документ и является его свойством. Объект Range представляет собой содержание части документа или всего документа. Методы этого объекта позволяют записывать и считывать информацию документа. Воспользуемся этим объектом и его методами для работы с содержимым документа.
Запись текста в документ
Для начала рассмотрим два метода, которые вставляют (записывают) текст. Метод InsertBefbre записывает текст в начало содержимого объекта Range. Метод InsertAfter записывает текст в конец содержимого объекта Range. Не нужно забывать, что объект Range может содержать как весь документ, так и его часть, а его методы действуют только на содержимое конкретного объекта Range* Допустим, объект Range включает в себя весь текст документа. Тогда метод InsertBefbre вставит текст в начале документа, сместив текст, который уже был в документе. Метод InsertAfter при этом вставит текст в конце документа. Если объект Range включает только часть текста документа, то эти методы вставят новый текст в начало или в конец этой части, сместив текст, который был в документе до их выполнения.
Рассмотрим практическую реализацию вызова этих методов в приложениях Delphi. В форме разместим кнопки и напишем следующие процедуры:
;Запись текста в документ с помощью методов InsertBefore и InsertAfter
procedure TUG5CH22_.ButtonlClick(Sender: TObject); begin
W.ActiveDocuwent»Range. InsertAfter (Memol *Text+1 (1 +inttostr (nn) +') nn:=nn+l;
end;
procedure TUG5CH22_.Button2Click(Sender: TObject);
begin
W. ActiveDocument. Range * InsertBefore (Memol. Text+ * (• +inttostr (nn) +1) nn:=nn+l;
end;
Рис. 5.8. Запись текста в документ (метод InsertAfter)
Пример результата работы метода InsertAfter представлен на рнс. 5.8.
На рис. 5.8 видно, что следующий фрагмент записывается правее предыдущего, т. е. новый текст добавлен в конец документа.
Пример результата работы метода Insert Before представлен на рис. 5.9.
В данном случае новый фрагмент текста записывается в начало, смещая к концу документа текст, уже имевшийся в документе.
Как выделить часть текста в документе и работать с ней, применяя описанные методы не ко всему документу, а к фрагменту? Для этой цели можно использовать функцию Range, возвращающую объект типа Range; аргументы функции — позиции начала и конца фрагмента.
В качестве примера рассмотрим небольшой фрагмент программы Delphi.
;Запись текста в заданный фрагмент документа
var MyRange:variant;
begin
MyRange:= W.ActiveDocument.Range(100,200);
MyRange * InsertAfter (1 Вставляем текст в конце заданного фратаента1) end;
Первый оператор определяет новый объект MyRange типа Range, включающий в себя данные с позиции 100 до позиции 200 (позиции соответствуют символам). После этого с новым объектом можно работать так же, как с базовым объектом, т. е. использовать его для записи текста в определенную позицию документа. В данном случае объект MyRange можно использовать для записи и чтения документа с позиции 100 по 200.
Рис. 5.9. Запись текста в документ (метод InsertBefore)
Чтение текста из документа
Рассмотрим чтение текста из открытого документа Word. Создадим новую кнопку и в процедуре обработки ее нажатия напишем следующий код.
? Чтение текста из документа, открытого в приложении Word
procedure TUG5CH22_.Button3Click(Sender: TObject); begin
Memo1.Text:=W.ActiveDocument.Range.Text;
end;
Рис, 5.10. Чтение текста из документа
На рис. 5.10 представлен результат работы этого кода.
Если требуется экспортировать в программу-контроллер очень большой текст, то можно работать с его фрагментами в документе. Для этого используйте процедуру Range(first, last), где first, last — границы диапазона (позиции символов), в котором находится рабочий фрагмент.
Другой способ чтения текста документа основан на чтении слов.
Пр/менание )
За слово принимается непрерывный фрагмент текста, состоящий из букв и цифр, который оканчивается пробелом, знаком препинания, арифметическим, логическим или другим символом. Все перечисленные символы или их комбинации за исключением пробела также представляют собой отдельные слова.
Рассмотрим коллекцию Words слов документа. Синтаксис может быть таким:
W .ActiveDocument .Words
Эта коллекция включает в себя слова объекта-хозяина. В следующем примере коллекция Words содержит все слова активного документа.
;Чтение коллекции слов в активном документе
procedure TUG5CH22_,Button4Click(Sender: TObject);
var a_:integer;
begin
Memol.Lines.Clear;
for a_:=l to W. ActiveDocument.Words * count do begin
Memol * Lines. Add (W. ActiveDocument. Words. item {a_). Text); end;
end;
Результат выполнения данной процедуры представлен на рис. 5.11.Результат выполнения данной процедуры представлен на рис. 5.11.Рис. 5.11. Чтение коллекции слов в активном документеРис. 5.11. Чтение коллекции слов в активном документе
Результат выполнения данной процедуры представлен на рис. 5.11.
Результат выполнения данной процедуры представлен на рис. 5.11.
Рис. 5.11. Чтение коллекции слов в активном документе
Рис. 5.11. Чтение коллекции слов в активном документе
Очевидно, что данный способ подходит для работы с отдельными словами, но его можно использовать только для чтения, а не для записи. Когда документ открыт, прочитан, изменен, то, возможно, потребуется сохранить эти изменения.
Сохранение документа
Самый простой способ сохранения документа заключается в вызове метода Save объекта-документа, например: W.ActiveDocument.Save. Данный способ удобно использовать, если документ ассоциирован с файлом на диске. Когда мы попробуем сохранить с помощью этого метода вновь созданный документ, то откроется диалоговое окно (рис. 5.12), активированное приложением Word.
Сохранение докуметггаСохранение докуметггаОапка:МоидокунвмтыОапка:Моидокунвмты2]画画由底闻固в]2]画画由底闻固в]птаптаЗаявки .□кнопки 二J Книги по быстрому чтению 22 Материалы для конкурсаМатериалы по теме Скорочтение 口 Менеджмент по обучающим протрамкаиМои музыкальные записи _lj Мои рисунки 」IЗаявки .□кнопки 二J Книги по быстрому чтению 22 Материалы для конкурсаМатериалы по теме Скорочтение 口 Менеджмент по обучающим протрамкаиМои музыкальные записи _lj Мои рисунки 」I[_1 Новая папкаО Открытки к новому 20ttО ПарфянОПримерО Примеры DelphiО Програнмироеаиие потоО ПсихологияLJ Рассылки[_1 Новая папкаО Открытки к новому 20ttО ПарфянОПримерО Примеры DelphiО Програнмироеаиие потоО ПсихологияLJ РассылкиI{^рхранир一I{^рхранир一ОтменаОтменаПдраиетры...Пдраиетры...±1±1
Сохранение докуметгга
Сохранение докуметгга
Оапка:Моидокунвмты
Оапка:Моидокунвмты
2]画画由底闻固в]
2]画画由底闻固в]
пта
пта
Заявки .□кнопки 二J Книги по быстрому чтению 22 Материалы для конкурса
Материалы по теме Скорочтение 口 Менеджмент по обучающим протрамкаи
Мои музыкальные записи _lj Мои рисунки 」I
Заявки .□кнопки 二J Книги по быстрому чтению 22 Материалы для конкурса
Материалы по теме Скорочтение 口 Менеджмент по обучающим протрамкаи
Мои музыкальные записи _lj Мои рисунки 」I
[_1 Новая папка
О Открытки к новому 20tt
О Парфян
ОПример
О Примеры Delphi
О Програнмироеаиие пото
О Психология
LJ Рассылки
[_1 Новая папка
О Открытки к новому 20tt
О Парфян
ОПример
О Примеры Delphi
О Програнмироеаиие пото
О Психология
LJ Рассылки
I{^рхранир一
I{^рхранир一
Отмена
Отмена
Пдраиетры...
Пдраиетры...
±1
±1
mmij<« файла: [зЙО
m
m
Din файле: Документ Word
Рис. 5Л2. Попытка сохранить новый документ с помощью метода Save
Если мы закроем диалог без сохранения документа, то получим ошибку. На рис. 5.13 отображено диалоговое окно с сообщением об исключительной ситуации, возникшей в режиме отладки программы.
Рис. 5.13* Отображение ошибки выполнения метода Save (режим отладки приложения)Рис. 5.13* Отображение ошибки выполнения метода Save (режим отладки приложения)
Рис. 5.13* Отображение ошибки выполнения метода Save (режим отладки приложения)
Рис. 5.13* Отображение ошибки выполнения метода Save (режим отладки приложения)
В режиме выполнения откомпилированного приложения сообщение об этой ошибке будет выглядеть, как показано на рис. 5.14.
Чтобы избежать появления ошибок выполнения, необходимо при выполнении процедур сохранения документа обрабатывать исключительные ситуации. Используйте конструкцию try … except …end языка Delphi. В случаях, когда не нужно выводить диалоговое окно сохранения документа, его можно подавить. Метод подавления диалоговых окон Word будет рассмотрен позже.
Рис. 5*14. Отображение ошибки выполнения метода Save (режим выполнения приложения)Рис. 5*14. Отображение ошибки выполнения метода Save (режим выполнения приложения)
Рис. 5*14. Отображение ошибки выполнения метода Save (режим выполнения приложения)
Рис. 5*14. Отображение ошибки выполнения метода Save (режим выполнения приложения)
Эффективным способом избежать ошибок, возникающих при сохранении документов, может быть проверка ибыл документ сохранен или нет" и использование для сохранения метода SaveAs. Для проверки факта сохранения открытого документа на диск используйте свойство документа Saved ——если оно имеет значение True, то документ был сохранен, если False — нет.
Рассмотрим следующий фрагмент программы.
^•^••^•■^■■••■^•■«••vlW*t"lfwy-vw7,7*iwy.W"P<«Ay.w,»7V.VAVr^*,AV,r*V'VF'W"4'?-^JV-5*-?*™^,r,''*,V*rt'*,*,K41"^-^^?4"'^
;Проверка факта сохранения документа.
procedure TUG5CH22_.ButtonbClick(Sender: TObject); begin
if W.ActiveDocument. Saved then
messagebox(handle,Документ сохранен!', внимание!,,0);
if not W.ActiveDocument.Saved then
messagebox(handle,1Документ не сохранен!1,'Внимание!',0);
end;
Результат выполнения может быть одним из двух (рис. 5.15 и 5.16).
Рис. 5.15. Документ был сохраненРис. 5.15. Документ был сохраненРис. 5.16. Документ не был сохраненРис. 5.16. Документ не был сохранен
Рис. 5.15. Документ был сохранен
Рис. 5.15. Документ был сохранен
Рис. 5.16. Документ не был сохранен
Рис. 5.16. Документ не был сохранен
Если вновь созданный документ не был сохранен, то для его записи на диск используется метод SaveAs. В спецификации языка Visual Basic (VB) он описан так:
ActiveDocument.SaveAs(FileName, FileFormat, LockComments > Password, AddToRecentFiles, WritePassword, ReadOnlyRecommended, EmbedT rueType Font s, SaveNativePictureFoxmat, SaveFo nnsData, SaveAsAOCELetter)
Аргументы метода SaveAs определяют режимы и формат файла для сохраняемого документа. Используя их при вызове метода, можно добиться такого же результата, как и в режиме обычного пользователя приложения Word. Аргументы метода, их типы и назначение представлены в табл. 53
Таблица 5.3. Аргументы метода SaveAst их типы и функциональное назначение
Аргумент
Тип
Функциональное назначение
FileName
String
Путь и имя файла
FileFormat
Число
Формат файла, см. табл. 54
LockComments
Boolean
True — не сохранять комментарии
Password
String
Пароль, который будет использоваться при открытии документа
AddToRecentFiles
Boolean
True — добавить имя файла в список меню File
WritePassword
String
Пароль, который будет использоваться для сохранения документа
ReadOnlyRecommended
Boolean
True — в последующем документ можно открыть "только для чтения11
EmbedT rueTypeFonts
Boolean
True — при сохранении перевести шрифты документа в TrueType
SaveNativePictureFormat
Boolean
Используется для импорта графики из форматов, не поддерживаемых Windows’ True — импортировать только графику, поддерживаемую Windows
SaveFormsData
Boolean
True — сохранить форму документа без текста
SaveAsAOCELetter
Boolean
Используется в версиях Word для компьютеров Apple Macintosh
При вызове метода SaveAs можно задавать как один» так и несколько аргументов —количество определяется только необходимостью их использования в создаваемом приложении. Обычно достаточно первого аргумента (путь и имя файла).
При вызове метода SaveAs из приложений, созданных в Delphi, есть некоторые отличия синтаксиса от вызова в VB, но они не принципиальны.
Рассмотрим примеры синтаксиса вызовов метода SaveAs в Delphi.
Сохранение документа с указанием пути и имени файла:
О W. ActiveDocinnent. Save As (MyFi leName);
口 W. Active Document. SaveAs (FileName: ^yFileName);
где MyFileName — строка, содержащая путь и имя файла.
Сохранение документа с указанием пути и имени файла, а также пароля:
口 W, ActiveDocument.SaveAs (Filename :=4lyFilename,
Passwords *мой пароль ')
Сохранение документа, ассоциированного с именем файла, с указанием пароля:
口 W ・ Act iveDocument. SaveAs (Pas sword: =' мой пароль ')
Для задания или изменения формата сохраняемого документа необходимо использовать числовой аргумент File Format, значения которого представлены в табл. 5.4.
Таблица 54 Значения аргумента FileFormat метода SaveAs и форматы файлов сохраняемых документов
Константа
Значение
Формат сохраняемого документа
WdFormatDocument
0
Документ Word (файл с расширением имени DOC)
WdFormatDOSText
4
Текст DOS (файл с расширением имени TXT)
WdFormatDOSTextLineBreaks
5
Текст DOS с разбиением на строки (файл с расширением имени TXT)
WdFormatRTF
6
Текст в формате RTF (файл с расширением имени RTF)
WdFormatTemplate
1
Шаблон Word (файл с расширением имени DOT)
WdFormatText
2
Только текст (файл с расширением имени TXT)
WdFormatTextLineBreaks
3
Текст с разбиением на строки (файл с расширением имени TXT)
WdFomnatUnicodeText
7
Кодированный текст (файл с расширением имени TXT) — текст в кодировке UNICODE
Итак, мы открыли документ, считали из него текст, внесли в документ необходимые изменения и сохранили его. Теперь нужно закрыть его и закончить работу с приложением Word.
Закрытие документа и приложения Word
Если приложение обрабатывало несколько документов, и все они уже сохранены, то эти документы можно закрыть одновременно с помощью метода Close коллекции Documents, Добавим в форму приложения кнопку н напишем программный текст, который закроет все открытые документы.
Закрытие всех открытых документов
procedure TForml.Buttonl5Click (Sender: TObject); begin
W.Application*Documents .Close; end;
Если требуется выборочно закрывать документы коллекции, используйте метод Close объекта-документа. Например, чтобы закрыть активный документ, используйте оператор:
W. Active Document. Close;
Особенность метода Close ——возможность задать режим сохранения документа во время его закрытия. Оператор
W * ActiveDocument. Close (True);
сохраняет н закрывает документ.
Документы закрыты, можно закрыть приложение Word и очистить память от объекта Application. Используем метод Quit объекта Application и оператор W:=UnAssigned;. Реализуем это в виде процедуры-обработчика нажатия кнопки.
:Закрытие приложения Word
procedure TForml.Buttonl6Click(Sender: TObject); begin
W.Quit;
W :=UnAs signed;
end;
Обработка ошибок выполнения при работе с объектом Application
Вызов методов объекта Application и его дочерних объектов может приводить к ошибкам в процессе работы программы. Эти ошибки нужно обрабатывать, иначе они приведут к "зависанию” приложения или всей системы.
К тому же обработка ошибок — средство получения информации для анализа функционирования приложения. Как обычно, для обработки исключительной ситуации используем синтаксис try …except …end. Таким образом, каждое обращение к методам и объектам Application придется обрамлять синтаксисом обработки ошибок. Это, в конечном итоге, приведет к увеличению исходного текста программы и сопутствующим проблемам. Решением этих проблем может быть создание и использование пользовательской библиотеки процедур и функций с обработкой ошибок выполнения. Для начала можно создать библиотеку в виде модуля unit, а затем — в виде динамической библиотеки. Рассмотрим синтаксис библиотеки и процедур и функций для работы с Word*Application.
s Синтаксис библиотеки процедур и функций для работы с Word.Application
unit MyWord; interface
// За голов еси процедур и функций
Function CreateWord:boolean;
Function VisibleWord(visible:boolean):boolean;
Imp lementat i on
// Исполъзуемые библиотеки
uses СсжОЬj;
// W — переменная, которая является ссылкой на объект Application var W:variant;
// Функция CreateWord создает объект Word.Application и помещает ссыпку // на него в переменную W:variant. Если объект создан без ошибок, то // исключительная ситуация не возникает и функция возвращает True* Если // возникает ошибка, например если приложение Word не установлено // в системе, то вызывается исключительная ситуация и функция возвращает // значение False.
Function CreateWord:boolean;
begin
CreateWord:=true;
try
W:^CreateOleObj ect('Word.Application');
except
CreateWord:=false;
end;
End;
// Функция VisibleWord показывает/скрывает окно приложения Word. // Она основана на свойстве Visible объекта Application.
// В результате ошибки возникает ис ключитель на я ситуация
//и функция возвращает значение False.
Function VisibleWord(visible:boolean) :boolean;
begin
Vis ibleWord: =true;
try
W. visible := visible;
except
VisibleWord:=false;
end;
End;
End.
Полный текст библиотеки процедур и функций с описанием приведен в Приложении /.
Далее в книге все исходные тексты примеров приложений приводятся с использованием этой библиотеки.
ГЛАВА 6
Создание простого документа
В этой главе мы рассмотрим некоторые свойства и методы объектов, принадлежащих объекту Application, необходимые для создания простого документа, например почтового конверта и бланка платежного поручения. Вы можете, используя и развивая описанную здесь методику, автоматизировать создание различных документов для нужд вашего предприятия.
Выделение текста
Из предыдущей главы вы узнали, что для работы с текстом используется объект Range, принадлежащий объекту-документу. В прошлый раз мы рассмотрели методы объекта Range, предназначенные для вставки фрагментов текста в начало или конец или в определенную позицию документа. Так можно создавать простой текст. Но чтобы создавать сложные документы с определенной структурой, заполняемой при формировании документа, требуются методы, позволяющие выделять фрагменты и работать с ними. Также необходимы функции поиска фрагментов и подстановки текста, методы для перемещения курсора в начало, конец или определенную позицию документа. Все эти методы реализованы в объектах Range н SelectionSelection ——объект, ассоциированный с выделенным в данный момент времени объектом. Выделенным объектом может быть не только фрагмент текста, но и ячейки таблиц, табшшы целиком, надписи, рисунки и т. д. Исходя из этого, объект Selection может обладать свойствами любого визуального объекта, входящего в документ, н даже свойствами самого документа (если он выделен полностью). Но сейчас нас интересует только текст, и мы будем рассматривать Selection только применительно к нему.
Для того “тобьЕ получить доступ к выделенному объекту, необходимо выделить весь текст документа или его фрагмент. Выделим фрагмент текста. Для этого можно использовать метод Select объекта Range. Рассмотрим два спо* соба использования этого метода*
еление фрагмента текста в документе (первый способ)
var MyRange:variant;
start, end:integer;
MyRange: =W• ActiveDocument. Range {statr, end);
MyRange. Select;
Выделение фрагмента текста в документе (второй способ)
var statr, end:integer;
W.ActiveDocument.Range(statr, end).Select;
Рис. 6.1. РезультатРис. 6.1. Результатиспользования метода Selectиспользования метода SelectРезультаты применения этих способов абсолютно идентичны и основаны на функции Range(a, b), возвращающей усеченный объект Range* Иногда удобно использовать первый способ, особенно если в дальнейшем предполагается работа с усеченным объектом.
Рис. 6.1. Результат
Рис. 6.1. Результат
использования метода Select
использования метода Select
В следующем примере используется второй способ. Создадим форму и кнопку, для которой в процедуре обработки нажатия разместим следующий программный текст:
:Процедура:Процедуравыделения фрагмента текставыделения фрагмента текста
:Процедура
:Процедура
выделения фрагмента текста
выделения фрагмента текста
procedure TForml.Button4Click(Sender: TObject); begin
W.ActiveDocument.Range(lf 50).Select;
end;
Откроем любой документ и вызовем эту процедуру, нажав кнопку. Результат ее выполнения отображен на рис. 6.1.
Таким образом, мы получили объект Selection. Пусть он содержит только текст, но мы уже можем исследовать методы и свойства этого объекта.
Объект Selection
Исследуем объект Selection. Как уже сказано, этот объект может обладать свойствами любого выделяемого объекта. В нашем случае выделен текст, поэтому было бы интересно для начала прочитать этот текст. Весь выделенный текст содержится в свойстве Text объекта Selection.
Прочитаем этот текст, используя средства Delphi и ссылку W на объект Application. Разместим в нашей форме новую кнопку и напишем следующий фрагмент программы в процедуре обработки ее нажатия.
;Чтение (импорт) выделенного текста из документа Word
procedure TForml.ButtonbClick(Sender: TObject);
var eee_:string;
begin
eee_:=W.Selection.Text;
messagebox(handle,pchar(eee_),*Чтение текста из выделенного фрагмента!1,0); end;
Оператор e6e_:=W.Selection*Text; помещает выделенный текст в строковую переменную.
Результат выполнения этой процедуры предстаапен на рис. 6.2.
Для чтения текста из документа можно воспользоваться не только объектом Selection, но и свойствами и полями объекта Range. Например, оператор eee_:=W, Active Document. Range( 1, 23).Text; поместит в переменную еее_ текст с первого по двадцать третий символ документа. Это справедливо, по-
тому что объект Selection обладает свойствами и методами любых видимых элементов документа, в том числе и свойствами фрагмента текста. Конечно, можно напрямую работать с объектами документа, не выделяя их, но в некоторых случаях просто не обойтись без выделения, а также без свойств и методов объекта Selection.
IW MicicmaII Wmd ' IC uHnbEkiispHiui программа
]吧史М" Правка 旦нд Ньд»д 中а₽и«* 匸冲вис 126m<l・ QkHO 二..個」Xl
心0日昌0计x匾臨0 * <^is< и so га",:••
才空4▼ Tm吧?R<mn• Д Г 跟К9卷善亜七i三年津1一0A,_/己讀.
\」Q±1 力,’壁 Вслэламанты« Сйяйл>.
! з -。Е) 0 9 Иэфвга* Лерецш* ГЛ,「也吗吁 >—噌臾炉i.htm•曰曰鼠戰 21H °eC4 ®
Современный этап развития общества характеризуется бурным ннформацг1£)нным ростом.
[Ежедневно человеку npHxoninc* С1атпа1ваться с ofpo| ко юрой он воспринимает через орган зрения, I
Персональные комгшютеры с каждым годом все боль млн жителей России поль^ются лома компьютер: бесследно. 40% пользователей ПК нспьггывшот яап 9246 зрительное утомленнс развита а ется время от вр пряводяг к исто1ценшо компенсаторных ВОЗМОГЮС1Персональные комгшютеры с каждым годом все боль млн жителей России поль^ются лома компьютер: бесследно. 40% пользователей ПК нспьггывшот яап 9246 зрительное утомленнс развита а ется время от вр пряводяг к исто1ценшо компенсаторных ВОЗМОГЮС1口EMTb АО*1gM*мт口EMTb АО*1gM*мтВыйнжннй Форманта текстаВыйнжннй Форманта текста月 I инне иьаеламго 中 рагмигп & i ексгй月 I инне иьаеламго 中 рагмигп & i ексгй「СНек гвкет「СНек гвкетПОМЖ И Э4НИСН4ПОМЖ И Э4НИСН4зайалс ^^?еждидиетжтев^тэд|Мзайалс ^^?еждидиетжтев^тэд|МWWНСВШП СоЬрдаивйный атвг рвдаяия обш^СЕв хармгврбЕйй буррм н^едмацийнным ростом Е н камеею чопове*.!* прихоАйгся ст m нмгьсй с <хр«*»чьм сбъвмом мооой ии^ос*нацим. 60*90% которой он »ocnp»«««<*»a? через орг^и зритз ЭДИННАкратковрачу- '.一:SIЛ еПС О .'uh i Ю| itiU 1 ki и^1 И^гЮЯГП^ Lri> ^ПУТ^Т^^** в i О Wi>l h b|^vzv_под кабинетом, отсутствие свободного времени н •-/聖:巴⑪祈“巾”ЭТОГО не делаем. И тогда возникла МЫСЛЬ О создаю Всгшгтк фрагмент юб^ферд могла помочь в ранней диагностике зябопеваний глаз , •НСВШП СоЬрдаивйный атвг рвдаяия обш^СЕв хармгврбЕйй буррм н^едмацийнным ростом Е н камеею чопове*.!* прихоАйгся ст m нмгьсй с <хр«*»чьм сбъвмом мооой ии^ос*нацим. 60*90% которой он »ocnp»«««<*»a? через орг^и зритз ЭДИННАкратковрачу- '.一:SIЛ еПС О .'uh i Ю| itiU 1 ki и^1 И^гЮЯГП^ Lri> ^ПУТ^Т^^** в i О Wi>l h b|^vzv_под кабинетом, отсутствие свободного времени н •-/聖:巴⑪祈“巾”ЭТОГО не делаем. И тогда возникла МЫСЛЬ О создаю Всгшгтк фрагмент юб^ферд могла помочь в ранней диагностике зябопеваний глаз , •Программа «Ор бис» предназначена для нс следов персонального компьютера.Программа «Ор бис» предназначена для нс следов персонального компьютера.
Персональные комгшютеры с каждым годом все боль млн жителей России поль^ются лома компьютер: бесследно. 40% пользователей ПК нспьггывшот яап 9246 зрительное утомленнс развита а ется время от вр пряводяг к исто1ценшо компенсаторных ВОЗМОГЮС1
Персональные комгшютеры с каждым годом все боль млн жителей России поль^ются лома компьютер: бесследно. 40% пользователей ПК нспьггывшот яап 9246 зрительное утомленнс развита а ется время от вр пряводяг к исто1ценшо компенсаторных ВОЗМОГЮС1
口EMTb АО*1gM*мт
口EMTb АО*1gM*мт
Выйнжннй Форманта текста
Выйнжннй Форманта текста
月 I инне иьаеламго 中 рагмигп & i ексгй
月 I инне иьаеламго 中 рагмигп & i ексгй
「СНек гвкет
「СНек гвкет
ПОМЖ И Э4НИСН4
ПОМЖ И Э4НИСН4
зайалс ^^?еждидиетжтев^тэд|М
зайалс ^^?еждидиетжтев^тэд|М
W
W
НСВШП СоЬрдаивйный атвг рвдаяия обш^СЕв хармгврбЕйй буррм н^едмацийнным ростом Е н камеею чопове*.!* прихоАйгся ст m нмгьсй с <хр«*»чьм сбъвмом мооой ии^ос*нацим. 60*90% которой он »ocnp»«««<*»a? через орг^и зритз ЭДИННА
кратко
врачу- '.一:SI
Л еПС О .'uh i Ю| itiU 1 ki и^1 И^гЮЯГП^ Lri> ^ПУТ^Т^^** в i О Wi>l h b|^vzv_
под кабинетом, отсутствие свободного времени н •-/聖:巴⑪祈“巾”
ЭТОГО не делаем. И тогда возникла МЫСЛЬ О создаю Всгшгтк фрагмент юб^ферд могла помочь в ранней диагностике зябопеваний глаз , •
НСВШП СоЬрдаивйный атвг рвдаяия обш^СЕв хармгврбЕйй буррм н^едмацийнным ростом Е н камеею чопове*.!* прихоАйгся ст m нмгьсй с <хр«*»чьм сбъвмом мооой ии^ос*нацим. 60*90% которой он »ocnp»«««<*»a? через орг^и зритз ЭДИННА
кратко
врачу- '.一:SI
Л еПС О .'uh i Ю| itiU 1 ki и^1 И^гЮЯГП^ Lri> ^ПУТ^Т^^** в i О Wi>l h b|^vzv_
под кабинетом, отсутствие свободного времени н •-/聖:巴⑪祈“巾”
ЭТОГО не делаем. И тогда возникла МЫСЛЬ О создаю Всгшгтк фрагмент юб^ферд могла помочь в ранней диагностике зябопеваний глаз , •
Программа «Ор бис» предназначена для нс следов персонального компьютера.
Программа «Ор бис» предназначена для нс следов персонального компьютера.
Рис. 62 Чтение выделенного фрагмента текста
Рассмотрим некоторые свойства и методы этого объекта, в том числе принадлежащие ему объекты. В табл. 6.1 перечислены наиболее часто используемые свойства и методы объекта Selection, их типы и краткое описание.
Таблица 6.7. Свойства и методы объекта Selection
Свойства и методы
Тип
Описание
Гуре
Число
Тип выделенного объекта (обычный текст Type =wdSelectionNormal=2)
StoryType
Число
Тип выделяемого объекта {может быть выделен основной текст, текст в заголовках, комментариях и т. п.)
Таблица 6Л (окончание)
Свойства и методы
Тип
Описание
Text
Строка
Текстовое содержимое
Start
Число
Начальная позиция выделенного объекта
End
Число
Конечная позиция выделенного объекта
Characters
Коллекция
Символы выделенного объекта, их количество
ConvertToTable
Метод
Преобразование выделенного текста в таблицу
Copy
Метод
Копирование текста в буфер обмена
Paste
Метод
Вставка текста из буфера обмена
CopyAsPicture
Метод
Копирование выделенного текста (объекта) в буфер обмена с преобразованием его в графичбский объект в формате ВМР
Cut
Метод
Вырезание выделенного фрагмента текста
Delete(a, b)
Метод
Удаление выделенного фрагмента текста (вызов без аргументов) или удаление фрагмента из b символов начиная с позиции а
Find
Объект
Поиск, поиск и замена в документе
Font
Объект
Шрифт выделенного объекта
InRange(MyRange)
Метод
Проверка вхождения выделенного объекта в объект MyRange
InsertAfter
Метод
Вставка текста после объекта Selection
InsertBefore
Метод
Вставка текста до объекта Selection
Move(Unit, Count)
Метод
Перемещение объекта Selection в документе (перемещение курсора)
SetRange(a( b)
Метод
Выделение текста между позициями а и b
Style
Число
Стмль выделенного текста
TypeText
Метод
Вставка текста на место выделенного объекта или с позиции курсора
Words
Коллекция
Слова в выделенном объекте
Рассмотрим подробней некоторые свойства объекта Selection.
При работе с текстом требуется уверенность в том, что это именно текст, чтобы не применять методы, свойственные тексту, к другим объектам, и
наоборот. Если применить к выделенному тексту методы, свойственные, например, ячейкам таблицы» будет получена ошибка выполнения. Определить тип выделенного объекта позволяет свойство Туре. Если Туре = wdSelectionNormal, это значит, что выделенный объект является текстом, при этом свойство Text объекта Selection содержит выделенный текст.
Свойства Start и End определяют начальную и конечную позицию (в символах) выделенного фрагмента текста. Если Selection.Start = Selection.End, то размер выделенного объекта равен нулю, т. е. ничего не выделено. Но при этом объект Selection все равно существует. Если Selection.Start = Selection.End = 0, это означает, что курсор находится в начале документа (при условии что наш документ содержит только текст). Используя свойства Start и End, можно установить курсор в любую позицию документа. Если Selection.Start О Selection.End, то это означает, что выделен фрагмент текста между двумя позициями, значения которых записаны в эти поля. Присваивав им различные значения, можно манипулировать размерами выделенной области текста. Для примера откроем текст с помощью метода Open коллекции Documents и установим значения полей Start и End. Вот фрагмент исходного текста профам мы.
:Задание диапазона выделенного объекта
procedure TForml.Button6Click(Sender: TObject); begin
W,Selection.Start:=13;
W* Selection.End:=25;
end;
Результат выполнения данной процедуры показан на рис. 6.3.
ПерсональныеПерсональныекомпьютеры скомпьютеры скаждым годомкаждым годом
Персональные
Персональные
компьютеры с
компьютеры с
каждым годом
каждым годом
Рис. 63 Процедура устанавливает границы выделения
Также нетрудно убедиться, что положение курсора будет изменяться при изменении свойств Start и End объекта Selection. Если их значения установить н ноль, то курсор переместится в начало документа, и переместится в коней документа, когда их значения будут равны количеству символов документа. Следующий фрагмент программного кода показывает, как переместить курсор в начало и конец документа.
Перемещение курсора в начало и конец документа
W.Selection.Start:=0;
W.Selection・ End:=0;
W.Selection.Starti^.ActiveDocument.Characters.Count;
W.Selection.End:=W.ActiveDocument.Characters.Count;
Манипуляции с полями Start и End — не единственный способ перемещения курсора или выделения объекта.
Рассмотрим метод Move(Unit, Count) объекта Selection. Он позволяет перемещать курсор на определенное количество символов, слов, преиаожений или абзацев, в конец или начало документа, а также по ячейкам таблицы. Этот метод позволяет достичь начала или конца документа, если вызывать его неоднократно (до тех пор, пока возвращаемое им значение не равно 0). У метода есть два аргумента (табл. 6.2): первый определяет выполняемое действие, а второй ——величину и направление перемещения курсора (при отрицательном значении курсор перемещается по направлению к началу текста).
Таблица 62 Действия метода Move при разных значениях аргументов
Значение аргумента Unit
Выполняемое действие
WdCharacter =1
Переход к следующему символу
WdWord=2
Переход к следующему слову
WdSentence=3
Переход к следующему предложению
WdParagraph=4
Переход к следующему абзацу
WdSection=8
Переход к следующему разделу
WdStory=6
Переход в следующую текстовую область документа
WdCell=12
Переход к следующей ячейки
WdColumn=9
Переход к следующему столбцу
WdRow=10
Переход к следующей строке
WdTable=15
Переход к следующей таблице
WdLine=5
Переход к следующей линии
Если вызвать метод Move без аргументов, то по умолчанию его выполнение переместит курсор вперед по тексту на один символ.
Рассмотрим использование метода Move в синтаксисе языка Delphi. Создадим в форме кнопку и поместим в процедуру обработки ее нажатия следующий программный код.
:Перемещение курсора по тексту
procedure TFonnl*Buttonl5Click(Sender: TObject);
const wdCharacter=l;
begin
W. Select ion. Move {wdCharacter, 3); end;
Задавая разные значения первого аргумента (см. табл. 6.2), можно проверить работу этого метода и на более сложных документах, содержащих таблицы, рисунки и т. п.
Рассмотрим другие методы объекта Selection.
Когда курсор установлен в необходимое положение и выделен текст (как объект Range), можно поместить этот текст в буфер обмена или наоборот, вставить текст из буфера обмена на место выделенного текста. Для этого используются два метода объекта Selection ——Сору н Paste. Метод Сору копирует выделенный текст в буфер обмена, метод Paste извлекает текст из буфера и вставляет его в текст, начиная от положения курсора. Если до выполнения метода Paste был выделен объект» то текст вставляется на место этого объекта. Эти методы можно применять к объекту любого тапа (в данном случае в качестве объекта мы рассматриваем текст).
Синтаксис вызова этих методов в Delphi показан в следующем программном коде.
Использование методов Paste и Сору
procedure TFoml,ButtonSClick (Sender: TObject); begin
W.Selection.Copy;
end;
procedure TForml.Button9Click(Sender: TObject);
begin
W. Selection. Paste;
end;
Наряду с этими двумя методами можно упомянуть метод CopyAsPicture, который может быть очень полезен в некоторых задачах. Он помещает в буфер обмена графическое изображение (битовый рисунок) выделенного объ-
екта. Его также можно вызывать из приложений Delphi. Рассмотрим следующий пример.
;Использование метода CopyAsPicture
procedure TFonul *Buttonl6Click (Sender: TObject);
begin
W.Selection.CopyAsPicture;
end;
Выделим часть текста (рис. 6.4) и вызовем вышеописанную процедуру нажатием кнопки.
Расплетите кабель и ■ расположите провода в | соответствии с выбранной вамн схем。京 задалкнДЕ
длина расплетения не должна превышать 12*5 мм.
(Нажмите на картинку, чтобы посмотреть анимщкю)
Рис. 6.4. Выделим текст перед тем, как вызвать метод CopyAsPicture
Запустив графический редактор Paint и выполнив операцию вставки из буфера обмена, получим результат, показанный на рнс. 6.5.
Рис. 6.5. Анализ скопированного в буфер как рисунок (методом CopyAsPicture) выделенного фрагмента документаРис. 6.5. Анализ скопированного в буфер как рисунок (методом CopyAsPicture) выделенного фрагмента документа
Рис. 6.5. Анализ скопированного в буфер как рисунок (методом CopyAsPicture) выделенного фрагмента документа
Рис. 6.5. Анализ скопированного в буфер как рисунок (методом CopyAsPicture) выделенного фрагмента документа
Выделенный текстовый фрагмент можно не только скопировать и преобразовать в графический объект, но и преобразовать в таблицу, как мы это часто делаем, редактируя текст. Используя автоматизацию в Word, в отличие от обычного редактирования, мы достигнем большей скорости н гибкости для преобразования таблиц, набранных в обычном текстовом режиме с разделителями, в таблицы Word.
Для этого предназначен метод ConvertToTable объекта Selection. У этого метода имеется несколько аргументов, которые задают форматы и режимы преобразования* Пожалуй, один из основных аргументов — Separator (символ -раздел итель). В таблицах, набранных в DOS, таким символом был элемент псевдографики. Используя этот аргумент, можно без труда преобразовать таблицы, оформленные до этого в обычном текстовом редакторе. Другой не менее важный параметр ——Format (формат представления таблицы). Этот аргумент представлен переменной типа integer и может принимать несколько значений. При преобразовании текста в таблицу можно также задать количество столбцов (NumColurnns), строк (NumRows) и начальную ширину столбцов (InitialColumnWidth). Если не задавать все эти параметры, то преобразование произойдет в режиме "по умолчанию".
Рассмотрим спецификацию вызова метода ConvertToTable в Visual Basic.
;Вызов метода ConvertToTable в Visual Basic
Selection.ConvertToTable(Separator, NmnRows, NumColumns, lnitialColumnWidthf Format, Z^pplyBorders, Apply Shading, ApplyFont, ApplyColor, ApplyHeadingRows, ApplyLastRow, ApplyFirstColumn, ^plyLastColumn, AutoFit)
Вызов этого метода в приложении Delphi будет выглядеть иначе в соответствии с принятой спецификацией языка программирования Pascal.
Например, требуется преобразовать выделенный текст в таблицу из пяти столбцов. В качестве разделителя текста используем символ пробела, формат таблицы зададим константой wdTable Format G rid2= 17 н используем значения выбранных характеристик в качестве аргументов метода ConvertToTable. Смотрите исходный текст.
:Преобразование вы口пленного текста в таблицу (Delphi)
procedure TForntl,Buttonl7Click{Sender: TObject);
const wdTableFonnatGrid2=17;
begin
W. Selection. ConvertToTable (Separator : = ' ', NumRows: =5, NumColumns: =5, Format: ^dTableFormatGridS);
end;
Откроем произвольный документ и выделим фрагмент текста, как на рис. 66
После применения к выделенному тексту метода ConvertToTable получим результат, представленный на рис. 6.7.
Отказ от повтор! юго прочтения текста гювь皿ает скорость чтения в ава раза а качество
【онжшнш прмшотюго текста гювннтает к трн раз&|
Рис. Б.6. Выделяем фрагмент текста
Отказ
от
повторного
прочтения
текста
повышает
скоросп»
чтения
в
два
раза,
а
качество
понимания
прочгтганного
текста
1
повышает
в
три
раза.
Рис. 6.7. Текст преобразован в таблицу
Возможно, нам придется удалять некоторые фрагменты текста. Это можно сделать несколькими способами. Поскольку мы рассматриваем работу с объектом Selection, то используем для этой цели его метод Delete или Cut.
:Вызов методов Delete и Cut для удаления выделенного фрагмента текста
к,"”” -*ТМ**+»МЧЧ*;4^**Н**44"*ФГ+“+>*4**Т»Чч4Ф1»3,」4г,^м,,;》МЧ«*»1"<^<НЕ” ;Ff ,*;*##rtW»w*W^t4*C<i*“,***El;Ef”“*№»4+r№L”ErB*WM—IK. ””* “.Е*Г”<т“《т**4г“*ЧЧЧЕ“”Е,”Ч*"^**—Ef*,”"
W.Selection.Delete;
W・ Selection.Cut;
Отличие этих методов заключается в том, что первый метод удаляет выделенный объект целиком, а второй помещает его в буфер обмена, а только потом удаляет. Второе отличие этих методов определяется их действием на текст, если последний не выделен. В этом случае первый метод удаляет один символ после курсора, а второй просто вызовет ошибку выполнения.
Прмменан/е )
Для удаления выделенного фрагмента можно также воспользоваться объектом Range. Так как у объектов Range и Selection много общего, методы удаления фрагментов текста у них одноименные:
W.ActiveDocuir^ent.Range (1,20). Delete;
W.ActiveDocument.Range(1,20) .Cut;
При создании документов не обойтись и без методов, позволяющих вставлять текст. В предыдущей главе были рассмотрены два метода объекта Range — InsertAfter и Insert Before. Эти методы есть и у объекта Selection. Дополнительно можно рассмотреть метод TypeText, позволяющий вставлять текст начиная с позиции курсора (если нет выделенного текста) или замещать выделенный текст. У этого метода только один аргумент ——текстовая строка.
Внзов этого метода в среде Delphi выглядит так:
??:屮》^«由:.,!;”丁…”",,l"1,”T”r.F“¥””];—,t”r:;;tt<*"i"”."””.:”《Mttrt^y*,iy!]^*T:,m?WhF:T.”.;!:rly.KlVl:f,¥nW〕T.""”:".;,,liall,"!*T*T*eT,yE・*1".TmFF罩!“В"""..;
i Использование метода TypeText
procedure TForml.Buttonl8Click(Sender: TObject);
begin
W.Selection.TypeText (1 <— Заменяем выделенный фрагмент данным текстом ―>*); end;
Вставить текст в положение курсора или вместо выделенной области можно и более простым способом. Достаточно записать нужный текст в свойство Text объекта Selection, при этом результат будет таким же, как при выполнении метода TypeText.
;Использование свойства Text
procedure TForml.ButtonVClick(Sender: TObject); begin
W. Selection.Text: = <-- Заменяем выделенный фрагмент данным текстом -->; end;
Результат применения любой из этих двух процедур к выделенному фрагменту текста (см. рис< 6.2) представлен на рис. 6,8.
Иногда требуется получить размер выделенной области (фрагмента) в символах или словах, скопировать определенные символы или слова, а также задать или получить параметры шрифта для выделенной области текста. Выделенная область (определяемая объектом Selection), как и область текста (определяемая объектом Range), обладает аналогичными одноименными свойствами. Коллекция Characters, входящая в объект Selection, позволяет работать с отдельными символами области, в частности получить ее размер. Коллекция Words объекта Selection содержит отдельные слова области и определяет ее размер в словах. Объект Font, принадлежащий выделенной области, определяет или задает для нее параметры шрифта.
Еще один полезный параметр объекта Selection — Style типа integer, содержащий информацию о стиле выделенного текста. Если ему присвоить какое-либо значение из допустимых (существует около сотни стилей), то выделенный текст будет отображен в соответствующем стиле. Можно разработать и использовать свой стиль.
Разберем следующий пример: выделим текст и выполним оператор W.Seleciion,Style:=WdStyleHyperfinkFollowed; (значение константы WdStyleHyperlinkFollowed = —87). Выполнение данного оператора установит стиль текста, который представлен на рнс. 69
W М<сгпап11 Wntd - Ком1№птсг1на£1 шкЛтраммА
」电芝啦1 прм*8良依日CTj^fJ 中си3т Дерене工giw岫象* ?
;1 口否口,豆®h m砲)曜 b金, •@小紅СЗ函口国,成7,田
Обьмшн * Ггпе$ New RoflMH
〜J -二一p*-4-... -a-~二宀,*".^^"炉,…- \J -2 一■
・ А ■ Ж /с з Ж « я |= S= €F I? —-
■ JDU
Все 4Л№еигы ■
А А - Q J2 G g И96СМПНМ* , DcoejHX- Е С;;1у/受呼v№C»BSWp£jw
■皿 Й11 R 歸爪 Н,3 口! ®
■ Заменяем вьгделенный фраг мен】 данным ickciqm ♦、:>
(Персональные компьютеры с каждым
годом все больше н больше входят в нашу жизнь. Более 10 млн капелей Росснн пользуются дома компьютерами. Все это, к испытывают яаленкя зрнп развивается время от време компенсаторных возможно ci зрения.
Невюумтйпъное отношение к зрительные нагрузки ycyi кратковременному кии стойк врачу-спсцнапис гу за гюмшщ легко ли попасть на прнем к под кабинетом» отсутствие с: этого не делаем. И_ тогда во:
Программа «9р6р.取関 персонального компьютера.
«ОгЫк» в переводе
Метод основан на нспалъз
必0『,一g &•
Рис. 6.8. Результат выполнения метода замены выделенного фрагмента текста в документе
3rd го.ормт о том, что узкд口_др竺не/ Нмдии темнпсиний и”т воспр:
али как наибодсратьпшый сттеном- В
亜込熒gsq英 лдыкд дли оавнаненил бнологичестт тонуса. Е&1ражаемог。теммо-скннм цветом есть трулто пере第одимое тняпт "杀叫产(дух, нрад, мармт磔>]
Рис. 6.9* Установка стиля для выделенного фрагмента текста
Шаблон документа
Мы рассмотрели, как выделить нужный фрагмент текста, удалить, скопировать, изменить его или вставить фрагмент текста в документ. Но этого еще недостаточно для того, чтобы сформировать простой документ по шаблону. Конечно, можно последовательно добавлять в документ фрагменты текста, изменять его стили и таким образом привести документ к нужному виду.
Но как быть с документами, у которых определенные записи должны находиться в определенных позициях документа? Очевидным решением этой задачи является создание документа на базе шаблона, где нужный текст будет подставляться вместо некоторых текстовых констант. Наша программа,
создающая такой документ, должна уметь находить эти текстовые константы и подставлять вместо них реальные значения.
Дадим определение. Шаблон документа это документ (файл с расширением DOT, DOC, RTF или др.), который может содержать произвольный текст, таблицы, надписи и другие объекты, а также некоторые определенные текстовые константы, которые будут использованы программой формирования документа для поиска и подстановки на их место реального текста (причем эти определенные текстовые константы могут быть расположены как в тексте документа, так и в его визуальных объектах —— надписях, таблицах, диаграммах).
Поиск текста в документе
Ко всему описанному ранее для создания документа нам не хватает функций поиска н подстановки текста в документ. Хорошо, что объект Selection обладает механизмами поиска текста — ими мы и воспользуемся. Рассмотрим объект Find, принадлежащий объекту Selection. Вот фрагмент исходного текста Delphi.
Поиск текста в документе
procedure TForml.ButtonllClick(Sender: TObject);
var text_:string;
begin
text」=一;
text_: =InputBox ( введите текст дл月 поиска1, text_r text_);
W.Selection.Find.Forward:=true;
W.Selection.Find.Text:^text^;
if W. Selection. Find * Execute then messagebox (handle J Поиск текста 」 завершен успешно!','Внимание!',0);
end;
Запустим программу нажатием кнопки н введем в специальном окне фрагмент текста, который нужно найти в документе (рис. 6.10).
В результате выполнения процедуры искомый фрагмент текста будет выделен (рис. 6.11).
В данном примере мы задали текст в режиме поиска “от начала к концу до- кумента”,в поля объекта Find поместили нужные данные, которые установили необходимый режим, а затем вызвали метод Execute, который и выполнил поиск текста. Этот метод возвращает значение True/False (при успешном/ неуспешном поиске).
79
丿胃.史碗 Qpawe 'fin& BGms中《tiffi匸mw丄何《ы Q“g ?卫I虱不J
[百0昌a> бе 「,♦о育虫u 国団口由,"• j
! 一 ."igay: • "「XX" 耸■ W I三日 В 車二回 А • J 口 ;J •
寸i,:》目:0 0 “睜》^」Гие.лП(^々•^j^^Mb^:伝I・ 用曰 取鼻 fl *| 气 d? 口
заоапеванш! oprmia зреинл
», к пгп1ене зрения, освещения, нерациональные», к пгп1ене зрения, освещения, нерациональныеНевнимательное отноше^ше к зрительные нагрузки ус кратковременному нлн стой врачу*спецналнсту за помои легко лк попасть на прием i под кабинетом» отсутстане этого не дьпаем. И тогд^ вс м$[ла помочу目卩映裡а弊и
», к пгп1ене зрения, освещения, нерациональные
», к пгп1ене зрения, освещения, нерациональные
Программа «Ojitoc» 蜂螂 персонального компьютера.
«Ort)is» в переводе означает
Метод основан на нспож общспрнюпого ннтернацнс стороны кольца расположи создвются условия для опрс изменения рвсстояння. У спи наименьших по диаметру i представляет собой соотнои
Рис. 6.10. При выполнении метода Find вводится фрагмент текста для поиска
'F ФЫл Qp—a gy Вегавч Ww^ С*Г*< [аб^мм fl«M) ?Jttl 用
百,口白9Т X財虚1b…■*&=闻庇口 EW]吟」田"…
1с^»м^ый • Tim*» *“ Roman"А А” Ж Л У № Ж 31 ie三话歩一©A•I "」日注
卜■ С В; 0 9 УЬб0»«Ю«. riw».' Е::而26」也巾麻前SZNm • efe? 4 鼻 外 fl %爆 * заболевании органа зрения.g
к гигиене зрения, освсщен>1я, нерациональныек гигиене зрения, освсщен>1я, нерациональныеНевнимательное отношение к зрительные нагрузки ус кратковременному нлн стой врачу-спецналисту за помои легко ли попасть на прнем I под кабинетом» отсутствие этого не делаем. И【。!~举 р«
к гигиене зрения, освсщен>1я, нерациональные
к гигиене зрения, освсщен>1я, нерациональные
Программа «Орбнр пред персонального компьютера.
«Orbis» в переводе означает
Метод основан на нспош: общепринятого ннтфнашк стороны кольца расположс
наименьших по ЯИ8ВВ представляет собой соотнс
Рис. 6.11. Результат успешного поиска в виде выделенного текста в документе
Очевидно, что набора методов, позволяющих осуществлять поиск и подста» новку текста на место выделенного фрагмента, будет достаточно для создания документов на основании шаблона. В качестве примера рассмотрим следующие процедуры.
j Поиск и замена текста (вариант 1)
procedure TForml.ButtonllClick(Sender: TObject);
var text_:string;
begin
text_:=*;
text_:= Input Box ( введите текст для поиска1, text_, text_);
W.Selection.Find.Forward:=true;
W. Selection * Find. Text: =text__;
if W.Selection.Find.Execute then W.Select ion.Text:='Фрагмент для замены'; end;
;Поиск и замена текста (вариант 2)
procedure TForml*Buttonl2Click(Sender: TCfcject);
const wdReplaceAll=2;
var text_:string;
begin
text_: = , 1;
text_:^InputBox(1Введите текст для поиска1,text_,text_);
W. Selection. Find. Forward: =true;
W. Selection. Find. Text:-text_;
if W.Selection.Find.Execute(Replace:=wdReplaceAll) then
messagebox{handle,pchar《'Поиск и замена текста "1+text_+1" завершена!'),
Почтовый конверт
Возможно, наиболее распространенный и удачный пример использования описанных объектов и методов ——небольшой фрагмент программы для формирования надписей на почтовых конвертах. Работая в среде Delphi с базами данных, вы с легкостью сможете разработать свою программу для их подготовки и получите массу благодарностей от людей, которым приходилось делать это вручную.
Сначала создадим документ (как на рис. 6.12). Сохраним его в формате "Шаблон документа”, чтобы использовать для создания необходимого документа. Текст в этом документе (###обратный индекс& н т. п.) представляет собой текстовые константы, которые будут заменены текстом в процессе формирования документа.
Рис. 6.12. Шаблон надписей для почтового конверта
После создания шаблона скопируем файл с расширением DOT (формат "Шаблон документа") в рабочую папку программы или папку MS Office. После этого можно приступить к формированию надписей на конверте. Рассмотрим следующий фрагмент программы.
:Создание текста на конверте
:с использованием методов поиска и подстановки текста
procedure TFozml.Buttonl3Click(Sender: TObject);
const wdReplaceAll=2;
begin
// Создаем новый документ по шаблону
W. documents. Add (ExtractFi leDir (Application * ExeName) +」
''Шаблон простого конверта.dot1);
// Прямой адрес
W.Selection.Find.Text:-1###индекс&1;
W.Selection.Find<Replacement.Text:=*3500491;
W»Selection. Find.Execute (Replacez^dReplaceAll);
W,Selection.Find. Text:=* # ##адрес&';
w,Selection.Find»Replacement.Text: =1 Рфаснодар, ул* Севастопольская, J д. 3, кв. 1230';
W.Selection.Find»Execute(Replace:=wdReplaceAl1);
W.Selection.Find.Text: = * ###получатель&1;
W.Selection.Find.Replacement•Text:='Иванов Иван Иванович1;
W.Selection.Find.Execute(Replace:=wdReplaceAl1);
// Обратный адрес
W.Selection,Find.Text:=f###обратный индекса';
W.Selection.Find,Replacement,Text :='1980051;
W.Selection. Find.Execute(Replace:^wdReplaceAl1);
W.Selection. Find.Text: = 1 ###обр.атный адреса,;
W.Selection.Find.Replacement.Text: = *Санкт-Петербург, Измайловский пр*, J д. 29, кв. +1112)
W. Selection. Find. Execute (Replace: ^dReplaceAl 1);
W. Selection. Find. Text: =1 ## #отпраЕИтель & 1;
W.Selection.Find.Replacement* Text: = *Петрова Альбина Васильевна';
W.Selection.Find * Execute(Replace:=wdReplaceAl1); end;
После выполнения этой процедуры мы получим результат, как на рис. 6.13. Чтобы использовать этот результат, необходимо сохранить полученный документ и распечатать его. Можно выполнять данную процедуру в цикле, получая исходные данные из базы данных и сохраняя документы под уникальными именами или распечатывая их.
Пожалуй, данный пример ——самый простой случай создания н использования шаблона. Рассмотрим еще один пример, основанный на использовании
шаблона документа. Его отличия заключаются в том, что для размешения текстовых констант используются ячейки таблицы. Этот пример может быть полезен вам в практическом плане, если вы создаете или поддерживаете разработанную в среде Delphi бухгалтерскую программу. Подобным образом, используя таблицы, надписи и текстовые константы для подстановки, можно изготовить шаблон документа практически любой сложности.
Рис. &13. Сформированные программой надписи для почтового конверта
Платежное поручение
Разработаем шаблон платежного поручения. Чтобы облегчить себе задачу, воспользуемся справочно-правовой системой мГарант1' и получим форму платежного поручения — документ в формате DOC. Отредактируем этот документ и приведем его к нужному виду (рис. 6.14). Далее сохраним его в формате DOT для последующего использования в процедуре формирования выходной формы документа *'платежное поручение1*.
Как видно из рис. 6.14, преобразование документа в шаблон заключается в том, что в некоторые ячейки внесен текст типа "###Сумма прописью&*\
Эти фрагменты текста и представляют собой текстовые константы, которые будут использованы для подстановки информации из программы.
,口 ’史*Ап 口吨 Цмвм Вет дам 中оизж £врв1£ Хйбпщл-旦皿,,口 ’史*Ап 口吨 Цмвм Вет дам 中оизж £врв1£ Хйбпщл-旦皿,11 и • П ' ■ и • * 35 ■ 1 к11 и • П ' ■ и • * 35 ■ 1 к“ MKinioll Waicl ■ Дпичмем? •“ MKinioll Waicl ■ Дпичмем? •• ю " - ■ «『;.摩■注■• ю " - ■ «『;.摩■注■I 040田国]I 040田国]EI3EI3Я^м^у|.уа& : I IЯ^м^у|.уа& : I I杆VC пл4твльщика&杆VC пл4твльщика&練梅МК rm*TtJihUJ|№a& 篇附С пдвт«лыци1а»&練梅МК rm*TtJihUJ|№a& 篇附С пдвт«лыци1а»&fflWBUK получатжллА棚附0 получптелн&fflWBUK получатжллА棚附0 получптелн&福*VC получ1Т*ля&福*VC получ1Т*ля&1Й#Назнамечи» платеж.й&1Й#Назнамечи» платеж.й&ПЛАТЕЖНОЕ ПОРУЧЕНИЕ № Ш^а П П &ПЛАТЕЖНОЕ ПОРУЧЕНИЕ № Ш^а П П &瞰映&瞰映&Срок плат.脚ИСП&Срок плат.脚ИСП&Оч»р плат W#O.H & Рм пол* «*«Р П1Оч»р плат W#O.H & Рм пол* «*«Р П1
,口 ’史*Ап 口吨 Цмвм Вет дам 中оизж £врв1£ Хйбпщл-旦皿,
,口 ’史*Ап 口吨 Цмвм Вет дам 中оизж £врв1£ Хйбпщл-旦皿,
11 и • П ' ■ и • * 35 ■ 1 к
11 и • П ' ■ и • * 35 ■ 1 к
“ MKinioll Waicl ■ Дпичмем? •
“ MKinioll Waicl ■ Дпичмем? •
• ю " - ■ «『;.摩■注■
• ю " - ■ «『;.摩■注■
I 040田国]
I 040田国]
EI3
EI3
Я^м^у|.уа& : I I
Я^м^у|.уа& : I I
杆VC пл4твльщика&
杆VC пл4твльщика&
練梅МК rm*TtJihUJ|№a& 篇附С пдвт«лыци1а»&
練梅МК rm*TtJihUJ|№a& 篇附С пдвт«лыци1а»&
fflWBUK получатжллА
棚附0 получптелн&
fflWBUK получатжллА
棚附0 получптелн&
福*VC получ1Т*ля&
福*VC получ1Т*ля&
1Й#Назнамечи» платеж.й&
1Й#Назнамечи» платеж.й&
ПЛАТЕЖНОЕ ПОРУЧЕНИЕ № Ш^а П П &
ПЛАТЕЖНОЕ ПОРУЧЕНИЕ № Ш^а П П &
瞰映&
瞰映&
Срок плат.脚ИСП&
Срок плат.脚ИСП&
Оч»р плат W#O.H & Рм пол* «*«Р П1
Оч»р плат W#O.H & Рм пол* «*«Р П1
Рис. 6.14. Вид шаблона документа "Платежное поручение^
Используем этот шаблбн для создания документа. Следующий фрагмент исходного текста демонстрирует, как это сделать.
^^^ry•^•y^^^^^rrn^м•^^^тм^^ft^^t^г••rrrrrr^••y^r^••Y•^•r^^^^vt'ti,*^^,■'■1T,^■*,V,,^'''',y''^''''vт,>^ir^Уitf/^v^tfYtY't*,■,,fnVVV.^,,,,',^',','^^^','''V'^'''',''^^^^^r^t''^,■t1^'ili■'''''',,,',''^r''''^'^,**',£,tt''^,'' Формирование платежного поручения
// Данная функция позволяет находить строку FindText
// и подставлять на ее место строку ReplacementText, //
Function FindAndlnsert(FindText#ReplacementText:string):boolean; const wdReplaceAll=2;
begin
W.Selection,Find.Text:=FindText;
W.Selection.Find.Replacement.Text:=RepiacementText;
FindAndlnsert:^W,Selection.Find-Execute(Replace:=wdReplaceAll); end;
// Данная процедура заполняет шаблон документа. //
Pocedure TForrnl • Buttonl4Click (Sender: TObject}; begin
// Создаем новый документ по шаблону
W. documents. Add (ExtractFileDir (Application.ExeNarne) +• \Шаблон 」 платежного' + * поручения,dot,);
// Подставляем тектс
FindAndlnsert(»###№ П.П.&'J I');
FindAndlnsert('###Дата&*,datetostr{date));
FindAndlnsert(|###Вид платежа&1,1почтой1);
FindAndlnsert (1 ###Сумма прописьюь', ' Двести пятьдесят рублей сорок копеек1);
FindAndlnsert(1###Сумма&', *250, 401);
FindAndlnsert(1###ИНН плательвдка&1,*0000000000 4 ;
FindAndlnsert (1 ###КПП плательжкай 1, ^ОООООООООН1);
FindAndlnseгt(1###Плательщик&1f * ЗАО Селенаг};
FindAndlnsert(1###Р/С плательшикай 1, ^ООООООООООООООООООО*);
FindAndlnsert(*###БЖ плательщика&г,10 000001);
FindAndlnsert(* ###К/С плательщика& * г * 000000000000000000001);
FindAndlnsert(1###ИНН получателя^',111111111111);
FindAndlnsert(1###КПП получателя&',* 111111111100');
FindAndlnsert Г ###БИК получателям ‘3111111 *);
FindAndlnsert(1###К/С получателя&1,1111111111111111111111);
FindAndlnsert(* ###Р/С получателял1,111111111111111111111•);
FindAndlnsert(* # # #Палучатель &1,'ЗАО Комета');
FindAndlnsert(Т###В.О.&1, 1г);
FindAndlnsert(1###Н.П.&I ;
FindAndlnsert(1###Код&1, т');
FindAndlnsert{丨###С・П.&\ ' *);
FindAndlnsert (* ###ОЕ. &*「');
FindAndlnsert(1###Р.П* &',‘‘);
FindAndlnsert《,#Н1&'J;
FindAndlnsert (1 #Н2& 1, 1 1);
FindAndlnsert('#НЗ &',—);
FindAndlnsert (1 #Н4& 1, 1 1);
FindAndlnsert (1 #Н5&
FindAndlnsert (' #Н6& I '');
FindAndlnsert「#Н7&1f * *);
FindAndlnsert(*###Назначение платежа& ','Оплата за поставку товара1);
end;
Результат выполнения данной процедуры отображен на рис. 6.15.
Рис. 6.15. Сформированный документ "Платежное поручение"
Далее можно переходить к печати документа.
Автоматизацию печати рассмотрим в следующей главе.
ГЛАВА 7
Создание таблиц и работа с ними
В этой главе рассмотрены следующие темы:
口 создание, выделение и удаление таблиц в документе;
口 форматы таблиц;
口 изменение положения таблицы и ее строк;
口 границы и заливка ячеек таблиц;
口 добавление и удаление строк и столбцов таблицы;
口 текст в ячейках таблицы;
口 задание шрифта текста в документе и в табл pi це;
□ направление текста;
О пример разработки табличного документа — бланка счета-фактуры.
Создание, выделение и удаление таблиц в документе
Документ Word может содержать таблицы, которые как объекты объединены в коллекцию Tables. Как вытекает из вышесказанного, обычно эта коллекция принадлежит объекту "документ". Рассмотрим ее основные свойства м методы.
Свойство Countinteger содержит информацию о количестве таблиц в коллекции. Если в документе нет ни одной таблицы, то Count содержит ноль.
Метод Add добавляет новую таблицу в коллекцию. При создании таблицы определяются область, где будет создана таблица, и ее основные параметры ——количество столбцов и строк. Хотя коллекция таблиц и принадлежит документу, тем не менее сама таблица может быть создана на любом объекте или месте документа, на котором это возможно. Объект Item(tab) — эле-
мент коллекции и представляет собой таблицу с порядковым номером tab данной коллекции.
Для демонстрации свойств и методов коллекции Tables создадим новый документ и в нем создадим таблицу. ИсполЕ>зуем метод Add. Его спецификация в VB имеет следующий вид: expression.Add( Range, Num Rows, NumColumns), где Range — область, на которой создается таблица, NumRows и NumColumns ——количество строк и столбцов создаваемой таблицы.
Рассмотрим использование метода Add в среде Delphi на примере приведенного ниже фрагмента программного текста.
I Создание таблицы
procedure TFoml*Button2Click(Sender: TObject);
begin
W. ActiveDocument. Tables. Add (Range: =W. ActiveDocument. Range, NumRows: =2,
NumColumns:=3)『
end;
Данная процедура создаст таблицу непосредственно в документе. Первый аргумент метода определяет область, где будет создана таблица, — весь документ. Следующие аргументы определяют количество строк и столбцов. Если попробовать вторично выполнить эту процедуру, то будет сгенерирована ошибка (рис. 7.1).
Рис. 7.1. Ошибка при попытке создать таблицу в той области документа, где она уже есть
Для корректного создания следующей таблицы необходимо в качестве первого аргумента метода Add указать область, которая свободна и не содержит таблицу. Для задания этой области можно использовать метод Range, который рассматривался ранее, или, например, свойство End объекта Range.
Рассмотрим следующую процедуру, которая создает новую таблицу в документе. В отличие от предыдущей, для создания новой таблицы она использует область в конце документа.
Создание таблицы в конце документа
procedure TForml.Button3Click(Sender: TObject); var MyRange:variant;
begin
MyRangE: =W * Act ive Document. Range (W. Active Document. Range. End-1,
W. ActiveDocument. Range, End-1);
W.ActiveDocument.Tables.Add(Range:=MyRange# NumRows:=2, NumColumns:=3);
W ・ ActiveDocument. Range. InsertAfter (1 1); end;
Данная процедура использует область в конце документа, в которой и создается новая таблица. За вновь созданной таблицей вставляется пробел, который разделяет таблицы между собой. Если разделения нет, то вновь создаваемые таблицы будут добавляться как строки к существующим таблицам.
Когда создано несколько таблиц, мы можем определить их количество. Это значение содержится в свойстве Count коллекции Tables. Приведенная ниже процедура выводит список таблиц в компонент ListBox.
;Получение списка таблиц в документе
procedure TOKBottomDlg ・ FormShow (Sender: TObj ect);
var a_:integer;
begin
ListBoxl.Items.Clear;
for a_:=l to Forml«W,ActiveDocument * Tables * Count do begin
ListBoxl.Iterns.Add(1Таблица - 1+inttostr(aj)); end;
end;
В результате выполнения этой процедуры компонент ListBoxl будет содержать список таблиц (рис. 7.2).
Используя объект Item коллекции Tables н порядковый номер таблицы, можно выделить любую таблицу из всего списка таблиц документа для дальнейших манипуляций. Для выделения таблицы, которая содержится в коллекции, используется метод Select объекта Item. Этот объект содержит все методы, коллекции и объекты, присущие таблице как объекту.
Следующий фрагмент программы демонстрирует использование метода Select м метода Delete, удаляющего выбранную таблицу.
j Выделение и удаление таблицы коллекции Tables
procedure TOKBottomDlg.ButtonlClick(Sender: TObject);
begin%
Forml. W. ActiveDocument. Tables. Item (ListBoxl * itemindex+1 )」Select; end;
procedure TOKBottomDlg*Button2Click(Sender: TObject); begin.
Fonnl. W. ActiveDocument. Tables. Item (ListBoxl, itemindex+1) . Delete; end;
Для демонсграции этих методов предназначено текстовое приложение, представленное на сопроводительном диске книги. Процесс выполнения данных процедур может выглядеть примерно так, как показано на рис. 7.2.
Рис. 7.2. Работа со списком таблиц в документе, выделение и удаление
Форматы таблиц
В результате использования метода Add мы создали простую таблицу, основными параметрами которой являются ее местонахождение, а также количество столбцов и строк. Но в документах таблицы могут иметь вид, далеко отличающийся от того, что мы полнили. Чтобы изменить вид таблицы, достаточно изменить толщину, стиль и цвет линий, рисунок и цвет заливки ячейки, цвет ячейки, расположить текст определенным образом. Тогда мы можем получить таблицу, удовлетворяющую определенным требованиям отображения содержащейся в ней информации.
Есть методы, позволяющие настроить индивидуально каждую строку, стон-
бец или ячейку. Их мы рассмотрим позже. В Word есть несколько заданных форматов таблиц, использование которых приведет к определенному виду все ячейки таблицы.
Формат таблицы задается с помощью метода AutoFormat объекта “таблица”. Вот его спецификация в VB:
Метод AutoFormat
AutoFonnat(Format, ApplyBordersr ApplyShading, ApplyFont, ApplyColor, ApplyHeadingRows, ApplyLastRow, ApplyFirstColumn, ApplyLastColumn, AutoFit)
Аргументы метода и их назначение перечислены в табл. 7.L
Таблица 7J. Аргументы метода AutoFormat
Аргумент
Тип
Назначение
Format
Число
Формат таблицы
ApplyBorders
Логический
True — задать границы согласно спецификации формата
ApplyShading
Логический
True — применить текстуру согласно спецификации формата
ApplyFont
Логический
True — применить заданный форматом шрифт
ApplyColor
Логический
True — применить заданный форматом цвет
ApplyHeadingRows
Логический
True — использовать свойства для верхней строки согласно спецификации формата
ApplyLastRow
Логический
True — использовать свойства для последней строки согласно спецификации формата
ApplyFirstColumn
Логический
True — использовать свойства для первого столбца согласно спецификации формата
ApplyLastColumn
Логический
True — использовать свойства для последнего столбца согласно спецификации формата
AutoFit
Логический
True — изменять ширину ячейки согласно ширине введенного текста
Первый аргумент метода Format:integer определяет формат, который нужно задать таблице. Он может принимать значения от 0 до 39 (в Office 97), соответствующие различным предопределенным форматам таблицы. Остальные
92 4астъ 〃. Разработка 1gокументон w прнломени货 MS Word spelphi аргументы определяют применение или отказ от применения некоторых опций этого метода.
Используем метод Auto Format для изменения внешнего вида созданных таблиц. Для этого создадим форму, расположим в ней элементы управления и следующий программный текст, который добавим в процедуру отклика на выбор в списке компонента List Box 1 и в процедуру отклика на нажатие кнопки Button 1.
Задание формата таблицы
var table:variant;
procedure TOKBottomDlg3.ListBoxlClick(Sender: TObject); begin
table : =Fcml. W. ActiveDocument. Tables • item (ListBoxl. itemindex^l);
NumRows.Value:=table.Rows.Count;
NumCo 1 Lunns. Value: stable. Colinnns. Count; end;
procedure TOKBottomDlg3.ButtonlClick(Sender: TObject); begin
table. AutoFomat (Format: =fonnat * value,
ApplyBorders: =Appl yBo rders. Checked, ApplyShading:^ApplyShading.Checked, ApplyFont:=ApplyFont.Checked, ApplyColor:=ApplyColor・ Checked, ApplуHeadingRows: = ApplyHeadingRows * Checked, Apply Las tRow: =Appl у Last Row • Checked, ApplyFirs t Column: = ^plyFirstColumn, Checked, ApplyLastColuinn: =Appl у Las tCo 1 шш. Checked, AutoFit:sAutoFit.Checked);
end;
Первая процедура выбирает таблицу, используя индекс компонента ListBoxl, и записывает в переменную table:variant ссылку на эту таблицу. Вторая процедура работает с table как с объектом "таблнца”, изменяя ее формат согласно состоянию элементов управления (рис. 7.3). Заполним элементы формы, значения которых используем в качестве аргументов метода AutoFormat, и выполним этот метод, предварительно выбрав одну из таблиц документа. В итоге получим результат, показанный на рнс. 7.3. Выбранный в данном примере формат соответствует значению аргумента Format=wdTableFormatColumns4 (wdTableFormatColumns4= 13).
Рис. 7.3. Задание формата таблицы
Изменение положения таблицы
и ее строк
Как ранее было сказано, таблица создается в определенной области, которая определяется как аргумент метода Add. Таблица вставляется в промежуток между символами текста или накладывается на область текста. Когда таблица создана, мы можем изменить ее положение относительно левой границы документа или по вертикальному направлению в документе. Положение таблицы по вертикали определяется текстом, расположенным в документе до таблицы. Положение таблицы относительно левой границы страницы документа определяется свойствами самой таблицы. Рассмотрим эти свойства подробней.
Таблица включает в себя коллекции, объекты и другие свойства. Коллекция Rows объекта ''таблица1' определяет набор ее строк и общие свойства, присущие им. Свойство Left Indent этой коллекции определяет положение таблицы относительно левой границы листа. Это свойство имеет числовой тип и может принимать как положительные, так и отрицательные значения.
Используя значение Leftindent, можно не только задать, но и изменить горизонтальное положение таблицы Как и сама коллекция Rows, элемент этой коллекции, представляющий собой одну указанную строку, также имеет свойство Left Indent. В данном случае оно определяет положение строки относительно левой границы документа. Остается добавить, что доступ к элементу коллекции Rows осуществляется через объект Item(i), где i — номер строки. Попробуем изменить горизонтальное положение таблицы и выбранной строки, для этого используем следующий программный текст:
? Изменение горизонтального положения таблицы
procedure TOKBottomDlg4 * ListBoxlClick(Sender: TObject); begin
table: =Forml. W. ActiveDocument. Tables. item (ListBoxl • itemindex+1); end;
procedure TOKBottomDlg4.LeftPosChange(Sender: TObject); begin
table * Rows • Left Indent : =LeftPos * value; end;
procedure TOKBottomDlg4 . LeftPosRowlChange (Sender: TObject); begin
table. Rows * Item (1) . Left Indent: =LeftPosRowl. value; end;
Результат выполнения программы представлен на рис. 7.4.
На рис. 7.4 также представлена форма, в которой задаются эти изменения. Компонент ListBoxl выбирает таблицу из списка и помещает ссылку на таблицу в переменную table типа variant. Компоненты LeftPos и LeftPosRow! задают положение всей таблицы и первой строки соответственно.
Рассмотрим еще некоторые свойства коллекций и элементов коллекций строк н столбцов, которые в большинстве своем аналогичны. Есть только различия, определяемые расположением этих элементов таблицы —— если строки имеют параметр "высота0, то столбцы имеют параметр кширина,г.
В состав коллекций Rows н Columns входит свойство, содержащее количество строк и столбцов таблицы Count.
Доступ к отдельным строкам и столбцам осуществляется посредством объекта Item(). Чтобы задать высоту строки, используем свойство Height элемента коллекции Rows.Item(). Например: table.RowsJtem(l)*Height:=21;. Для задания высоты одновременно всех строк таблицы используйте оператор table.Rows.Height:=21;. Если попытаться задать слишком маленькую высоту
строки, получим ошибку выполнения. Для задания ширины столбца используется свойство Width элемента коллекции Columns Л tem(). Например, для задания ширины первого столбца используем следующий оператор Delphi: table.Columns-Item( 1).Width:=43;. Для задания одинаковой ширины всех столбцов используйте оператор table.Columns.Width:=43;.
Рис* 7.4. Задание положения таблицы относительно левой границы документа
Границы и заливка ячеек таблиц
Таблица состоит из ячеек, которые объединены в строки и столбцы. Поэтому, как у строк и столбцов, так и у отдельных ячеек есть аналогичные между собой свойства, отличающиеся только областью применения этих свойств. Если мы, например, изменяем толщину границ для ячейки, то это изменение приведет к изменению отображения данной ячейки. Если изменить параметры строки (столбца), то это может привести к изменению всех границ всех ячеек строки (столбца) или только границы строки (столбца). Заливка определяется для всех ячеек выбранной строки (столбца). Рассмотрим это на следующем примере, в котором будем изменять толщину линий столбца, их цвет и заливку.
广"…Г— 中."”::::1—T宝中L不.部穴悶: W炉;.."“::穿関響不”;叫厂♦*「":"["才叱:":":"""":•戶-”“h‘…"3.“":二?一丁丁-:胃
Изменение некоторых визуальных свойств столбца таблицы
var table:variant;
// Выбираем таблицу, для столбцов которой будем проводить изменения.
// В свойства компонента Columnld записываем количество столбцов // выбранной нами таблицы.
procedure TOKBottomDlg5<ListBoxJClick(Sender: TObject);
begin
table: =Forml ・ W. ActiveDocument * Tables. item(ListBoxl. itemindex+1);
NumColumns ・ Value: =table * Columns. Count;
Columnld. MaxVa lue: =table. Columns. Count; end;
// Толщина линий границ ячеек может принимать значения из набора // определенных констант.
procedure TOKBottomDlgb. OutsIdeLineWidthChange (Sender: TObj ect); const
wdLineWidthO25pt=2;
wdLineWidth4 50pt=3 6;
begin
case OutsideLineWidth.Itemindex of
0: table.Columns, Item (Columnld. value) .Borders・ OutsideLineWidth:= wdLineWidthO25pt;
1:table.Columns.Item(Columnld.value).Borders.Outs ideLineWidth:= wdLineWidth450pt;
end; end;
// Цвет линий, рисунка текстуры и заливки определяется посредством // цветового индекса.
procedure TOKBottomDlg5.OutsideColorIndexChange(Sender: TObject); begin table.Columns * Item (Columnld.value).Borders.OutsideColorIndex:=
OutsideColorIndex.Itemindex; end;
procedure TOKBo11omDlg5.BackgroundPatternColorlndexChange(Sender:
T8ject); begin
table.Columns. Item (Columnld. value) . Shading.BackgroundPatternColorlndex:= Вас kg roundPa11 e rnCo1orIndex.Itemlndex;
end;
procedure TOKBottomDlg5.ForegroimdPatternColorlndexChange(Sender: TObject); begin
table. Columns. Item (Columnld. value) • Shading. ForegroundPa11ernColorIndex:=
ForegroundPatternColorlndex* Itemindex; end;
// Текстура представляет собой определенный узор, заполняющий // ячейки столбца. Его выбор определяется значением из набора // определенных констант.
procedure TOKBottomDlg5.TextureChange(Sender: TObject);
const
wdTextureNone=0;
wdTextureSolid=1000;
wdTexture30Percent=300;
begin
case Texture-Itemindex of
0: table * CoIujutls * Item (Columnld. va lue) . Shading. Texture: =wdTextureNone;
1:table * Columns.Item(Columnld.value)•Shading.Texture:»wdTextureSolid;
2: table ・ Columns. Item (Colunmld. value) . Shading. Texture: ^dTextureSOPercent; end;
end;
Результаты применения описанных процедур к выбранной таблице и внешний вид формы представлены на рис. 7.5.
Рассмотрим еще одно важное свойство, применяемое как к отдельным ячейкам, так и ко всем ячейкам строки, столбца или таблицы. Это стиль линии границы. Особенностью его является то, что стиль линии задается не для всех линий границы ячейки, а индивидуально для каждой. Выбор определенной линии границы осуществляется выбором элемента коллекции Borders. Количество элементов коллекции определяется теслом линий, ограничивающих ячейки или пересекающих ячейки или группу выделенных ячеек. Для простоты рассмотрим фрагмент программы, изменяющий стиль одной выбранной линии границы ячейки.
Задание стиля линии границы ячейки
procedure TOKBottomDlg8.Linestу1eChange(Sender: TObject}; const
wdBorderTop=-l;
wdBorderLeft=-2;
wdBorderBottoni=-3;
wdBorderRlght^-4;
var Border:variant;
4 Зак 723
begin
case Borderld.itemindex of
0:Border:М:аЬ1е.Cell(2,1) ,Borders»Item(wdBorderTop);
Border: =tabl2. Cell (2,1). Borders. Item (wdBorderLeft);
Border i =table. Cel 1(2,1). Borders. Item (wdBorderBottom);
3:Border: =table. Cell (2,1).Borders. Item(wdBorcierRight);
end;
Border.LineStyle:=LineStyle•itemindex;
end;
Рис. 7*5. Изменение формата столбца таблицы
С помощью этой процедуры мы можем изменить стиль разных линий границы и получить результат, представленный на рис. 7.6.
Добавление и удаление строк и столбцов таблицы
Рассмотрев общие свойства столбцов, строк и ячеек, перейдем к некоторым методам коллекций Rows и Columns.
Pdfinra с нчейяами та6,шцн
Таблице -4 Таб1rxца・ 5 Габеща-б Тайлни'?Таблице -4 Таб1rxца・ 5 Габеща-б Тайлни'?ТвбпиЦв-1Тайг|нца* 2ТвбпиЦв-1Тайг|нца* 2бшбмть столбец n6ь&<пъстр 嚟 у Р~ибшбмть столбец n6ь&<пъстр 嚟 у Р~иВыйОР границыВыйОР границыРма 削*тwdBorderTopРма 削*тwdBorderTopТолщиш рямссТолщиш рямссwdLtwWidh450pt▼wdLtwWidh450pt▼Uwr p»w CrwtopaMO*,Uwr p»w CrwtopaMO*,wWgwWgwdUneStyteOotwdUneStyteOotТекстуреТекстуре■err фон*■err фон*Ивет рис胆квИвет рис胆квwdLineS 收口 adiS maUGac""' wdLmeS MeDathLargeG 狙「 MdUneSi^eDathDoi — wdJrwSlyleDathOaiDol YMjlineStyleOoMbie wdJneS^teT riple 」 也,口」m紹:1m+; NriTiuc$5 m<71wdLineS 收口 adiS maUGac""' wdLmeS MeDathLargeG 狙「 MdUneSi^eDathDoi — wdJrwSlyleDathOaiDol YMjlineStyleOoMbie wdJneS^teT riple 」 也,口」m紹:1m+; NriTiuc$5 m<71
Таблице -4 Таб1rxца・ 5 Габеща-б Тайлни'?
Таблице -4 Таб1rxца・ 5 Габеща-б Тайлни'?
ТвбпиЦв-1
Тайг|нца* 2
ТвбпиЦв-1
Тайг|нца* 2
бшбмть столбец n
6ь&<пъстр 嚟 у Р~и
бшбмть столбец n
6ь&<пъстр 嚟 у Р~и
ВыйОР границы
ВыйОР границы
Рма 削*тwdBorderTop
Рма 削*тwdBorderTop
Толщиш рямсс
Толщиш рямсс
wdLtwWidh450pt▼
wdLtwWidh450pt▼
Uwr p»w CrwtopaMO*,
Uwr p»w CrwtopaMO*,
wWg
wWg
wdUneStyteOot
wdUneStyteOot
Текстуре
Текстуре
■err фон*
■err фон*
Ивет рис胆кв
Ивет рис胆кв
wdLineS 收口 adiS maUGac""' wdLmeS MeDathLargeG 狙「 MdUneSi^eDathDoi — wdJrwSlyleDathOaiDol YMjlineStyleOoMbie wdJneS^teT riple 」 也,口」m紹:1m+; NriTiuc$5 m<71
wdLineS 收口 adiS maUGac""' wdLmeS MeDathLargeG 狙「 MdUneSi^eDathDoi — wdJrwSlyleDathOaiDol YMjlineStyleOoMbie wdJneS^teT riple 」 也,口」m紹:1m+; NriTiuc$5 m<71
Рис. 7.6. Изменение стилей линий границ ячейки
Создавая таблицу, мы не можем быть уверенными в том, что нас устроит количество строк и столбцов, определенное при ее создании. Для увеличе* ния таблицы предназначен метод Add коллекции Rows и Columns, а для удаления элементов этих коллекций — метод Delete. Первый метод добавляет строку или столбец в конец таблицы, а второй удаляет строку или столбец с указанным индексом.
Создадим новую форму и расположим в ней элементы управления. В процедуру нажатия кнопки Button 1 добавим следующий программный текст.
:Изменение количества строк и столбцов таблицы
var table:variant;
procedure TOKBottomDlg6.ListBoxlClick(Sender: TObject);
begin
table: =Forml, W .ActiveDocument • Tables < item (ListBoxl. itemindex+1); end;
procedure T0KBottomDlg6. ButtonlClick (Sender: TObject);
begin
table. Columns. Add;
end;
procedure TOKBottomDlg6.Button2Click(Sender: TObject);
begin
table .Rows. Add;
end;
procedure TOKBottomDlg6 .Button3Click (Sender: TObject);
begin
table.Columns.Item(1).Delete;
end;
procedure TOKBottomDlg6.Button4Click(Sender: TObject);
begin
table. Rows * Item (1) . Delete;
end;
На рис. 7.7 представлена таблица до внесения изменений.
Рис. 7.7. Таблица до изменения количества строк и столбцов
На рис. 7.8 представлена таблица, в которую добавлено несколько столбцов и строк. Поскольку строки и столбцы добавляются в конец таблицы, они имеют такой же стиль, как и те, к которым они добавлены.
Для того чтобы добавить строку или столбец в произвольное место таблицы, нужно вызывать метод Add с аргументом, которым является ссылка на строку (столбец), перед которой требуется вставить новую строку (столбец). Процедура, вставляющая новую строку между первой и второй строкой с помощью метода Add, выглядит так:
;Вставка новой строки между первой и второй строками таблицы
procedure TOKBottomDlg6*Button2Click(Sender: TObject); var row:variant;
begin
row: =table. Rows * Item ⑵;
table * Rows. Add (row};
end;
Можно переработать эту процедуру для вставкн столбца в заданное место таблицы.
Работа со списком таблиц (добаоить/уда!'
Т абтца • 1 Т &6/ш& - 2
Габлица - 4
Габлица • 5
Т аб/ша • 6
Рис. 7.8. Таблица после добавления строк и столбцов
Текст в ячейках таблицы
Когда таблица создана, можно заполнять ее текстом. Записывать информацию непосредственно в ячейку таблицы позволяет объект Cell, который и представляет собой ячейку. Ссылку на конкретную ячейку получают, обращаясь к объекту Cell с параметрами (номер строки и столбца). Например, если выполнить оператор mycell:=table.Cell(l, 2);, то переменная mycelkvariant будет содержать ссылку на ячейку в первой строке и во втором столбце таблицы. В состав объекта "ячейка" входит объект Range. Нам известно, что Range может содержать текст. Используя свойства ячейки и объекта Range, запишем текст в конкретную ячейку и зададим для него шрифт и расположение.
1
-«7у,г:'м^Г?"рг',""*"7''Г*хУ*'77'''',л*'>",^"'У''*'г^''\'''1"''Г-^Г7'7,7,-'^Т',,'"-'Г^^и^
Запись текста в ячейку таблицы
// Компоненты Rowld и Column工d позволяют пользователю выбрать ячейку, // a RangeText - ввести в нее текст.
//
procedure TOKBottomDlg7.Range_TextChange(Sender: TObject);
begin
table.Cell(Rowld.value, Columnld.value) .Range.Text: =Range_JText.text; end;
// Выравниваем текст в ячейке по вертикали, используя свойство
// VerticalAlignment, которое может принимать значения — 0, 1, 2. procedure TOKBottomDlg7.VerticalAlignmentChange(Sender: TObject); begin
table. Cell (Rowld. value# Columnld. value) . VerticalAlignment:= VerticalAlignment • itemindex;
end;
// Горизонталь ное выравнивание осуществляется с помощью
// свойства Alignment объекта ParagraphFormat, принадлежащего
// объекту Range.
procedure TOKBottomDlg7.AlignmentChange(Sender: TObject); begin
table. Cell (Rowld, value, Columnld. value) . Range. Paragraph Format. Alignment:= Alignment • itemindex;
end;
Задание шрифта текста в документе и в таблице
Шрифт в Word представляет собой объект, имеющий свойства и методы, часть которых аналогична свойствам и методам объекта Tfbnt в Delphi. Отличия заключаются в следующем: в Delphi можно задать цвет шрифта как сочетание красного, зеленого и синего, а в Word цвет выбирается из палитры возможных значений. В Word шрифт имеет больше дополнительных визуальных параметров, чем шрифт в Delphi. Сравним диалоги выбора и настройки шрифта в Word (рис. 7.9) и Delphi (рис. 7.10).
Мы будем задавать шрифт из программ, разработанных в Delphi, поэтому нам нужно будет преобразовать параметры объекта Tfbnt Delphi в параметры объекта Font Word. Поскольку аналогичные по назначению свойства этих двух объектов имеют разные типы, нам придется использовать следующую специальную процедуру.
Преобразование параметров объекта Tfont (Delphi) в параметры объекта Font (Word)
Function FontToWFont(font:Tfont;WFont:variant):boolean; begin FontToWFont: =t rue;
try
WFont * Name: =font. Name;
if fsBold in font.Style then WFont.Bold: =True else WFont.Bold:=False;
if fsltalic in font.Style then WFont.Italic:=True else WFont.Italic:=False;
WFont. Size: =f ont. Size;
if fsStrikeOut in font * Style
then WFont.StrikeThrough:=True
else WFont»StrikeThrough:=False;
if fsUnderLina in font.Style
then WFont.Underline:wdUnderlineSingle
else WFont.Underline:=wdUnder1ineNone;
〃 // // // //
//
//
// 〃
except
FontToWFont:-false;
end;
end;
Полужирный Светлый Курсив Прямой Размер
Зачеркнутый
Не зачеркнутый
Подчеркивание
Нет подчеркивания
Далее используем эту процедуру для преобразования шрифта и рассмотрим фрагмент демонстрационной программы.
Рис. 7.9. Диалог выбора шрифта е Word
Рис. 7,10. Диалог выбора шрифта в Delphi
Выбор шрифта для текста ячейки
procedure TOKBottomDlg7.ButtonlClick(Sender: TObject); begin if not FontDialogl.Execute then exit; FontToWFont(FontDialogl.font,table.Cell(Rowld.value,
Columnld * value) * Range. font); end;
Данная процедура, используя возвращаемый диалогом FontDialogl шрифт, изменяет шрифт ячейки Cell(RowId.value, Columnld.value).
Результат выполнения данной процедуры представлен на рис. 7.11.
Зададим цвет шрифта для текста ячейки
:Выбор цвета шрифта для текста ячейки
const
wdAuto
=0;
wdBlack
=1;
wdBlue
=2;
wdTurquoise
=3;
wdBrightGreen
=4;
wdGray50
=14;
wdGray25
=15;
105
л^ст»и»・ 0 G АЛЕФЧЛ**。\ Ч □ О Щ 4 夕•/•厶•■导••■
^СТ^^^П/^; 4И
Рис. 7.11. Устанавливаем шрифт для текста ячейки таблицы
宣
』l16ngl20IJ2Ml26l28
Рис. 7.12. Устанавливаем цвет шрифта для текста ячейки
procedure TOKBottomDlg7.TextColоrlndexChange(Sender: TObject); begin table.Cell(Rowld.value, Columnld.value).Range.font.ColorIndex:= TextColorlndex.itemindex;
end;
Результат выполнения процедуры представлен на рис. 7.12.
Направление текста
Еще одно свойство текста в Word — направление. Направление текста задается установкой свойства Orientation объекта Range в значение одной из трех возможных констант.
.Задание направления текста
const
wdTextOrientationUpward=2;
wdTextOrientat ionHori zont al=0;
wdTextOrientationDownward=3;
procedure TOKBottomDlg7.Orientationchange(Sender: TObject); begin case Orientation.itemindex of
0:table.Cell(Row工d.value,Coluninld.value).Range.Orientation:= wdTextOrientationUpward;
1:table * Cell(Rowld * value,Columnld.value),Range.Orientation:= wdTextOrientationHorizontal;
2:table.Cel1(Rowld.value, Columnld.value}.Range.Orientation:- wdTextOr ientat ionDownward; end;
end;
Используем данную процедуру и установим направление текста в ячейке. Результат выполнения данной процедуры представлен на рис. 7.13.
Разработка табличного документа — бланк счета-фактуры
Печатная форма счета-фактуры состоит из трех частей. Первая часть представляет собой заголовок формы, количество записей н размеры которой постоянны. Вторая часть представляет собой таблицу, состоящую из заго-
33Ck"M— R,“wwCk"M— R,“ww" P 史 ал 口p**.動 Ml Ugjb" 中/Йa,к*< 丄е5ёз VM«j ?_'.. ,:.,;一 一则国]口口口音0" 醛<r』■,篇若①尧處0 “胴/ ^5; ® ,-•:」:■当"統7坪7『 .河-幫" !T腼;■僦囲U !!!疆岳’:□可爾-厶" m曰!就■м н =0и事‘三三二二「/.上也."® е'пза зffl ^^ ini f 函'」¥i4a.e0 色 Мзбии». Г1вр«йаи- JTf (.^гчангГ. 寧Всея пименты •" P 史 ал 口p**.動 Ml Ugjb" 中/Йa,к*< 丄е5ёз VM«j ?_'.. ,:.,;一 一则国]口口口音0" 醛<r』■,篇若①尧處0 “胴/ ^5; ® ,-•:」:■当"統7坪7『 .河-幫" !T腼;■僦囲U !!!疆岳’:□可爾-厶" m曰!就■м н =0и事‘三三二二「/.上也."® е'пза зffl ^^ ini f 函'」¥i4a.e0 色 Мзбии». Г1вр«йаи- JTf (.^гчангГ. 寧Всея пименты •«ЙВЯМЮ ,«ЙВЯМЮ ,'4 ■,〜d+ III'4 ■,〜d+ III
3
3
Ck"M— R,“ww
Ck"M— R,“ww
" P 史 ал 口p**.動 Ml Ugjb" 中/Йa,к*< 丄е5ёз VM«j ?_'.. ,:.,;一 一则国
]口口口音0" 醛<r』■,篇若①尧處0 “胴/ ^5; ® ,-•:」:■当
"統7坪7『 .河-幫" !T腼;■僦囲U !!!疆岳’:□可爾-厶" m曰!就■м н =0и事
‘三三二二「/.上也."® е'пза зffl ^^ ini f 函'」¥i4a.e
0 色 Мзбии». Г1вр«йаи- JTf (.^гчангГ. 寧Всея пименты •
" P 史 ал 口p**.動 Ml Ugjb" 中/Йa,к*< 丄е5ёз VM«j ?_'.. ,:.,;一 一则国
]口口口音0" 醛<r』■,篇若①尧處0 “胴/ ^5; ® ,-•:」:■当
"統7坪7『 .河-幫" !T腼;■僦囲U !!!疆岳’:□可爾-厶" m曰!就■м н =0и事
‘三三二二「/.上也."® е'пза зffl ^^ ini f 函'」¥i4a.e
0 色 Мзбии». Г1вр«йаи- JTf (.^гчангГ. 寧Всея пименты •
«ЙВЯМЮ ,
«ЙВЯМЮ ,
'4 ■,〜d+ III
'4 ■,〜d+ III
:Д|^?пмя ” & S A«f L *、、口 Q 図用 今-金• A • M 芸已■ к
Рис. 7.13. Устанавливаем направление шрифта для текста ячейки
ловка, табличной части и оконечной части, которая содержит итоговые суммы. Третья часть формы счета-фактуры представляет собой записи, количество которых является константой» а расположение определяется размерами табличной части документа.
Для формирования документа будем использовать его шаблон, который создадим и сохраним в формате шаблона документа Word. Данный шаблон, как и шаблон простого (без таблиц) документа, должен содержать постоянный текст, который не будет меняться при формировании новых документов, и текстовые константы, служащие для подстановки реального текста при формировании документа. Кроме этого в шаблоне счета-фактуры должна присутствовать табличная часть, ячейки которой содержат как постоянные записи, так и текстовые константы для заполнения из программы. Дополнительно табличная часть должна иметь строки, по подобию которых будут добавляться новые строки в таблицу.
Внешний вид возможного шаблона документа бланка счета-фактуры представлен на рис. 7.14.
Для формирования выходного документа будем использовать методы поиска фрагмента текста в документе, поиска и замены фрагмента текста на задан-
Рис. 7.14. Шаблон документа бланка счета-фактуры
ный текст. Для работы с табличной частью документа нам придется использовать свойства и методы для обеспечения перехода к заданной ячейке, определения текущей таблицы м положения в ней ячейки, записи текста в ячейку. Рассмотрим фрагменты исходного текста:
Формирование табличного документа с использованием шаблона документа
// Функция FindAndlnsert находит текстовую константу и подставляет
〃 на ее место текст
function FindAndlnsert(FindText, ReplacementText:string):boolean;
const wdReplaceAll=2;
begin
Forml. W. Selection. Find * Text: =FindText;
Forml.W.Selection.Find.Replacement.Text:=ReplacementText;
FindAndlnsert: =Forml. W * Selection. Find, Execute (Replace: =wdReplaceAll); end;
// Функция FindRowColumnInTable находит текстовую константу и возвращает // таблицу, а также номер строки и столбца, где находится эта константа
Function FindRowColumnlnTable {FindText:string;var tab:variant; var Row,Column:integer) :boolean;
begin
FindRowColumnlnTable:=false;
try
Foml. W. Selection. Find. Text: =FindText;
if Forml t W.Selection.Find.Execute then begin
Coluinn: =Forml.W.Selection.Cells.Item(l) .Co 1штIndex;
Row: =Forml. W. Selection. Cells. Item(l) * Rowindex;
tab: =Forml. W. Select ion«Tables. Item (1);
FindRowColuinnlnTable: =true;
end;
except
FindRcwColumn 工 nTable i^false;
end;
end;
// Данная процедура формирует документ счет-фактуру procedure ТForml.ButtonllClick(Sender: TObject);
var table_: variant;
Row_rColumn」integer;
begin
// Создаем новый документ по шаблону
W.documents»Add(ExtractFileDir(Appli cation.ExeName) +
1ХШаблон счета-фа ктуры.dot1);
// Подставляем текст в заголовок документа
FindAnd工nsert (,###НОМЕР& \ '1>
FindAndlnsert{'###Дата&1,datetostr(date));
FindAndlnsert(•###ПРОДАВЕЦ&','ЗАО Сокол');
FindAndlnsert(1###ВДРЕС_ПРОДАВШ\&', fr. Санкт-Петербург, ул* Кузнечная 5');
FindAndInsert(t###MHH__nP0(4ABIiA&,, 11234567890#);
FindAndlnsert(1###ГРУ300ТПРАВИТЕЛЬ&1#1ЗАО Соколг);
FindAndlnsertГ ###ГРУ30П0ЛУЧАТЕЛЬ&1г1ЗАО Селена1);
FindAndlnsert(1###ДОКУМЕНТ& I ‘1');
FindAndlnsert('# # #ДОТА_ДОКУМЕНТА& I datetostr(date));
FindAndlnsert(,##ПОКУПАТЕЛЬ&*,*ЗАО Селена•);
FindAndlnsert('###АДРЕС_ПОКУПАТЕЛЯ& *,* г. Москва, ул. Комаровского 41*);
FindAndlnsert ( 4##ИНН_ПОКУПАТЕЛЯ&*, 10 987 654321 *);
// Если нашли текстовую константу, то переходим к формированию табличной // части.
if FindRowCo 1шшInTable (1 *##ТАБЛИЦА&', table_, Row_, Column ) then begin
// Перед началом формирования курсор находится в таблице table_
// в ячейке Cell (Row_# Column^) . Добавляем в таблицу необходимое
// количество строк, уменьшенное на 1 (поскольку одна строка
// в шаблоне уже есть)*
W»Selection.InsertRowa(2-1);
// Формируем первую строку табличной части документа.
table_.Cell (Row_,Coluran_+0) .Range,Text:»'KOVRIС TRIVEL RUG';
table_.Cell (Row_,Со1шпп_+1) .Range.Text: ='шт';
table—.Cell (Row_,Column__+2) .Range.Text:sl 11;
table_.Cell (Row__rColumn_+3) .Range.Text: = *342, 00*;
table_.Cell (Row_, Column_+4) .Range• Text:^1342, 00’ ;
table_.Cell(Row」CQlumn_+6).Range.Text: ='20,00';
table_.Cell (Row_, Column_J-7) .Range.Text : = , 68, 40f;
table__.Cell (Row__,Column_4-8) .Range.Text : = *410, 401;
// Формируем вторую строку табличной части документа.
Inc(Row_);
table_. Cell (Row」Column_+0) . Range * Text : ^
•НИТЬ Climax Braided 100m 0,16iren‘;
table_.Cell (Row_f Column一+1) . Range .Text : = *шт*;
table_.Cell (Row_, 81wun_+2) . Range .Text:工'21;
table__.Cell (Row__f Column_+3) . Range .Text : = *309, 081;
table_.Cell(Row_f Column_+4 >.Range.Text:工'518,工6';
table_. Cell(Row_, Column_+ 6).Range.Text: ='20,00r;
table_.Cell (Row__,Column_+7) .Range.Text: = '123, 631;
table_.Cell (Rq忆,Column_+8) .Range.Text: =' 7 41, 7 9';
// Фораируем подпись табличной части документа.
if FindRowColvunnlnTable (' ###14ТОГ&1, table_, Row_, Colunm_) then begin table_.Cell (Row_,Column_4-0) .Range.Text:='960,16';
table__.Cell (Row__, Column_+1) . Range .Text : = * 192, 031;
table_.Cell (Row_rColuwn_+2) .Range.Text: = * 1152,19*; end;
end; // Заполняем текст в окончании документа.
FindAndlnsert (* ###ВСЕГО_К__ОШ1АТЕ& f,
*Одаа тасяча сто пятьдесят два рубля 19 копеек1); end;
Результат выполнения процедуры представлен на рис. 7.15.
Если доработать представленный фрагмент программы так, чтобы вносить данные из таблицы базы данных, то разработчики Delphi смогут с успехом
использовать его в своих проектах не только для формирования счетов- фактур.
wnpwnpIV Mioaidll Wmd ' ДонынеIV Mioaidll Wmd ' Донынеf*□±*n Qw*^ 0心 есгяил Фойы сеелв 工麻~,Qmp 2.' 一.使蔭!
wnp
wnp
IV Mioaidll Wmd ' Доныне
IV Mioaidll Wmd ' Доныне
т анайЕ!ь "晞4 e- • ■.田今国《!不国中 匹 •①/.-.■ ва:
•"'"--• .- * 9.***乂 尼*伊装口-'.a. 用日思喙必"也心!曜一;
---•- - ——上值―・Г雨后日口 斗声 正面。"1e gf曲 」#口物0
ЬоОламингш.ЬоОламингш.- ■ 丁 G § F—«,Н叩晔「行]'它吋虫一- ■ 丁 G § F—«,Н叩晔「行]'它吋虫一•( %•*•.♦ = =三•■因莉K蘭Г「-"二分尸>ki■:皆『肃;、「: 了个工 :-江 产°•( %•*•.♦ = =三•■因莉K蘭Г「-"二分尸>ki■:皆『肃;、「: 了个工 :-江 产°Рис. 7.15. Сформированный бланк счета-фактурыРис. 7.15. Сформированный бланк счета-фактуры5 二*Е 二二,5 二*Е 二二,СЧЕТ-ФАКТУРАМ! отюозлмиСЧЕТ-ФАКТУРАМ! отюозлмиHmAuvii ЗАО Conn
ЬоОламингш.
ЬоОламингш.
- ■ 丁 G § F—«,Н叩晔「行]'它吋虫一
- ■ 丁 G § F—«,Н叩晔「行]'它吋虫一
•( %•*•.♦ = =三•■
因莉K蘭Г「-"二分尸>ki■:皆『肃;、「: 了个工 :-江 产°
•( %•*•.♦ = =三•■
因莉K蘭Г「-"二分尸>ki■:皆『肃;、「: 了个工 :-江 产°
Рис. 7.15. Сформированный бланк счета-фактуры
Рис. 7.15. Сформированный бланк счета-фактуры
5 二*Е 二二,
5 二*Е 二二,
СЧЕТ-ФАКТУРАМ! отюозлми
СЧЕТ-ФАКТУРАМ! отюозлми
Адук г Смкт-П( прбург, уя Купнчми 5
ИдаппфалашмюшА к*, цр«даяца (НИН) 12М!#71Я r>pwTi^uan«k *・“ адг*с ЗАО Сркои r>jF»HMrgvc4 и «га ицс? 2АОС«№№
К плтви>.|к«ечпшпану даяяягнтт М1от LQG 2004 П*«хмт» МО Селам
Аддкк г. Маеха*. уя КшцкяежйГй 41 11жкг«фжя»ш»яшА намгр ««кштала (ИНН] 0937йЗ<СЦ
Как известно, документы Word наряду с текстом и таблицами могут содержать рисунки, надписи, линии, геометрические фигуры и другие графические объекты. Возможно, вы захотите украсить документ логотипом своей фирмы. О том, как использовать эти возможности Word в программах Delphi, читайте в следующей главе. Там же вы найдете информацию о том, как подготовить документ для печати и выполнить печать.
ГЛАВА 8
Работа с объектами в документе Word
В этой главе рассматриваются следующие темы:
коллекция объектов Shapes;
надписи;
О выноски;
линии;
геометрические фигуры;
口 внешние объекты (OLE);
口 настройка страницы;
口 печать документа;
口 пример программы — формирование товарного ярлыка.
Коллекция объектов Shapes
Рассмотрим объекты документа Word, расположение которых, в отличие от таблиц н текста, можно задавать произвольно с помощью координат. Такими объектами являются надписи, простые геометрические фигуры (линии, прямоугольники и овалы), автофигуры (предопределенные геометрические фигуры), рисунки, внешние объекты (OLE-объекты) и др. Все эти разнородные объекты, находящиеся в документе, объединены в коллекцию Shapes. Рассмотрим некоторые общие свойства и методы коллекции Shapes. Свойства: Count — содержит количество элементов коллекинн, SelectAll — вьще- ляет все элементы коллекции. Методы AddCallout, AddCurve, Add Label, AddLine, AddOLEControl, AddOLEObject, AddPicture, AddPolyline, AddShape» AddTextbox, AddTextEffect добавляют в коллекцию различные объекты, рисунки, указатели, элементы управления и т. д.
Надписи
Рассмотрим некоторые свойства коллекции Shapes и ее элементов на примере надписи (объекта TextBox). Для этого создадим в документе такой объект. Рассмотрим следующий фрагмент программы:
Создание надписи
procedure TForml.Button2Click(Sender:ТОЬj ect};
const ms oTextOr ien t at i onHo r i z onta1=1;
var left_, top_:Extended;
begin
left_:=10.15;
top_:=10.15;
W.ActiveDocument.Shapes・ AddTextbox(rnsoTextOrientationHorizontal, left」 top_, 200.25, 100, W.ActiveDocument.Range); end;
[ Примечание )
Для задания координат надписи можно использовать переменные типа real, но для Office ХР необходимо использовать только тип Extended (var left_, top_: Extended).
Для создания нового объекта мы используем метод AddTextbox коллекции Shapes. Первый аргумент этого метода имеет тип integer н задает ориентацию расположения текста этого объекта, последний аргумент имеет тип Range и определяет область, где будет создан объект,——в нашем случае это активный документ. Остальные аргументы типа Extended определяют координаты и размеры объекта. Для создания надписи с вертикальным размещением текста необходимо в качестве первого аргумента использовать константу msoTextOrientationVertical=5. С помощью константы msoTextOrientationDownward^S или msoTextOrientationUpward=2 можно задать направление текста при вертикальной ориентации (сверху вниз или снизу вверх).
Если описанную процедуру видоизменить так, чтобы при создании нового объекта учитывались координаты и размеры последнего, а также размеры страницы (см. приложение на сопроводительном диске книги), то ее выполнение может привести к результату, представленному на рис. 8.1.
Рассмотрим методы элементов коллекции на примере коллекции объектов TextBox, которую мы до этого создали. Для доступа к элементам коллекции используем свойство Item(i), которое возвращает объект, где i —— индекс или имя объекта. Например:
WordTextBox: =W. Act ive Document. Shapes. Item(l);
Рис* 8.1. Создание надписей
Данный оператор запишет в переменную WordTextBox:variant ссылку на первый объект коллекции.
Общими свойствами и методами для объектов коллекции Shapes являются размеры, координаты размещения объектов и некоторые методы, например Delete и Select. Следующие операторы соответственно выполняют выделение объекта, выбранного с помощью предыдущего оператора, изменение его координаты и удаление:
WordTextBox* Select;
WordTextBox* Left:=10;
WordTextBox.Delete;
Поскольку коллекция Shapes может содержать разнородные объекты, эти объекты могут обладать и особыми свойствами. Объекты Text Box, созданные методом AddTextBox и рассмотренные в предыдущем примере, предназначены для отображения текста, поэтому для них специфичны свойства и методы для работы с текстом. Рассмотрим их.
Основным объектом, при надлежащи м объекту Text Box и содержащим текст и его характеристики, является объект TextFrame. Он определяет границы
области текста внутри рамки надписи, направление текста и некоторые другие характеристики* В свою очередь объект TextFrame включает в себя объект Range, который содержит текст и характеристики шрифта. Рассмотрим следующую форму и исходный текст Delphi для манипуляций с текстом объекта TextBox.
;Работа с текстом надписи
var WordTextBox: variant; //
// Загружаем в ListBoxl имена объектов коллекции Shapes // из документа Word.
//
procedure TOJCBottomDlg2.FonnCreate(Sender:TObject);
var a_:integer;
begin
ListBoxl. Items. Clear;
for a_:=l to Forml. W. ActiveDocwnent. Shapes. Count do
ListBoxl. Items. Add (Forml. W. ActiveDocument * Shapes. Item (a_) * Name); end;
//
// При активизации строки объекта ListBoxl, используя имя объекта, // выделяем его из коллекции Shapes и записываем ссылку на этот объект // в переменную WordTextBox. Затем в компонент Text записываем текстовое // содержимое этого объекта.
//
procedure TOKBottomDlg2.ListBoxlClick(Sender: TC比ject); begin
Forml < W. Act iveDocument. Shapes. Item (
ListBoxl ・ Items. Strings [ListBoxl * Itemindex]) . Select;
WordTextBox: =Forml. W. ActiveDocument. Shapes * Item (
ListBoxl. Items. Strings [ListBoxl. Itemlndex]);
Text.Text:=WordTextBox.TextFrame.TextRange.Text;
end;
/ / При активизации компонента Text типа TEdit записываем введенный // в него текст непосредст в енно в объект TextBox документа Word. //
procedure TOKBottomDlg2.Textchange(Sender:TObject); begin
WordTextBox. TextFrame. TextRange .Text: =Text. Text;
end;
//
// Следующие две процедуры регулируют величину отступа левой границы
// текста от левой границы надписи*
//
procedure TOKBottomDlg2.SpinButtonlDownClick(Sender:TObjeat);
begin
WordTextBax. Text Frame. MarginLeft: ^WordTextBox. Text Frame. MarginLeft-0 • 25; end;
procedure TOKBottomDlg2.SpinButtonlUpClick(Sender: TObject);
begin
WordTextBox. Text Frame ・ MarginLeft: ^WordTextBox .TextFrame. MarginLeft+0.25; end;
Результат выполнения, описанного выше исходного текста, показан на рис. 82
Рис. 82 Работа с текстом надписи
Надпись, наряду с текстом и его свойствами, имеет параметры» определяю- шие другие ее визуальные элементы ——заливку (фоновый цвет) и линию
границы. Заливка определяется цветом, текстурой, рисунком или узором. Линия границы определяется толщиной, цветом, узором и стилем. Рассмотрим формирование заливки надписи.
Заливка надписи
Заливка надписи полностью определяется объектом Fill и его свойствами. Этот объект принадлежит родительскому объекту TextBox, а доступ к нему осуществляется следующим образом: WordTextBox.Fill, где WordTextBox —— ссылка на объект TextBox. В самом простом случае в качестве заливки можно использовать цветовой фон, который задается комбинацией из трех констант, соответствующих цветам модели RGB (Red —— красный, Green — зеленый, Blue ——синий), например:
ForeColor.RGB:^RGB(100,150,220);
С помощью следующей процедуры можно в диалоговом режиме изменять заливку области нашей надписи.
?гт 干,学":货…,.产[11rt,,:1书.,呀…"呀"."..*3T"5"..,…"„.4...„„,,„Г.^.,....п.....?е„,,Г.,^^^„.^.Г...^„,^^
;Изменение заливки надписи
procedure TOKBottomDlg3.ButtonlClick(Sender:TObject); begin
if not ColorDialogl.Execute then exit;
WordTextBox, Fill. ForeColor * RGB^ColorDialogl. Color; end;
Результат выполнения данной процедуры представлен на рис. 8.3.
Рис. 8.3. Изменение заливки надписи
Если для заливки использовать два цвета, то такой способ заливки называется градиентным и определяется, в дополнение к обычному способу одноцветной заливки, еще тремя свойствами ——значением второго цвета в формате RGB (свойство BackColor.RGB), способом задания и направлением градиента (метод TwoColorGradient). Рассмотрим следующий пример:
Использование градиентной заливки для надписи
procedure TOKBottomDlg3.Button2Click(Sender:TObject); begin
if not ColorDialogl.Execute then exit;
WordTextBox.Fill.BackColor* RGB:=ColorDialogl,Color; end;
procedure T0KBattomDlg3.CheckBoxlClick{Sender:TObject); begin
if CheckBoxl.Checked then
WordTextBox. Fill.TwoCo 1 оrGradient (Gradient.ItemIndex-<-l, napravlenie. Itemlndex+l) else WordTextBox.Fill*Solid;
end;
Первая процедура задает второй цвет, а вторая — стиль и направление градиента. Внешний вид формы приложения и результат представлены на рис. 8.4.
Для градиентной заливки более сложной формы можно выбрать предопределенный стиль градиентной заливки из предоставленного набора. Вид такой заливки определяется константой, задаваемой в качестве третьего аргумента метода FilLPresetGradient (первый и второй аргументы — стиль и направление градиента). Это можно сделать с помощью следующей процедуры:
Использование предопределенного градиента для заливки надписи
procedure TOKBottomDlg3.PrеsеtGradientChange(Sender: TObject); begin
WordTextBox. Fill. PresetGradient (Gradient. Itemlndex+l,
napravlenie.Itemlndex+1, PresetGradient.Itemlndex+l); end;
Результат выполнения процедуры представлен на рис. 8.5.
Еще один способ заливки надписи — задание текстуры. Текстура представляет собой многократно повторяемый рисунок, заполняющий прямоугольную область надписи. Рисунок текстуры определяется выбором в списке определенных числовых целочисленных констант и задается вызовом метода:
Fill. PresetTextured (textured: integer);
腹"■,2[,"3:上' ^' -. > • ■ ■腹"■,2[,"3:上' ^' -. > • ■ ■Т 毋 t &о*2Т 毋 t &о*2Тек1Вом5Text Box 6Т ext Box 8Т ext Вс»с 9Text Box 10Text Box 11Тек1Вом5Text Box 6Т ext Box 8Т ext Вс»с 9Text Box 10Text Box 11Первь!й цвет ФюнаПервь!й цвет ФюнаЦвет I ТекстураЦвет I ТекстураВторой цвет ФонаВторой цвет ФонаР Градиент JmtoGtadBnlFiorriCentL— “М апраел®ше|7三Р Градиент JmtoGtadBnlFiorriCentL— “М апраел®ше|7三ЕзпЕзпIII弥・・ж 『1_厂I2l_■■ ^■■■■мIII弥・・ж 『1_厂I2l_■■ ^■■■■мг г яви ■ ^^■■■яг г яви ■ ^^■■■я«ленмье типы градиентов«ленмье типы градиентовДооолмигельные цвета: гггггггг ггггггггйпреаелить цвет»Дооолмигельные цвета: гггггггг ггггггггйпреаелить цвет»ОтменаОтменаРис. 8.4. Градиентная заливка надписиРис. 8.4. Градиентная заливка надписиРис. 8.5. Заливка надписи предопределенным градиентомРис. 8.5. Заливка надписи предопределенным градиентом
腹"■,2[,"3:上' ^' -. > • ■ ■
腹"■,2[,"3:上' ^' -. > • ■ ■
Т 毋 t &о*2
Т 毋 t &о*2
Тек1Вом5
Text Box 6
Т ext Box 8
Т ext Вс»с 9
Text Box 10
Text Box 11
Тек1Вом5
Text Box 6
Т ext Box 8
Т ext Вс»с 9
Text Box 10
Text Box 11
Первь!й цвет Фюна
Первь!й цвет Фюна
Цвет I Текстура
Цвет I Текстура
Второй цвет Фона
Второй цвет Фона
Р Градиент JmtoGtadBnlFiorriCentL— “
М апраел®ше|7三
Р Градиент JmtoGtadBnlFiorriCentL— “
М апраел®ше|7三
Езп
Езп
III弥・・ж 『1_厂I2l_■■ ^■■■■м
III弥・・ж 『1_厂I2l_■■ ^■■■■м
г г яви ■ ^^■■■я
г г яви ■ ^^■■■я
«ленмье типы градиентов
«ленмье типы градиентов
Дооолмигельные цвета: гггггггг гггггггг
йпреаелить цвет»
Дооолмигельные цвета: гггггггг гггггггг
йпреаелить цвет»
Отмена
Отмена
Рис. 8.4. Градиентная заливка надписи
Рис. 8.4. Градиентная заливка надписи
Рис. 8.5. Заливка надписи предопределенным градиентом
Рис. 8.5. Заливка надписи предопределенным градиентом
Использование предопределенной текстуры для заливки надписи
procedure TOKBottomDlg3.TextureChange{Sender:TCtoject); begin
WordTextBox.Fill.PresetTextured(Texture.Itemlndex+l);
end;
Создадим форму Delphi с элементами управления и разместим в ее модуле представленную процедуру. Внешний вид формы и результат работы программы показаны на рис. 8*6.
Рис. 8.6. Текстурная заливка надписи
В качестве текстуры можно также использовать рисунок, загружаемый из файла. Для этого применим метод UserTextured объекта Fill. Единственный аргумент этого метода — строка — ссылка на путь и имя графического файла.
j Использование рисунка в качестве текстуры для надписи
procedure T0KBottomDlg3.Button3Click(Sender:TObject); begin
WordTextBox. Fill.UserTextured(*c: \рыбак.bmp1);
end;
Результат выполнения процедуры представлен на рис. 8.7.
Рисунок, загружаемый из файла, можно использовать не только в качестве текстуры, но и как фоновый рисунок (заливку), который сжимается или растягивается, вписываясь в размеры области объекта Text Box. Метод UserPicture, аргументом которого является строка — путь и имя графического файла, позволяет использовать рисунок в качестве фона объекта TextBox. Рассмотрим следующую процедуру.
;Использование рисунка в качестве фона для надписи
procedure T0KBottomDlg3<Button4Click(Sender: TObject);
var dir__:string;
'fmsoT ejrtureWhileMeble'fmsoT ejrtureWhileMebleЗагрузить теисгуру изЗагрузить теисгуру из020x126]020x126]IUmtoh」IUmtoh」Text Воя 2Text Вот 3TeKt8o»<5 Text go* &Text Воя 2Text Вот 3TeKt8o»<5 Text go* &Тех» Вик 9 Теш Вок IQ Te>d BokIIТех» Вик 9 Теш Вок IQ Te>d BokIIRe Файле; |Рыба>, iKiOhrfi/w 4Al I" bmp;* iw「,effil:. wmf|Re Файле; |Рыба>, iKiOhrfi/w 4Al I" bmp;* iw「,effil:. wmf|Оапкл G^J^^T^^三里J弱立J匾画Оапкл G^J^^T^^三里J弱立J匾画[бпрыгь ][бпрыгь ]Отмен» IОтмен» II Qi k|mi<t ие ФайлаI Qi k|mi<t ие ФайлаРис. 8.7. Использование рисунка в качестве текстуры для надписиРис. 8.7. Использование рисунка в качестве текстуры для надписи
'fmsoT ejrtureWhileMeble
'fmsoT ejrtureWhileMeble
Загрузить теисгуру из
Загрузить теисгуру из
020x126]
020x126]
IUmtoh」
IUmtoh」
Text Воя 2
Text Вот 3
TeKt8o»<5 Text go* &
Text Воя 2
Text Вот 3
TeKt8o»<5 Text go* &
Тех» Вик 9 Теш Вок IQ Te>d BokII
Тех» Вик 9 Теш Вок IQ Te>d BokII
Re Файле; |Рыба>, iKiOhrfi/w 4Al I" bmp;* iw「,effil:. wmf|
Re Файле; |Рыба>, iKiOhrfi/w 4Al I" bmp;* iw「,effil:. wmf|
Оапкл G^J^^T^^三里J弱立J匾画
Оапкл G^J^^T^^三里J弱立J匾画
[бпрыгь ]
[бпрыгь ]
Отмен» I
Отмен» I
I Qi k|mi<t ие Файла
I Qi k|mi<t ие Файла
Рис. 8.7. Использование рисунка в качестве текстуры для надписи
Рис. 8.7. Использование рисунка в качестве текстуры для надписи
begin
GetDir (0,dir_);
if not OpenPictureDialogl.Execute then begin
ChDir(dir_);
exit;
end;
ChDir (dir_);
WordTextBox.Fill.UserPicture{OpenPictureDialogl.FileName); end;
Результат выполнения представлен на рис. 8.8.
Еще одним и последним способом задания фона текстовой области надписи является использование узора. Узор определяется собственно рисунком (штриховкой), а также цветом фона и цветом штрнховкн. Узор определяется константой, выбираемой более чем из сотни возможных. Для выбора узора используется метод Patterned(Pattern:integer) объекта Fill, где Pattern определяет используемую штриховку. Для задания цветов фона и штриховки в формате RGB предназначены свойства BackColor.RGB и ForeColqr.RGB. Рассмотрим следующий фрагмент исходного текста.
Использование штриховки в качестве фона надписи
procedure TOKBottoniDlg3.ButtonlClick(Sender: TObject); begin
if not ColorDialogl.Execute then exit;
WordTextBox. Fill. ForeColor. RGB: ^ColorDialogl * Color; end;
procedure TOKBottomDlg3.Button2Click(Sender; TObject); begin
if not ColorDialogl.Execute then exit;
WordTextBox.Fill * BackColor.RGB:=ColorDialogl.Color; end;
procedure T0KBottomDlg3.Patternchange(Sender: TObject); begin
WordTextBox.Fill.Patterned(Pattern.Itemlndex+l);
end;
ИмАФлйпе; |2^ЯИмАФлйпе; |2^ЯDTKpuVHB 屮MnnDTKpuVHB 屮MnnТемпам 2 Те^НсиЗ T«KtB(»5 Text Box £ЮЗ^ОМ^ННTodBoxIOТезйВ(»11Темпам 2 Те^НсиЗ T«KtB(»5 Text Box £ЮЗ^ОМ^ННTodBoxIOТезйВ(»11Ивет I Текстура Рк^к | изф |Ивет I Текстура Рк^к | изф |Зф-р^энгь й«чнокм9 .ай/»Зф-р^энгь й«чнокм9 .ай/»П,1лк4: p^J Исаддкме клртннки 苗 ^aiioZ—T “а -'Рыбак Рыбка_1 Фон^З 中01/ UaeT»L】П,1лк4: p^J Исаддкме клртннки 苗 ^aiioZ—T “а -'Рыбак Рыбка_1 Фон^З 中01/ UaeT»L】司回號宜I园回司回號宜I园回国国1нп Ф«^ж \|a#「_bfflp?£:上广 】d;1нп Ф«^ж \|a#「_bfflp?£:上广 】d;33口柄3口柄3I Открыть ]I Открыть ]СЬмем IСЬмем I
ИмАФлйпе; |2^Я
ИмАФлйпе; |2^Я
DTKpuVHB 屮Mnn
DTKpuVHB 屮Mnn
Темпам 2 Те^НсиЗ T«KtB(»5 Text Box £
ЮЗ^ОМ^НН
TodBoxIO
ТезйВ(»11
Темпам 2 Те^НсиЗ T«KtB(»5 Text Box £
ЮЗ^ОМ^НН
TodBoxIO
ТезйВ(»11
Ивет I Текстура Рк^к | изф |
Ивет I Текстура Рк^к | изф |
Зф-р^энгь й«чнокм9 .ай/»
Зф-р^энгь й«чнокм9 .ай/»
П,1лк4: p^J Исаддкме клртннки 苗 ^aiioZ—T “а -'
Рыбак Рыбка_1 Фон^З 中01/ UaeT»L】
П,1лк4: p^J Исаддкме клртннки 苗 ^aiioZ—T “а -'
Рыбак Рыбка_1 Фон^З 中01/ UaeT»L】
司回號宜I园回
司回號宜I园回
国
国
1нп Ф«^ж \|a#「_bfflp?£:上广 】d;
1нп Ф«^ж \|a#「_bfflp?£:上广 】d;
3
3
口柄3
口柄3
I Открыть ]
I Открыть ]
СЬмем I
СЬмем I
Рис, 8.8. Пример использования рисунка в качестве фона для надписи
Первая процедура определяет цвет штриховки, вторая — цвет фона. Цвета выбираются с помощью диалога ColorDialogl, возвращающего значение цвета как комбинацию значений в формате RGB. Третья процедура определяет вид штриховки с помощью элемента управления Pauern:TComboBox (комбинированный список). Внешний вид формы с элементами управления и результат выполнения программы представлены на р“с. 8.9,
Линия границы надписи
Линии границы объекта коллекции Shapes в общем и надписи (объекта TextBox) в частности могут выглядеть по-разному м определяются свойства-
TeklBw?
ТЫ Box 3
Тех! &И 5 lexlBoxS Text Bex® Text 8w9
Цыгг I Текстура | Рисунок и»Р |
Heer штриховки
Text Bax 11
осьйвная2丹健e
pieoPaUernD afcD ownwardDiagonal
Рис. 8.9. Пример использования штриховки в качестве фона надписи
-—■■■■о L r ■■■■ ■ ■■■■r гганан LL・・・ra rr^HHS 厂厂作腐■■
ми объекта Line, принадлежащего элементу коллекции Shapes. Граница объекта может быть невидимой, если значение свойства Visible равно О (WordText Box. Li ne .V isible :=0). Если свойству Visible присвоить значение -1, то линия станет видимой. Наиболее часто используются свойства объекта Line, определяющие толщину и цвет линий. Если линия фанииы имеет толщину больше одного пиксела, то можно задать прозрачность цвета (свойство Transparency). В этом случае линия будет выглядеть как точки, между которыми есть просвет. Рассмотрим следующий исходный текст.
L—1L—1界 и”:”.”*田丝 田 ГН+"+<"*”С ”4^«+卄*“审”.”,q*rt^^y^Ew»»» Р^»ч»«^»^»jw,4*”《”》v#JI,”幫 口,量1・”冲可£0甘.贄.“a,,,*"»",,*trr>Ef,t»«|Wf*r •*”””"
L—1
L—1
Задание видимости, толщины и цвета линии границы надписи
procedure TOKBottomDlg4.CheckBox2Click(Sender: TObject); begin
if CheckBox2.Checked then WordTextBox * Line. Visible: =-*l else WordTextBox.Line.Vis ible:«0;
end;
procedure TOKBottomDlg4.ButtonlClick(Sender: TObject); begin
if not ColorDialogl.Execute then exit;
WordTextBox.Line. ForeColor.RGB:«ColorDialogl.Color; end;
procedure TOKBottomDlg4.SpinButtonlDownClick{Sender: TObject);
begin
WordTextBox* Line,Weight:=WordTextBox.Line.Weight-0.25; end;
procedure TOKBottoroDlgA. SpinButton2DownClick (Sender: TCfcject);
begin
if WordTextBox.Line, Transparency<l then
WordTextBox * Line. Transparency: =WordTextBox. Line ・ Transparency+0.01; end;
Первая процедура задает видимость границы объекта, вторая определяет ее цвет, присваивая значение цвета в формате RGB свойству ForeColor.RGB. Третья процедура определяет толщину линии границы, присваивая ее значение свойству WordText Box. Line .Weight 5 которое имеет тип Extended. Последняя процедура определяет прозрачность линии и задает для свойства Line.Transpareпсу значение от 0 до 1, имеющее тип Extended. Применяя эти процедуры, мы можем получить результат, который может быть, например, таким, как показано на рис. 8.10,
Рис, 8Л0. Выбор толщины и цвета линии границы надписи
Для задания вида линии можно использовать узор из набора возможных вариантов- Узор определяется целочисленной константой, которая записы* вается в поле Line.Pattern. Используя это свойство, запишем значение константы, выбрав его как индекс элемента управления Pattern:ТCombo Box (комбинированный список).
Выбор узора для линии границы надписи
WordTextBox. Line. Pattern: =Pattern. Itemlndex-Ы;
Результат изменений представлен на рис. 8.11.
Гpamue области объекта
Terf 8ох2 ТМВкЗ Tent Box 5 Text ВокБ Text Вок 6 Text Box 9 й^^^^^^^^^Terf 8ох2 ТМВкЗ Tent Box 5 Text ВокБ Text Вок 6 Text Box 9 й^^^^^^^^^卩 Линия卩 ЛинияUmt. toiw*» и узор | Стм<м лиьм, |Umt. toiw*» и узор | Стм<м лиьм, |Цвет/мнимЦвет/мнимТ ОШИмй пиннн 国м™.冉Т ОШИмй пиннн 国м™.冉pMPaUanHwiMrtaEridTpMPaUanHwiMrtaEridT
Terf 8ох2 ТМВкЗ Tent Box 5 Text ВокБ Text Вок 6 Text Box 9 й^^^^^^^^^
Terf 8ох2 ТМВкЗ Tent Box 5 Text ВокБ Text Вок 6 Text Box 9 й^^^^^^^^^
卩 Линия
卩 Линия
Umt. toiw*» и узор | Стм<м лиьм, |
Umt. toiw*» и узор | Стм<м лиьм, |
Цвет/мним
Цвет/мним
Т ОШИмй пиннн 国м™.冉
Т ОШИмй пиннн 国м™.冉
pMPaUanHwiMrtaEridT
pMPaUanHwiMrtaEridT
Рис. 8.11. Выбор узора для линии границы надписи
Если линия Гранины представлена не в виде узора, а в виде сплошной линии, то можно дополнительно задать тип линии и ее шаблон. Тип линии определяется присваиванием целочисленной константы свойству Line.Style. Если это свойство установить в значение msoLineSingle=0, то получится сплошная линия. Если этот стиль нас не устранвает, то используем следующую процедуру.
:Задание стиля линии границы надписи
procedure TOKBottomDlg4 * Stylechange(Sender: TObject); begin
WordTextBox, Line. Style: =Style. Itemlndex+l;
end;
С помощью этой процедуры мы можем изменить стиль линии, например, как показано на рис. 8.12.
Шаблон линии определяется присваиванием целочисленной константы свойству Line.DashStyle надписи. Если это свойство установить в значение msoLineSolid=0, то линия будет сплошной, без разрывов. Если нужно выбрать другой шаблон 刀ннмм, то данному свойству можно присвоить значение другой константы нз списка возможных.
Рис. 8.12. Выбор стиля линии границы надписи
:Выбор вида разрыва для линии границы надписи
procedure TOKBottomDlg4.DashStyleChange(Sender: TObject); begin
WordTextBox.Line.DashStyle:=DashStyle.Iternlndex+l;
end;
Пример результата выполнения этой процедуры показан на рис. 8.13.
Рис. 8.13. Выбор стиля разрыва линии границы надписи
Выноски
Выноска (объект Callout) является разновидностью надписи. Ее отличие заключается в том, что к прямоугольной области, где размещается текст, добавлена линия-указатель. Общими с надписью для выноски являются свой-
ства заливки и линии для области текста, а также свойства текста. Отличие в том, что у выноски свойства линии применяются и к ломаной линии- указателю. Есть и дополнительный объект Adjustments для описания линии- указателя, содержащий описание параметров линии Adjustments.Item(i), где i изменяется от 1 до Adjustments.Count (общее количество точек перелома линии). Создается объект-выноска с помощью метода AddCallout(Type, Left, Top, Width, Height, Anchor), где Type:integer — тип выноски, Left, Top, Width, Height — координаты и размеры (имеют тип Extended), Anchor — область, где создается выноска.
Создадим выноску с линией-указателем, описываемой тремя точками (msoCalloutThree=3). Для этого используем следующую процедуру, записан» ную в Delphi. Затем изменим горизонтальную координату внешней точки линии-ука зателя.
;Создание и настройка выноски
procedure ТОКВо11oraDlg8.ButtonlClick(Sender:TObject); begin
Forml. W. ActiveDocument. Shapes .AdciCallout (ms oCa 11 out Three,
100,10.15,200.25,100);
end;
procedure TOKBottomDlg8.SpinButtonlDownClick(Sender: TObject);
begin
Callout.Adjustments ♦ item(1) : =Callout. Adjustments * item[l]-0.01; end;
Текст выноски имеет те же характеристики, что и текст надписи (объекта TextBox), и записывается теми же методами, поэтому процесс записи текста и настройки параметров шрифта здесь не описан. Внешний вид созданной сноски представлен на рис, 8.14.
Рис. 8.14. Создание и настройка выноски
Линии
Линия (объект Line) в документе Word создается с помощью метода AddLine коллекции Shapes. Аргументами метода AddLine(BeginX, BeginY, EndX, EndY, Anchor) являются начальные и конечные координаты линии, имеющие тип Extended. Последний аргумент метода (типа Range) определяет область, где и создается линия. Толщина, цвет и другие характеристики линии задаются так же, как для линии границы надписи (объекта Text Box). Так выглядит оператор в среде Delphi, создающий прямую линию (результат его выполнения показан на рис. 8.15):
Добавление и настройка линии
一匕工二工.大;"枭二本二:卜宀^^汇心二;二;二.二』:".4;„^
W. ActiveDocument. Shapes. AddLine (100,100,200,150);
Рис. 8.15. Задание параметров линии
Геометрические фигуры
Метод AddShape коллекции Shapes используется для создания геометрических фигур. Прямые, ломаные и кривые линии создаются другими методами. Вызов этого метода выглядит так:
AddShape{Type, Left, Top, Width, Height, Anchor);
Первый аргумент представляет собой целое число и определяет тип создаваемого объекта, например Туре=1 соответствует прямоугольнику, набор всех возможных типов геометрических фигур составляет более 130* Аргу-
5 Зак. 723
менты Left, Top, Width, Height — числа, имеющие тип Extended и определяющие положение и размеры создаваемого объекта. Аргумент Anchor — объект типа Range, определяющий область, где будет создан объект. Для записи текста в область объекта применяются те же методы и свойства, что и к объекту TextBox (надписи). Создадим прямоугольник с помощью следующих процедур и запишем в него текст.
;Создание геометрической фигуры (прямоугольника) и добавление текста
procedure TForml.Button7Click(Sender:TObject); begin
W. Act iveDocument. Shapes. AddShape (1,100,100,130,100} end;
procedure TOKBottomDlgb.ListBoxlClick (Sender:TObject);
begin
Shape: =Forml. W * Act iveDocmnent. Shapes. Item (
ListBoxl.Items * Strings[ListBoxl.Itemindex]) end;
procedure T0KBottomDlg5.ButtonlClick(Sender: TObject);
begin
Shape.TextFrame.TextRange.Text:=Text.Text end;
Результат выполнения этих процедур может выглядеть, как показано на рис. 8」6・
Рис. 8.16* Создание прямоугольника и добавление в него текста
Создав однажды геометрическую фигуру, можно изменить ее внешний вид, изменив значение ее стиля. При этом остальные параметры, например толщина и цвет линий, а также текст, останутся без изменений, если новый тип предполагает их наличие. Для изменения типа фигуры достаточно из-
менить свойство AutoShapeType объекта, записав в него новое значение. Эффект будет таким же, как при создании нового объекта.
Изменим тип и текст созданной ранее геометрической фигуры (прямо
угольника) с помощью следующей процедуры.
Изменение типа геометрической фигуры
procedure TOKBo11omDlg5.AutoShapeTypeChange (Sender: TObj ect); begin
Shape.AutoShapeType:^AutoShapeType.Value;
end;
Текст, размещенный в полученной фигуре, может автоматически измениться, чтобы вписаться в размеры новой фигуры.
Рис. 8.17. ВосьмиугольникРис. 8.17. ВосьмиугольникВозможные результаты выполнения этой процедуры показаны на рис. 8.17 и 8.18.
Рис. 8.17. Восьмиугольник
Рис. 8.17. Восьмиугольник
Изменяемгеометрии ескую фигуру
Внешние объекты (OLE)
Коллекция Shapes позволяет добавлять в документ объекты, созданные н отображаемые с помощью программ -серверов OLE (OLE-серверов)- OLE- объекты в документах Word могут отображаться так же, как они отображаются в приложениях, предназначенных для их создания и редактирования. Если приложение, сопоставленное объекту, не является OLE-сервером, то объект отображается в виде ярлыка. Возможности Word в управлении такими объектами скудны и ограничиваются заданием координат и размеров. Кроме того, можно активизировать данные объекты.
:ррмменанме )
OLE (Object Linking and Embedding)— технология связывания и внедрения объектов.
Чтобы управлять внутренними свойствами OLE-объекта, внедренного в документ, необходимо получить доступ к объектам и методам этого объекта.
OLE-объект создается с помощью метода AddOLEObject. Спецификация вызова объекта включает ряд аргументов, передаваемых при вызове метода. Аргументами метода являются имя класса, имя файла, признак связи с файлом на диске и т. д. Есть два синтаксиса вызова метода AddOLEObject, При этом создаются объекты, имеющие некоторые отличия (вы можете разобраться с этими отличиями самостоятельно). Здесь мы рассмотрим создание OLE-объекта и его активизацию в документе Word на примере следующих процедур.
Создание, выбор и активизация OLE-объекта в документе Word
procedure TForml*ButtonlOClick(Sender: TObject);
begin
W.ActiveDocument,Shapes.AddOLEObj ect(ClassType: ='Excel.Sheet1, Left:=10, Top:=10, Width:=100f Height:=100); end;
procedure TForml.ButtonllClick{Sender: TObject); begin
if not OpenPictureDialogl.Execute then exit;
W.ActiveDocument.Shapes.AddOLEObj ect(ClassType: =1 Paint.Picture■, FileName: =OpenPictureDialogl. FileName,
Left:=10f Top:=10, Width:=100, Height:=100); end;
procedure TOKBottomDlg6.ListBoxlClick (Sender: TObject); begin
MyOleObj ect: =Forml. W. Active Document. Shapes. Item (ListBoxl.工 temlndex+l); end;
procedure TOKBottomDlg6.ButtonlClick(Sender: TObject);
begin
MyOleObject♦Activate; end;
Первая процедура создает новый лист Excel, вторая создает OLE-объект —— Paint.Picture и загружает реальный рисунок из файла. Третья процедура позволяет выбрать нужный объект из списка коллекции Shapes. Последняя процедура активизирует OLE-объект, что приводит к запуску программы — OLE-сервера. Создадим несколько OLE-объектов различных типов как с помощью приведенного исходного текста, так и обычным путем — как это делают пользователи. Запустим приложение (см. сопроводительный диск книги) н получим список OLE-объектов. После чего мы можем выбрать и активизировать любой из них (рис. 8.19).
Рис. 8.19. Создание и активизация OLE-объектов в документе Word
Настройка страницы
Настройка страницы определяется ее высотой, шириной, размерами полей, ориентацией и другими параметрами, определяемыми через свойства объекта PageSetup, который, в свою очередь, принадлежит объекту-документу. Для доступа к параметрам страницы используем следующий оператор, возвращающий ссылку на объект:
PageSetup: =Act i ve Document. PageSetup;
Далее можно считывать или устанавливать параметры страницы документа, но сначала рассмотрим краткую характеристику объекта PageSetup (табл. 8Д).
Таблица 8.1・ Свойства и методы объекта PageSetup
Свойство или метод
Тип
Краткое описание
LineNumbering
Объект
Нумерация строк
Orientation
Integer
Ориентация
Таблица 8.1 (окончание)
Свойство или метод
Тип
Краткое описание
TopMargin
Integer
Верхнее поле
BottomMargin
Integer
Нижнее поле
LeftMargin
Integer
Левое поле
RightMargin
Integer
Правое поле
Gutter
Integer
Переплет
HeaderDistance
Integer
Поле от края до верхнего колонтитула
FooterDistance
Integer
Поле от края до нижнего колонтитула
PageWidth
Integer
Ширина страницы
PageHeight
Integer
Высота страницы
FirstPageTray
Integer
выбор источника бумаги для первой страницы
OtherPagesTray
Integer
Выбор источника бумаги для следующих страниц
Section Start
Integer
Начало раздела
OddAnd EvenPagesHeaderFooter
eoolean
Различать колонтитулы четных и нечетных страниц
DHferentFirstPageHeaderFooter
Boolean
Различать колонтитул первой страницы
VerticalAlignment
Integer
Выравнивание по вертикали
SuppressEnd notes
Boolean
Запретить концевые сноски
MirrorMargins
Boolean
Зеркальные поля
TextColumns
Объект
Определяет колонки текста в документе и их параметры
PaperSize
Integer
Размер бумаги
SetAsTemplateDefault
Метод
Устанавливает данные настройки в качестве настроек по умолчанию для активного документа и вновь создаваем ых документов
TogglePortrait
Метод
Задает всем выделенным страницам (или части выделенных страниц) книжную ориентацию
Создадим новый документ и с помощью объекта PageSetup определим его основные параметры. Для этого используем форму в виде диалога (рис. 8.20). После создания диалога его элементы управления будут содер-
жать информацию об ориентации страницы, ее размерах, полях и стиле вертикального выравнивания текста. Используя эти же элементы управления, мы можем изменить основные параметры страницы, например, ориентацию (ю<ижная/альбомная), стиль вертикального выравнивания, размер бумаги и величины левого и верхнего полей. Рассмотрим следующую процедуру.
Определение параметров страницы
procedure TOKBottomDlg7. FormCreate (Sender: TObject);
begin
PageSetup: =Forml. W. Active Document. Page Set up;
Orientation.Itemlndex:=PageSetup.Orientation;
VerticalAlignment. Itemindex ^PageSetup.VerticalAlignment;
CheckBoxl.Checked:=PageSetup.LineNumbering.Active;
Pagewidth. Value :=PageSetup* Pagewidth;
FageHeight ・ Value: =Page Setup • PageHeight ;
TopMargin.Value:=PageSetup.TopMargin;
LeftMargin* Value:=PageSetup.LeftMargin;
end;
На рис. 8*20 представлена форма, в элементах которой отображается считанная из свойств объекта PageSetup активного документа информация о параметрах страницы активного документа.
Рис. 8.20. Параметры страницы документа Word
Изменим некоторые параметры страницы. Например, установим альбомную ориентацию и добавим вторую колонку для вывода текста, установив ее ширину в 200 пикселов. Для этой цели используем свойства и методы коллекции TextColumns объекта PageSetup. После изменения ориентации листа с книжной на альбомную или наоборот, считаем новые значения ширины и высоты страницы, а также новые величйны полей.
Изменение некоторых параметров страницы
L....—田““,宀总i,i.^».,.A.».,t^^.^^…“A“.i“..eE.・》*S 宀“;*.ii&iE,I“ •,宀+$:/“+,ЮнЧ*\т・“;
procedure TOKBo11omDlg7.Orientationchange(Sender: TObject);
begin
PageSetup. Orientation: «Orientation. Itemindex;
PageWidth.Value:=PageSetup* PageWidth;
PageHeight.Value:=PageSetup.PageHeight;
TopMargin.Value:=PageSetup.TopMargin;
LeftMargin.Value:=PageSetup* LeftMargin; end;
procedure TOKBottomDlg? * ButtonlClick(Sender: TObject); begin
if PageSetup.TextColumns.count<2 then
PageSetup.TextColumns < Add(200);
end;
Рис. 8.21. Измененная страница документа Word
Вторая процедура добавляет новую текстовую колонку, если число колонок меньше двух. После выполнения этих манипуляций страница будет выглядеть так, как показано на рис. 8.2L
Печать документа
Печать документа осуществляется с помощью метода PrintOut объекта мдо- кумент". Следующие процедуры позволяют выполнить печать активного документа, печать любого из открытых документов (NameDoc — имя или индекс документа) и печать двух копий активного документа:
f 7,"发骨.攀,-『".丁",;*1".:..;『t,„..:":",";"怨,,""""..,,;...*[*+*.丁:受丁…"".……"",".二"型.,:"…,,t"".::”.::…г:,.,:,.",""?.「..;"一"
:Печать документа
procedure TOKBottomDlg7.Button2Click(Sender: TObject); begin
Forml*W^ActiveDocument.Printout;
end;
procedure TOKBottomDlg7.ButtonSClick(Sender: TObject); begin
Forml.W.Documents*Item(NaineDoc) .Printout;
end;
procedure TOKBottomDlg7.Button3Click(Sender: TObject); begin
Forml. W»ActiveDocument. Printout (Copies: =2);
end;
Для предварительного просмотра активного документа перед печатью можно использовать следующую процедуру.
:Предварительный просмотр документа
:, Л ……“.》• Л.*.,”.Е…—.“+»•.,—“““Е”,…“……”..Ш““*”;厶…**L“X“**3"“1*+H^“““'«^*4*W4*"““・“; Л •“"“&』“……““"“W…,"…* —“*……“,+…*”"………-иЗ;・:
procedure TOKBottomDlg7.Button2Click(Sender: TObject); begin
Forml. W. Active Document * PrintPreview; end;
Мы рассмотрели основные типы объектов, входящих в коллекцию Shapes, после чего можно перейти к практическому использованию полученных знаний.
Рассмотрим пример программы.
Пример программы — формирование товарного ярлыка
Разработаем простую процедуру для формирования товарного ярлыка — объекта TextBox (надпись), содержащего таблицу 2x8, ячейки которой заполнены текстом (описанием товара). Внешний вид такого ярлыка представлен на рис. 8.22.
Рис. 8.22. Ярлык на товар, выполненный в виде документа Word
Рассмотрим фрагмент исходного текста программы, который сформирует данный документ.
;Создание товарного ярлыка
procedure TFoml .Buttcnl5Click (Sender: TObject);
var TextBox:variant;
Table: variant;
begin
// Создаем новый документ
W. Documents. add;
// Создаем объект TextBox
TextBox: =W ・ Act iveDocument * Shapes. AddTextbox (msoTextOrientationHorizontal, 10,10,250,120,W. ActiveDocument.Range);
// В области объекта TextBox создаем таблицу
Table:=W.Act iveDocimient.Tables.Add(TextBox.TextFrame.TextRange,8,2);
// Линии таблицы делаем невидимыми
Table.Borders.Enable:=False;
// Заполняем таблицу
Table.Cell(l,1).Range:=*Наименование товара:*;
Table.Cell(1,2).Range: = * Сорочка1;
Table.Cell(2,1).Range:=1Страна изготовитель:1;
Table.Cell(2,2).Range: = * Англия1;
Table. Cell (3,1). Range: ^' Фирма -изготовитель:';
Table. Cell (3,2). Range: =' nMarks&SpencerM »;
Table. Cell (5# 1) . Range: =1 Состав СЕфья: *;
Table.Cell (5,2) .Ranges* 100% хлопок*;
Table.Cell (7/1) .Range:^tРазмер:';
Table.Cell (7,2)・Range: = '48-50';
Table.Cell(8,1),Range:='Артикул:,;
// Выделяем первый столбец таблицы и изменяем в нем шрм姓
Table * Columns • Item (1) . Select;
W.Selection.Font.Bold:=True;
TextBox.Select;
end;
Результат выполнения данной процедуры показан на рис. 8.22.
Если потребуется создать ярлыки для нескольких товаров, например, указанных в таблице базы данных, то придется изменить эту программу таким образом, чтобы следующий ярлык располагался за текущим, — для этого придется учитывать размеры страницы, а также размеры и координаты расположения ярлыков.
ГЛАВА 9
Работа с объектом Word.Basic
В этой главе рассматриваются следующие темы:
口 объектная модель Word Basic;
О загрузка объекта Word.Basic и визуализация окна приложения Word;
создание документа Word;
口 открытие существующего документа Word;
поиск и редактирование текста в документе Word;
口 создание н редактирование таблиц в документе Word;
口 рисунки и другие внешние объекты;
□ печать документа Word;
口 запись документа Word на диск и окончание работы;
口 пример программы — платежное поручение.
Объектная модель WordBasic
В предыдущих главах мы рассмотрели архитектуру объекта Word.Application, а также использование этого объекта для работы с документами. Для этого рассматривались внутренние объекты Application, их свойства и методы Доступ к этим объектам, их свойствам и методам в среде Delphi обеспечивается аналогично доступу в среде программирования Visual Basic для приложения Word. Но приложение Word имеет в своем арсенале еще одно средство для работы с документами —— WordBasic.
Word.Basic н Word.Application — разные объекты, но они имеют общие черты. Их сходство заключается в том, что они оба входят в состав приложения Word и предназначены для решения аналогичных задач автоматизации создания документов. Word.Basic, как и Word.Application, обладает инструмен-
том предоставления своих возможностей внешним программам через механизм OLE Automation. Основное отличие WordBasic от Visual Basic состоит в том, что первый предоставляет не структуру связанных объектов со своими свойствами и методами, а набор процедур и функций, количество которых превышает 900.
Между процедурами и функциями WordBasic и Visual Basic можно провести аналогию и сравнить их возможности, что мы и сделаем в этой главе. Сначала рассмотрим объектную модель WordBasic. Структура объекта Word.Basic представлена на рис. 9.1. Она проста и представляет собой набор функций н процедур, принадлежащих корневому объекту, через который внешняя программа может получить доступ к ним.
Рис. 9.1. Объектная модель WordBasic
Для доступа к объекту Word.Basic из приложений, созданных в Deplhi, используем библиотеку ComObj и функцию CreateOleObject, которая возвращает ссылку на объект. В качестве аргумента этой функции используется строка — идентификатор объекта 'Word.Basic*. Рассмотрим следующий фрагмент исходного текста:
Создание объекта Word.Basic
uses ComObj
var WB:variant;
procedure TFonnl.ButtonlClick(Sender: TObject); begin
WB: =CreateOleObject ( Word.Basic1); end;
Получив доступ к объекту Word.Basic, можно переходить к решению вопросов автоматизации создания документов Word. В отличие от Visual Basic мы имеем дело с библиотекой процедур и функций, а не с четкой структурой объекта Application. Как быть в данном случае и с чего начать? Лучше всего начать с изучения библиотеки WordBasic и понять, как функции и процеду-
ры этой библиотеки соотносятся со структурой объекта Application. Откроем раздел "Справка по Visual Basic" справки по MS Word. В этом разделе откроем подраздел "Visual Basic Equivalents for WordBasic Commands" (рнс. 9.2).
Q MicraMiii W«d Viiud Bw£ЯПП
Visual Basic Equivalents for WordBasic CommandsVisual Basic Equivalents for WordBasic CommandsEd*AU<fT®<i N*ep a*iw. .AddEd*AU<fT®<i N*ep a*iw. .AddEditAiUdTexi Nam” гм/?з«, IntertAi^O. in&srtActMtOocumtnt.MtnchcdTtinpIfltfl.AuloTMiEntngt^r»*) lajgil Wh««.*»flje. Я«1»Т*1(1:еТгиеEditAiUdTexi Nam” гм/?з«, IntertAi^O. in&srtActMtOocumtnt.MtnchcdTtinpIfltfl.AuloTMiEntngt^r»*) lajgil Wh««.*»flje. Я«1»Т*1(1:еТгиеEdnAuUT・xt N«m** пгж, O«l«e E^ggkmE Ntm« • ”**, .Ajdci Eij|teookin*A ,Nw»b ₽ iwm, DwWteEdnAuUT・xt N«m** пгж, O«l«e E^ggkmE Ntm« • ”**, .Ajdci Eij|teookin*A ,Nw»b ₽ iwm, DwWteTBmpietes(wwf AiitoTtiiEHti*» (rMmt)匸喈闡*Ас1мО0Счт№11Вос1кти^1 ^ HwtMi^naiTi#, "•峭《 "rar^eAdwOocuEHtBocikmiA 1(/м«*)-йаШгTBmpietes(wwf AiitoTtiiEHti*» (rMmt)匸喈闡*Ас1мО0Счт№11Вос1кти^1 ^ HwtMi^naiTi#, "•峭《 "rar^eAdwOocuEHtBocikmiA 1(/м«*)-йаШгEdABookmMh Nwh ■ wmt>.GotoЕ^Всюктшк M・m * гяп»,. SonByEifitfiuttonltn•幻E(HS 独EiMConvwtAMEndncIttEMConvertAUFooinoiet EcMCDnveftNotvsEdABookmMh Nwh ■ wmt>.GotoЕ^Всюктшк M・m * гяп»,. SonByEifitfiuttonltn•幻E(HS 独EiMConvwtAMEndncIttEMConvertAUFooinoiet EcMCDnveftNotvsAcl**Ctocuni*rtt Bo«|i miHka(/4kn^, S<)»dAci*v£M>cumerit Bo<ikmiriiE 口豊虱俗&砌g = *dSortByK・n»Acl**Ctocuni*rtt Bo«|i miHka(/4kn^, S<)»dAci*v£M>cumerit Bo<ikmiriiE 口豊虱俗&砌g = *dSortByK・n»EdiiCopy EddCopyAsPidurs EdtCmlsPubliihei W EdltFlnd EdltF irtdBoHw EditFmdClearF№milling EdhfiwFoE EciilFmdFauihdQ EdltFindFrArna EditFmdbttghllflhi EdilFmdLtng EMFindNotHighllfhl EdltFiridFert EdVFrMSt,* EtHFindTabsEdiiCopy EddCopyAsPidurs EdtCmlsPubliihei W EdltFlnd EdltF irtdBoHw EditFmdClearF№milling EdhfiwFoE EciilFmdFauihdQ EdltFindFrArna EditFmdbttghllflhi EdilFmdLtng EMFindNotHighllfhl EdltFiridFert EdVFrMSt,* EtHFindTabs敞sffiiill EditfiuttonlmmeSvltction R*ng,£31iUActweOocumvni Eminats» C.di»*lArfMDpcwnent Fitojnotu Cortafl Sritction Footndtts '^owrtfrt 2S・l“ttan. Endntrt”,侬иди 写*l・ctigm Rung*,善廿 Sidection ₽впдв,йм!^Еа2Ш!3»1»И'°п Rang* £йИ嘛ilia;业XSel.Uign R«ngv ^ytStteclKm Find 3兩口嵐n 3 Bonlerv Stltction Frwt口“tfsmalhnQ8*1ес(юпа9也告皿Salection.FiM.f'aund Set«ci»M FWFtams SelvctKMi F#>d HM由n ®Tru> Selection. DoJ илфмдвЮ S*l*Cign FM 加门;@11 £ FUh E*lKl3 Find РйгаигйяЬЕогптДSv№dkM Fwd.SbfleS・Uci| (MtFmd.P+WphFDrm*. Il屬И幅敞sffiiill EditfiuttonlmmeSvltction R*ng,£31iUActweOocumvni Eminats» C.di»*lArfMDpcwnent Fitojnotu Cortafl Sritction Footndtts '^owrtfrt 2S・l“ttan. Endntrt”,侬иди 写*l・ctigm Rung*,善廿 Sidection ₽впдв,йм!^Еа2Ш!3»1»И'°п Rang* £йИ嘛ilia;业XSel.Uign R«ngv ^ytStteclKm Find 3兩口嵐n 3 Bonlerv Stltction Frwt口“tfsmalhnQ8*1ес(юпа9也告皿Salection.FiM.f'aund Set«ci»M FWFtams SelvctKMi F#>d HM由n ®Tru> Selection. DoJ илфмдвЮ S*l*Cign FM 加门;@11 £ FUh E*lKl3 Find РйгаигйяЬЕогптДSv№dkM Fwd.SbfleS・Uci| (MtFmd.P+WphFDrm*. Il屬И幅引 丨.. 可引 丨.. 可
Visual Basic Equivalents for WordBasic Commands
Visual Basic Equivalents for WordBasic Commands
Ed*AU<fT®<i N*ep a*iw. .Add
Ed*AU<fT®<i N*ep a*iw. .Add
EditAiUdTexi Nam” гм/?з«, IntertAi^O. in&srtActMtOocumtnt.MtnchcdTtinpIfltfl.AuloTMiEntngt^r»*) lajgil Wh««.*»flje. Я«1»Т*1(1:еТгие
EditAiUdTexi Nam” гм/?з«, IntertAi^O. in&srtActMtOocumtnt.MtnchcdTtinpIfltfl.AuloTMiEntngt^r»*) lajgil Wh««.*»flje. Я«1»Т*1(1:еТгие
EdnAuUT・xt N«m** пгж, O«l«e E^ggkmE Ntm« • ”**, .Ajdci Eij|teookin*A ,Nw»b ₽ iwm, DwWte
EdnAuUT・xt N«m** пгж, O«l«e E^ggkmE Ntm« • ”**, .Ajdci Eij|teookin*A ,Nw»b ₽ iwm, DwWte
TBmpietes(wwf AiitoTtiiEHti*» (rMmt)匸喈闡*
Ас1мО0Счт№11Вос1кти^1 ^ HwtMi^naiTi#, "•峭《 "rar^e
AdwOocuEHtBocikmiA 1(/м«*)-йаШг
TBmpietes(wwf AiitoTtiiEHti*» (rMmt)匸喈闡*
Ас1мО0Счт№11Вос1кти^1 ^ HwtMi^naiTi#, "•峭《 "rar^e
AdwOocuEHtBocikmiA 1(/м«*)-йаШг
EdABookmMh Nwh ■ wmt>.Goto
Е^Всюктшк M・m * гяп»,. SonBy
Eifitfiuttonltn•幻
E(HS 独
EiMConvwtAMEndncItt
EMConvertAUFooinoiet EcMCDnveftNotvs
EdABookmMh Nwh ■ wmt>.Goto
Е^Всюктшк M・m * гяп»,. SonBy
Eifitfiuttonltn•幻
E(HS 独
EiMConvwtAMEndncItt
EMConvertAUFooinoiet EcMCDnveftNotvs
Acl**Ctocuni*rtt Bo«|i miHka(/4kn^, S<)»d
Aci*v£M>cumerit Bo<ikmiriiE 口豊虱俗&砌g = *dSortByK・n»
Acl**Ctocuni*rtt Bo«|i miHka(/4kn^, S<)»d
Aci*v£M>cumerit Bo<ikmiriiE 口豊虱俗&砌g = *dSortByK・n»
EdiiCopy EddCopyAsPidurs EdtCmlsPubliihei W EdltFlnd EdltF irtdBoHw EditFmdClearF№milling EdhfiwFoE EciilFmdFauihdQ EdltFindFrArna EditFmdbttghllflhi EdilFmdLtng EMFindNotHighllfhl EdltFiridFert EdVFrMSt,* EtHFindTabs
EdiiCopy EddCopyAsPidurs EdtCmlsPubliihei W EdltFlnd EdltF irtdBoHw EditFmdClearF№milling EdhfiwFoE EciilFmdFauihdQ EdltFindFrArna EditFmdbttghllflhi EdilFmdLtng EMFindNotHighllfhl EdltFiridFert EdVFrMSt,* EtHFindTabs
敞sffiiill Editfiuttonlmme
Svltction R*ng,£31iU
ActweOocumvni Eminats» C.di»*l
ArfMDpcwnent Fitojnotu Cortafl Sritction Footndtts '^owrtfrt 2
S・l“ttan. Endntrt”,侬иди 写*l・ctigm Rung*,善廿 Sidection ₽впдв,йм!^Еа2Ш!
3»1»И'°п Rang* £йИ嘛ilia;业X
Sel.Uign R«ngv ^yt
StteclKm Find 3兩口嵐n 3 Bonlerv Stltction Frwt口“tfsmalhnQ
8*1ес(юпа9也告皿
Salection.FiM.f'aund Set«ci»M FWFtams SelvctKMi F#>d HM由n ®Tru> Selection. DoJ илфмдвЮ S*l*Cign FM 加门;@11 £ FUh E*lKl3 Find РйгаигйяЬЕогптД
Sv№dkM Fwd.Sbfle
S・Uci| (MtFmd.P+WphFDrm*. Il屬И幅
敞sffiiill Editfiuttonlmme
Svltction R*ng,£31iU
ActweOocumvni Eminats» C.di»*l
ArfMDpcwnent Fitojnotu Cortafl Sritction Footndtts '^owrtfrt 2
S・l“ttan. Endntrt”,侬иди 写*l・ctigm Rung*,善廿 Sidection ₽впдв,йм!^Еа2Ш!
3»1»И'°п Rang* £йИ嘛ilia;业X
Sel.Uign R«ngv ^yt
StteclKm Find 3兩口嵐n 3 Bonlerv Stltction Frwt口“tfsmalhnQ
8*1ес(юпа9也告皿
Salection.FiM.f'aund Set«ci»M FWFtams SelvctKMi F#>d HM由n ®Tru> Selection. DoJ илфмдвЮ S*l*Cign FM 加门;@11 £ FUh E*lKl3 Find РйгаигйяЬЕогптД
Sv№dkM Fwd.Sbfle
S・Uci| (MtFmd.P+WphFDrm*. Il屬И幅
引 丨.. 可
引 丨.. 可
Рис. 92 Набор команд WordBasic
На рис. 9.2 слева представлены команды WordBasic, справа — объекты и методы объекта Application, выполняющие аналогичные функции. Для детального анализа возможностей WordBasic сравним несколько его процедур и функций, позволяющих создать или отредактировать простой документ.
Загрузка объекта WordBasic
и визуализация окна приложения Word
Зшрузка объекта Word.Basic для доступа к его процедурам м функциям производится посредством вызова функции CreateOleObject (см. пример кода "Создание объекта Word.Basic"). После этой процедуры приложение Word будет загружено в память, и мы можем работать с ним и с документами. В начале работы разберемся, как сделать видимым окно приложения Word или убрать его с экрана монитора. В фоновом режиме документы обрабатываются значительно быстрее, а после создания или редактирования можно
отобразить готовый документ. При работе с Word.Application данное действие производилось установкой свойства Visible объекта Application в значение Тгие или False. Кроме того, считывая значение этого свойства, мы могли определить, в каком (видимом/невидимом) состоянии находится окно приложения. В WordBasic для этой цели применяется несколько процедур. Рассмотрим следующие процедуры*
;Отображение/скрытие окна приложения Word
procedure TForml.Button2Click(Sender: TObject);
begin
WB.AppShow;
end;
procedure TForml.ButtonllClick (Sender: TObject);
begin
WB.AppHide;
end;
Первая процедура делает видимым окно приложения Word на экране компьютера. Она аналогична оператору W.Application.Visible=True; в Visual Basic. Вторая процедура убирает с экрана (скрывает) окно приложения Word.
В набор функций, изменяющих визуализацию главного окна Word, входят также функции, позволяющие изменять размеры и положение окна на рабочем столе: AppSize(width, height:integer) — изменяет размеры главного окна приложения Word, AppWindowHeight(height:integer) — изменяет только высоту главного окна приложения Word, AppWindowWidth(width:integer)— изменяет только его ширину, AppWindowPosLeft(horizpos:integer) — изменяет только отступ от левой границы рабочего стола для главного окна приложения Word, AppWindowPosTop(vertpos:integer) — изменяет только отступ от верхней границы рабочего стола для главного окна приложения Word.
Изменение размеров и положения главного окна приложения Word
procedure TForml.Buttonl9Click(Sender: TObject);
var width_, height_,horizpos_, vertpos_: integer;
begin
width_:=300; height」=200;
WB. /^>pSize (width_, height_);
horizpos_:=10; vertpos_:=10;
WB. ^pWindowPosLef t (horizpos__);
WB .J^pWindowPosTop {vertpos_);
end;
В результате выполнения данной процедуры окно переместится в положение с новыми координатами, а размеры окна будут установлены в новьес значения (рис. 9.3).
ibOHX^SE . : ; ■—二:一冋其 I
Файл Древка Вид Аста&ка Фархат Сервис 工абпица Qioia ?
Pj* 時吋 н положение главного^кна W 咆Pj* 時吋 н положение главного^кна W 咆Рис. 9.3. Изменение размеров и координат главного окна MS WordРис. 9.3. Изменение размеров и координат главного окна MS Word
Pj* 時吋 н положение главного^кна W 咆
Pj* 時吋 н положение главного^кна W 咆
Рис. 9.3. Изменение размеров и координат главного окна MS Word
Рис. 9.3. Изменение размеров и координат главного окна MS Word
Видим, что с помощью команд WordBasic можно добиться такого же результата, как и в случае применения Visual Basic для Word Application. Но наша цель ——не только манипуляции с главным окном приложения Word, а гораздо шире — создание и редактирование простых документов в формате MS Word. Для решения такой задачи нужно научиться создавать новый до ку мент, открывать существующий документ, вставлять, удалять и копировать текст и выполнять другие действия, связанные с созданием и редактированием документа.
Приступим к решению этой задачи.
Создание документа Word
Создание нового документа Word в WordBasic в общем случае выполняется процедурой FileNewDefault без аргументов. Данная процедура создает документ, тип которого определяется по умолчанию (обычно ——Document Word). Если сохранить такой документ, то получим файл с расширением DOC. Рассмотрим следующую процедуру.
:Создание документа по умолчанию
procedure TForrnl*Button3Click(Sender: TObject); begin
WB. FileNewDefault;
end;
Выполнив данную процедуру, мы получим в окне приложения Word окно нового документа (рис. 9.4),
Рис. 9*4. Создан новый документ
Для создания нового документа по шаблону используем команду Word Basic FileNew(FileName), где FileName ——путь н имя файла-шаблона (файл с расширением DOT). Рассмотрим следующую процедуру.
Создание документа по шаблону
procedure TFornil.Button20Click (Sender: TObject); begin
if not OpenDialog2.Execute then exit;
WB.FileNew(OpenDialog2.FileName); end;
С помощью данной процедуры мы можем выбрать нужный шаблон и на его основе создать новый документ. Создадим новый документ, используя шаблон иИзысканный отчет*' из списка шаблонов MS Word (рис. 9,5).
Из сказанного следует, что WordBasic обладает необходимыми ресурсами для создания документа и эти ресурсы можно задействовать из приложений, создаваемых в среде Delphi. Разница между созданием документа в WordBasic н Visual Basic заключается в том, что последний для этой цели использует коллекцию Documents, что удобнее для дальнейшей работы с созданным документом.
Рис. 9.5. Создание документа на основе шаблона '"Изысканный отчет"
Открытие существующего документа Word
Открытие существующего (созданного ранее) документа в Word Basic осуществляется посредством функции FileOpen(FileName), где FileName — имя файла открываемого документа. Рассмотрим следующую процедуру.
Открытие существующего документа:
procedure TForml*Button5Click(Sender: TObject);
begin
if not OpenDialogl,Execute then exit;
WB t FileOpen{OpenDialogl.FileName); end;
И здесь основное отличие от Visual Basic заключается в том, что просто используется отдельная процедура. Преимущества Visual Basic заключаются в применении методов коллекции Documents, где после открытия или создания документа всегда можно получить доступ к этому или нескольким документам коллекции одновременно.
После создания или открытия документа мы переходим к его редактированию.
Поиск и редактирование текста в документе Word
Рассмотрим несколько простых процедур, позволяющих редактировать текст в документе. Нам потребуются возможности: перемещения по тексту документа, поиска фрагмента текста, копирования и вставки текста, вставки текста из буфера обмена.
Сначала рассмотрим процедуры, позволяющие перемещаться по тексту документа* Их нужно вызывать перед выполнением поиска — для позиционирования курсора. Для поиска фрагмента в документе, скорее всего, дополнительно понадобятся две процедуры — перемещение в начало документа (для того чтобы начать поиск) и перемещение в конец документа (для добавления новых записей). Процедура StartOfDocument перемещает курсор в начало документа, а процедура EndOfDocument — в конец документа. Пример использования этих процедур в среде Delphi выглядит так:
F,,,T”1„・"Г """"""f,:"",",》^.],%!,,,叫^^H«“:M№£・,Tm・.""Z・,*,r“**,,*”*"”aT»*PT",**«”+”"”",*”":”,**.""•"""•“,:,• :Перемещение курсора в начало и конец документа
procedure TForml.ButtonSClick(Sender: TObject); begin
WB.StartOfDocument;
end;
procedure TForml・ Button9Click(Sender; TObject); begin
WB.EndOfDocument; end;
После того как мы переместили курсор в начало документа, можно начать поиск фрагмента текста. Поиск текста производит процедура EditFind(text:string). В случае успешного поиска данная процедура выделяет искомый фрагмент текста. Для продолжения поиска по документу необходимо повторно вызвать эту процедуру. Чтобы убедиться в том, что искомый фрагмент существует и бьы выделен в результате выполнения процедуры поиска, следует вызвать функцию EditFindFound —— она возвращает значение True в результате успешного поиска. Рассмотрим следующий фрагмент исходного текста:
Поиск фрагмента текста в документе
procedure TForml.ButtonlOClick(Sender: TObject); var text_:string;
begin
text_: =InputBox (' Введем фрагмент текста для поиска1, 1, 1 *);
WB. EditFind (textj ;
if WB.EditFindFound
then messagebox(handle,1Фрагмент текста найден! \ rВнимание!1,0)
else messagebox (handle, фрагмент текста не найден! *, * Внимание Р , ОН end;
Используя приведенную процедуру, попробуем найти фрагмент текста в документе. Для этого откроем документ и введем искомое слово (рис. 9.6).
Рис. 9.6. Введем слово для поиска в документеРис. 9.6. Введем слово для поиска в документе
Рис. 9.6. Введем слово для поиска в документе
Рис. 9.6. Введем слово для поиска в документе
После того как слово для поиска введено, процедура WB.EditFind(text__) выполнит поиск* В случае успеха она выделит фрагмент текста, а функция WB.EditFindFound возвратит значение True. Когда заданный текст не найден, то никакой фрагмент не будет выделен, a WB*EditFindFound возвратит значение False. Если выполнить представленную выше процедуру дважды, то поиск продолжится с теми же параметрами и будет выделен следующий фрагмент, удовлетворяющий условиям поиска (рис. 9.7 и 9.8).
После того как курсор перемещен в заданное место документа, туда можно вставить текст. Если перед этим был выделен фрагмент текста, то вставляемый текст заменит этот фрагмент. Для этой цели используем функцию WB.insert(text__:string), где text_:string ——вставляемый фрагмент текста. Рас* смотрим следующую процедуру*
Поставил я подножием искусству; Я сделался ремесленник: перстам Придал послуиную, сухую беглость И верность уху. Звуки умертвив, Музыку я раэъял, как труп. ПоЦЯЩИ Я алпеброй гармонию. Тогда Уке дерэнулг в науке искушенный, Предаться неге творческой мечты. Я стал творить; но в тишине/ но в тайне, Не смея помышлять еще о славе.
Нередко, просидев в безмолвной келье Ава, три дня; позабыв и сон и пищу, Вкусив восторг и слез вдохновенья, Я жег мой труд и холодно смотрел. Как мысль моя и звуки, мной рожденны/ Пыла月, с легким дьмом исчезали. Что говорю? Когда великий Глюк Явился и открыл нам новы тайны (Глубокие^ плвнителъные тайны), Не бросил ли я все, что прежде 9нал, Что так любил, чему так жарко верил. И не пошел ли бодро вслед sa ним Безропотно, как тот, кто заблуждался И встречнъм послан в сторону иную? Усильным, напряжеиным постоянством 刊 наконец в нскуистве безграничном
Рис. 9.7. Результатом поиска является выделенный фрагмент текста в документе
Поставил я подножием искуаотвуг Я сделался ремесленник: перстам Придал послушную, сухую беглость И верность уху. Звуки умертвив, Музыку я раэъялг как труп. Поверил Я алгеброй гармонию. Тогда Уке дерзнул, в науке искушенныйг Предаться неге творческой мечты.
Я стал творить; но е тишине, но в т&说не#
Не смея помьпилять еще о славе.
中 рагмем текста найоен!中 рагмем текста найоен!Нередког просидев в безмолвной келье Два, три дня, позабыв и сон и пищу# Вкусив восторг и слез вдохновенья, Я жег мой труд и холодно смотрел, Как мысль моя и звуки, мной рожденны^ Пылая, с легким дымом исчезали.
中 рагмем текста найоен!
中 рагмем текста найоен!
Что говорю? Когда великий Глюк
Явился и открыл нам новы тайны (Глубокие, пленительные тайны), Не бросил ли я аие, что прежде знал, Что так любил, чему так жарко Э^Ш, И не пошел ли бодро вслед за ним Веэропотно/ как тот, кто заблуждался И встречнъм послан в сторону иную? Усильным, напряженньм постоянством Я наконец в искусстве безграничном
Рис. 9.8. Повторный поиск выделяет следующий фрагмент текста
^Mb»>W|4-MW^W«tt4.»1-»«^wr.»»MJ^«„^..yyM«M«<«.tJ<»J^y.,.fte^f....Ff.*^e^.t.H*^^..W)t№^^y,.^^,A,,..,,.y
:Вставка текста в документ
procedure TForml.Button7Click(Sender: TObject);
var text_: string;
begin
text_:=InputBox(* Вставляем текст в документ','',‘‘);
WB.insert(text_);
end;
Если комбинировать функции поиска и вставки текста, то можно заполнить подготовленный заранее шаблон документа. Можно заметить, что методы объектов WordAppiication, в отличие от процедур Word Basic, имеют более гибкие возможности для редактирования текста. Но все же WordBasic позволяет создать простой документ, пример которого мн рассмотрим в конце этой главы.
Можно упомянуть еще несколько функций, которые пригодятся любому программисту Delphi, решившему использовать WordBasic в своей работе. Это функции выделения всего документа, копирования в буфер обмена, вставки из буфера обмена в документ и разрыва страницы. Рассмотрим еле- дующие процедуры.
;Процедуры работы с буфером обмена
з…,,а .Ш,“
procedure TForml.Button!2Click(Sender: TObject); begin
WB.EditSelectAl1;
WB.EditCopy;
end;
procedure TForml.Buttonl3Click{Sender: TObject);
begin
WB. Edit Paste;
end;
Первая процедура выделяет весь текст документа м копирует его в буфер обмена, вторая — вставляет текст из буфера обмена на место положения курсора или вместо выделенного текста.
Вставка разрыва страницы
procedure TForml.Buttonl4Click(Sender: TObject); const wd?ageBreak=7;
begin
WB*InsertBreak(Type:=wdPageBreak);
end;
Данная процедура вставляет в текст символ конца страницы, после которого начинается следующая страница.
Мы исследовали основные методы работы с текстом. Далее исследуем возможности WordBasic, которые будем использовать для создания и редактирования таблиц в документе Word.
Создание и редактирование таблиц в документе Word
Таблицы в документах Word представляют собой объекты, являющиеся продолжением основного текста в документе. Например, если мы создаем таблицу, то она создается в месте нахождения курсора и, таким образом, разрывает текст. То есть если требуется создать таблицу в определенном месте документа, то необходимо предварительно установить в это место курсор.
Создадим таблицу в нашем документе, для этого используем функцию TableInsertTable(NumCoiumns, Num Rows), где NumColumns и NumRows — количества столбцов и строк в создаваемой таблице. Есть и другие синтаксисы данной функции (см. справку по WordBasic)*
Рассмотрим, как выглядит в Delphi фрагмент программы, создающей таблицу.
j Создание таблицы
procedure TOKBottcanDlg3.Buttonl5Click(Sender: TObject);
var NvmColumns, NumRows:integer;
begin
/ / Создаем таблицу размером 2x5
NumColumns:=2; NumRows:=5;
Forml ・ WB. TablelnsertTable (NumColumns, NmiRows);
〃 Отображаем линии таблицы
Forml a WB * TableGr idlines (true);
// Переходам в конец документа
Forml * WB. EndOf Document;
// Вставляем пробел
Forml* WB.insert(1 1);
// Переходим в конец документа
Forml. WB ・ EndOf Document;
end;
Итак, данная процедура включает в себя несколько операторов. Первые два пропускаем. Следующий оператор создает таблицу. Следующий за ним оператор представляет собой вызов процедуры, устанавливающей свойства ли-
ний таблицы. Если единственный аргумент процедуры TableGridlines установлен в значение True, то линии границ таблицы отображаются. Чтобы скрыть линии границ, вызовем метод WB.TableGridlines(False)4 Далее переходим в конец документа и вставляем символ пробела, чтобы следующая вставляемая таблица не слилась с этой таблицей.
Если между существующей таблицей и вновь создаваемой, следующей за первой, нет ни одного символа, то вторая таблица просто сольется с первой. В этом случае создание новой таблицы будет иметь эффект добавления новых строк к существующей таблице. Добавить или вставить новую строку в таблицу можно другим способом — с помощью процедуры TablelnsertRow. Если вызвать эту процедуру без аргумента, то будет вставлена одна строка; если при вызове в качестве аргумента задать целое число, то оно определит количество вставляемых строк. Эта процедура выполняется, если курсор находится в области таблицы, иначе генерируется ошибка.
Рассмотрим следующую процедуру-
:Добавление строки в таблицу
procedure TOKBottomDlg3.Buttonl6Click(Sender: TCfoject);
begin
Forml.WB,TablelnsertRow;// Добавляем одау строку
Fonnl. WB.TablelnsertRow (3);// Добавляем три строки
end;
В результате выполнения этой и предыдущей процедур (см. пример кода ''Создание таблицы*') получаем две таблицы с заданными параметрами (рис. 9.9).
Рис. 9.9. Добавление таблиц в документ и вставка строк в последнюю таблицу
Создав таблицу, можно приступить к заполнению ее ячеек текстом. Вставка текста в ячейки таблицы производится так же, как обычная вставка текста
в документ. Для этого достаточно установить курсор в необходимую позицию. Последовательное перемещение по ячейкам таблицы можно выполнять несколькими способами.
Используем для этого процедуры NextCell и PrevCell, позволяющие двигаться последовательно от первой ячейки к последней или наоборот. Дополнительно к перемещению курсора от первой к последней ячейке процедура NextCell добавляет новую строку в конец таблицы, если до этого курсор на- холился в последней ячейке таблицы.
Рассмотрим применение этих процедур в Delphi на следующем примере программного кода.
Перемещение курсора в таблице
procedure TOKBottomDlg3.Buttonl?Click(Sender: TObject); begin
Forml. WB. NextCe 11;
end;
procedure T0KBottomDlg3.Buttonl8Click(Sender: TObject); begin
Forml. WB * PrevCel 1; end;
Организовать перемещение курсора в таблице можно и с помощью другой пары процедур — NextObject и PrevObject. В отличие от уже рассмотренных процедур, они позволяют перемещаться и между таблицами, не изменяя при этом саму структуру таблицы. Пример их использования в приложениях Delphi:
F"w" Ну:…:尸m:*:" ""*",* "・,",…" ? F"?:]…芝" 飞.T",芳-^"["”"""".*”:t:””:;陋:/『翠,^^M^^:牛+”"*71不???,弓""|"".".!:”!?*[屮,",w,44":1::".".l*""""""了",",""*"".**"*彳; :Перемещение от объекта к объекту
procedure TOKBottanDlg3.Buttonl9Click(Sender: TObject); begin
Foml, WB. NextObj ect;
end;
procedure T0KBottomDlg3.Button20Click(Sender: TObject); begin
Forml.WB.PrevObject;
end;
Для перемещения непосредственно в конец или начало строки или столбца (и в начало или конец таблицы) применяют следующие четыре команды WordBasic.
:Перемещение в начало или конец строки или столбца
// Перемещаемо я в начальную ячейку строки
procedure ТОКВоttomDlg3*ButtonSClick(Sender: TObject); begin
Forml * WB. StartOfRow; end;
// Перемещаемся e последнюю ячейку строки
procedure TOKBottomDlg3.Button4Click(Sender: TObject); begin
Forml. WB. EndOfRow;
end;
// Перемещаемо я в верхнюю ячейку столбца
procedure TOKBottomDlg3.Button5Click(Sender: TObject); begin
Forml.WB.StartOfColumn;
end;
// Перемещаете я 耳 нижнюю ячейку столбца
procedure TOKBottomDlg3.Button6Click(Sender: TObject); begin
Forml * WB. EndOfColumn; end;
Понятно, что, комбинируя представленные процедуры, можно перемещаться в начало или конец таблицы, а также перемещаться между таблицами в документе.
Перемещаясь по документу, используя функции поиска текстовых фрагментов или команды перемещения по объектам или по ячейкам таблицы, можно вставлять текст в любое место документа.
Рисунки и другие внешние объекты
Кроме возможности вставить текст, Word Basic предоставляет функции для добавления в документ рисунков н других внешних объектов (OLE- объектов). Рассмотрим, как можно вставить рисунок.
Для того чтобы вставить рисунок или другой внешний объект, воспользуемся, например, следующим набором процедур — Insertobject, InsertSound и Insert Picture. Первые две вставляют OLE-объектьц отображение которых обеспечивается программами — OLE-серверами, третья процедура вставляет рисунок. Рассмотрим следующий фрагмент исходного текста.
;Вставка рисунка в документ Word
procedure TForml*Buttonl8Click(Sender: TObject); begin
if not OpenPictureDialogl*Execute then exit;
WB.Insertpicture(OpenPictureDialogl,FileName, False, False); end;
Процедура InsertPicture имеет три аргумента: первый — строка (имя графического файла); второй ——логический (связь файла с документом); третий — логический (признак внедрения рисунка в документ).
После формирования документа переходим к его печати.
Печать документа Word
Для печати документа достаточно использовать две команды Word Basic — процедуру просмотра FilePrintPreview м процедуру печати документа FilePrini. Последнюю процедуру можно вызывать без аргументов или с аргументами, например для задания числа копий печати.
Примеры использования данных процедур в приложениях Delphi:
U'"・ ...-.,Л.»Г„,,..^..^^»r.»«M;...H... *屮"““,1““胃
;Печать документов Word
procedure TForml.Buttonl7Click(Sender: TObject);
begin
WB. FilePrintPreview;
end;*
procedure TForml.ButtonlGClick(Sender: TObject);
begin
WB. FilePrint;
end;
В процедуре для печати вместо команды FilePrini можно использовать команду FilePrintDefault или команду FilePrint(c:integer), где с — количество печатаемых копий. Для предварительного просмотра печати также можно использовать команду FilePrintPreviewFullScreen, которая разворачивает окно предварительного просмотра печати во весь экран. Для просмотра в окне нескольких печатаемых страниц применяется команда Fi le Print Preview Pages(p: integer), где p — количество одновременно отображаемых страниц в одном окне.
Следующий пример программного кода иллюстрирует использование данных функций.
『,,》"•产『1”,*:',1"*^1*-¥評*!学*.."",,,:,,*"",,*".,"*"r*.”+tf ",W*”"*1", ",,.,,,”"""* …”FT,n+F”**r,**t*,,y*小*“*妙¥,*!,<)■,卅 u*!",,,.,.,¥,.”,±*Ef",.,£2“,*»”,*”,““"付,£.£“”,,*..,,,,,,"■ ”ifi :Печать документов Word
procedure TForml.Buttonl6Click(Sender: TObject); begin
WB.FilePrint (2); end;
procedure TForml.Buttonl7Click (Sender: TObject};
begin
WB. FilePrintPreviewPages ⑵; end;
Запись документа Word на диск ■ окончание работы
Записать документ в файл можно различными способами —— все зависит от выбора пользователя и от конкретной реализации документа. Для сохранения документа служат следующие команды Word Basic.
Процедура FileSave сохраняет документ под тем же именем, под которым он был открыт. Если документ создан вновь, то данная процедура неприемлема.
Для сохранения нового документа предназначена процедура FileSaveAsffile^ring), где file — имя файла, в котором сохраняется документ. Когда открыто несколько документов и требуется сохранить их, используется процедура FileSaveAlL
Рассмотрим, как можно применять их в проектах Delphi на следующем примере.
;Сохранение документа Word в файле
procedure TForml.Buttonl5Click(Sender: TObject); begin
WB.FileSave?
end;
procedure TForml.Buttonl5Click(Sender; TObject); begin
WB. FileSaveAs (*1. doc1);
end;
procedure TForml* Buttonl5Click(Sender: TObject); begin
WB.FileSaveAll;
end;
Как показал наш краткий обзор, WordBasic обладает всеми возможностями для создания и редактирования простого документа. В качестве примера рассмотрим процедуру создания платежного поручения. В главе 6 мы создавали этот документ с помощью Visual Basic. Теперь у нас появилась возможность сравнить решения одной и той же задачи разными способами.
Пример программы — платежное поручение
Разработаем прототип шаблона платежного поручения. Чтобы облегчить себе задачу, воспользуемся справочно-правовой системой "Гарант" и получим форму платежного поручения в формате DOC. Отредактируем этот документ и приведем его к виду, показанному на рис. 9.10. Далее сохраним его в формате шаблона (файл с расширением DOT) для последующего использования в процедуре формирования выходной формы документа "Платежное поручение1'.
Как показано на рис. 9.10, преобразование документа в шаблон заключается в том» что в некоторые ячейки внесен текст типа "###Сумма пропнсью&”. Эти фрагменты текста и представляют собой текстовые константы, используемые для подстановки информации из программы.
Рис. 9.10. Вид шаблона документа "Платежное поручение*'
Используем этот шаблон для создания документа. Следующий фрагмент программы демонстрирует, как это сделать.
;Формирование платежного поручения
三 ;♦“;,,“-.“““”“,."““n“2“,“・“““;“,“•“”““с“““,<Х',£・““*.з.”...,V,HWw>.....H-,„A«««MM.^-.¥to^
// Данная функция позволяет находить строку FindText
// и подставлять на ее место строку ReplacementText.
function FindAndlnsert (FindText,Rep1acementText:string):boolean;
label 0,1,2;
begin
Fonnl. WB. StartOf Document;
Forml•WB.EditFind(FindText);
if Forml. WB. EditFindFound then begin Forml. WB. inse rt (ReplacementText);
goto 1;
end;
end;
// Данная процедура заполняет шаблон документа.
//Pocedure TForml.Button!4Click(Sender: TObject);
begin
// Создаем новый документ по шаблону
W.documents.Add(ExtractFileDir(Application.ExeName) + *\Шаблон платежного* + ' поручения.dot');
WB. ТаЫeGridlines (false);
// Подставляем текст»
FindAndlnsert「###停 П.П.& \ 111);
FindAndlnsert('###Дата&1,datetostr(date));
FindAndlnsert('###Вид платежам *,1почтой');
FindAndlnsert ( ^ttttCybdMa прописью^1, 1 Двести пятьдесят рублей сорок копеек*);
FindAndlnseгt (* ###Сумма& ' # 1250,401);
FindAndlnsert (1 ###ИНН плателыцикал1, f ООО 000 00 001);
Findtocilnsert ('###КПП плателыцикаА1, 10000000000111);
FindAndlnsert (1 ###Плательщик&', ' ЗАО Селена');
FindAndlnsert(1###Р/С плателыцикаА *,100000000000000000000 *);
FindAndlnsегt(* ###БЖ плательщика&|,1000000');
FindAndlnsert(* ###К/С плательщика&1,*00000000000000000000*);
FindAndlnsert (,###ИНН получателя& 1,* 11111111111);
FindAndlnsert(1###КПП получателя^ I '111111111100');
FindAndlnsert(1###БЖ получателяй *,* 111111г);
FindAndlnsert(* ###К/С получателя&1,'11111111111111111111');
FindAndlnsert(* ###Р/С получателям1,* 111111111111111111111);
FindAndlnsert (■ ###Получатель& — ЗАО Комета,);
FindAndlnsert (1 ###В.О, &г, 1 '};
FindAndInsertC###H.n.&'z 1 •);
FindAndlnsert(1###Код& * r' *);
FindAndlnsert(1###С.П.&'r * *);
FindAndlnsert(^tt^.n-fi1, ' *);
FindAndlnsert (Ч##Р.П.& \ 1 4;
FindAndlnsert(,#H1&f, 1 *);
FindAndlnsert(* #H2& * r1 1);
FindAndlnsert{* #H3&',* *);
FindAndlnsert(1#H4 & 1,1 •);
FindAndlnsert(* #H5&1,* 1);
FindAndlnsert (1 #H6& — 1);
FindAndlnsert (' #H7 &1, ' 1);
FindAndlnsert(* ###Назначение платежа& 1,* Оплата за поставку товара *);
end;
Представленный здесь текст программы показывает, что большой разницы между реализацией в WordBasic и в Visual Basic почти нет, но некоторые отличия все же есть. Какие и чем они обусловлены? Они очевидны и вы можете их легко обнаружить сами. Результат выполнения данной процедуры показан на рис. 9.11.
Рис. 9.11. Сформированный документ "Платежное поручение'1
После создания документа можно переходить к его печати.
В этой главе мы рассмотрели особенности применения Word Basic в приложениях Delphi. Далее нет необходимости углубляться в эту тему, т* к* объект Word.Application предоставляет больше возможностей, например, доступ н программирование свойств элементов управления MS Word, что мы и рассмотрим в следующей главе.
6 Зак. 723
ГЛАВА 10
Программирование свойств MS Word
В этой главе рассмотрены следующие темы:
П элементы управления приложения MS Word;
口 элементы коллекции Command Bars, их отображение и расположение; 口 создание пользовательской панели или меню;
элементы управления м их свойства;
口 главное меню;
口 создание нового элемента управления;
создание и использование макроса Visual Basic средствами Delphi;
口 коллекция диалогов;
пример программирования панели.
Элементы управления приложения MS Word
В главах 5—9 были рассмотрены объекты, которые по большей части характеризуются как подчиненные по отношению к корневому объекту "документ0. Они в своей совокупности представляют содержимое и xapaктepи^ стики документа. Используя эти объекты, мы можем создавать документ и заполнять его содержание. Таким образом, мы используем приложение MS Word как универсальный редактор нужных документов (например, отчетов), и свойств этих объектов нам вполне достаточно, но Word.Application дает программистам больше возможностей, которые нужно использовать. Ранее была рассмотрена объектная модель Application, в которой элементы управления выделены в отдельную коллекцию самим приложением Word. Коллекция Command Bars представляет собой совокупность панелей ннст-
рументов (далее — панели) и панели главного меню (далее — главное меню), а также подобных элементов (панелей н меню), созданных пользователем. Каждый из этих элементов, в свою очередь, является хозяином кнопок (панели) или пунктов меню (главное меню и другие меню).
Рассмотрим свойства коллекции Command Bars. Как и любая коллекция, она содержит набор элементов и имеет свойство Count (количество элементов коллекции). Свойства и методы коллекции Command Bars представлены в табл. 10.1.
Таблица 10.1. Основные свойства и методы коллекции CommandBars
Свойство или метод
Тип
Описание
ActionControl
Объект
Ссылка на текущий активный элемент управления
ActiveMenuBar
Объект
Ссыпка на текущий активный элемент меню
Add
Метод
Добавляет элемент коллекции
Count
Integer
Количество элементов коллекции
DisplayTooltips
Boolean
Включает подсказку для кнопок
Display KeysInTooltips
Boolean
Включает подсказку сочетания ''горячих*1 клавиш для кнопок
FindControl
Метод
Осуществляет поиск элемента коллекции
ltenri(i:integer)
Объект
Элемент коллекции
LargeButtons
Boolean
Переключает отображение больших/маленьких кнопок
MenuAnimationStyle
Integer
Задает эффект при вь旧оде меню
ReleaseFocus
Метод
Обновляет пользовательский интерфейс для всех элементов коллекции
Исследуем некоторые общие свойства коллекции CommandBars. Например, свойство коллекции Large Buttons позволяет зыби рать размеры кнопок всех панелей ——большие или маленькие. Установим значение зтого свойства в Тте. Для этого можно использовать следующий программный код.
:Изменение размера кнопок
procedure TForml. LargeButtonsClick (Sender: TObject); begin
W* CommandBars.LargeButtons:^LargeButtons.Checked;
end;
Выполняя данную процедуру, мы получим результат, который не нуждается в дальнейших комментариях н представлен на рис. ЮЛ.
Рис. 10.1. Выбираем большие кнопки для панелей управления
Другим общим свойством коллекции панелей управления является режим показа всплывающих подсказок для кнопок, определяемый двумя свойствами логического типа: DisplayTooltips — определяет, включена или отоюче- на подсказка; DisplayKeyslnTooltips — определяет присутствие в подсказке 'Торячнх" клавиш. Изменение режима подсказок определяется просто установкой этих свойств в определенное значение. Рассмотрим фрагмент исходного текста.
;Изменение режима всплывающих подсказок для кнопок
procedure TForml.DisplayTooltipsClick(Sender: TObject); begin
W • CornmandBars. DisplayTooltips :=DisplayToolt ips. Checked; end;
procedure TForml.DisplayKeysInTooltipsClick(Sender: TObject);
begin
W.CcrnmandBars.DisplayKeyslnTooltips:=DisplayKeysInTooltips.Checked; end;
Свойства DisplayTooltips н Displ ay Keys 111T oolti ps коллекции Command Bars, используемые в представленных процедурах, позволяют изменить режимы всплывающих подсказок (рис. 10.2 и 10.3).
用 Microsoft Woid用 Microsoft WoidW MicrotoH WordW MicrotoH Word1 生айп Пр^вкя Rhu Вставка Формат Сервис 工з жПенять (Прмкгера нат]| 小1 生айп Пр^вкя Rhu Вставка Формат Сервис 工з жПенять (Прмкгера нат]| 小史айл EIxb心 Вид Втвко 中оримт Сервис 1абли一 一.Пдчзте |Г1С'1МГ.?с>.5 нвг1 |IJi'.+.2||史айл EIxb心 Вид Втвко 中оримт Сервис 1абли一 一.Пдчзте |Г1С'1МГ.?с>.5 нвг1 |IJi'.+.2||
用 Microsoft Woid
用 Microsoft Woid
W MicrotoH Word
W MicrotoH Word
1 生айп Пр^вкя Rhu Вставка Формат Сервис 工з ж
Пенять (Прмкгера нат]| 小
1 生айп Пр^вкя Rhu Вставка Формат Сервис 工з ж
Пенять (Прмкгера нат]| 小
史айл EIxb心 Вид Втвко 中оримт Сервис 1абли
一 一.Пдчзте |Г1С'1МГ.?с>.5 нвг1 |IJi'.+.2||
史айл EIxb心 Вид Втвко 中оримт Сервис 1абли
一 一.Пдчзте |Г1С'1МГ.?с>.5 нвг1 |IJi'.+.2||
…СЕзиН
Активируем WordApplicetionАктивируем WordApplicetionАитивирувм Wocd AgcagnАитивирувм Wocd Agcagn
Активируем WordApplicetion
Активируем WordApplicetion
Аитивирувм Wocd Agcagn
Аитивирувм Wocd Agcagn
F Еолыиие/Еал^ькио кнопкиР. Вспльва2щив пслск«5ги$и для кпогкж口 ПсАСхеэки сочета+1ия клавишF Еолыиие/Еал^ькио кнопкиР. Вспльва2щив пслск«5ги$и для кпогкж口 ПсАСхеэки сочета+1ия клавишРис. 10.3. Отображение подсказки и сочетания клавиш для кнопкиРис. 10.3. Отображение подсказки и сочетания клавиш для кнопки
F Еолыиие/Еал^ькио кнопки
Р. Вспльва2щив пслск«5ги$и для кпогкж
口 ПсАСхеэки сочета+1ия клавиш
F Еолыиие/Еал^ькио кнопки
Р. Вспльва2щив пслск«5ги$и для кпогкж
口 ПсАСхеэки сочета+1ия клавиш
Рис. 10.3. Отображение подсказки и сочетания клавиш для кнопки
Рис. 10.3. Отображение подсказки и сочетания клавиш для кнопки
Р ВопьшивЛ們пвкь咼е кнопки
Р Всплывающие пойсказки для кнопок
Г" Подсквэ^н сочетания клавиш
Рис. 10.2. Отображение подсказкидля кнопки
От общих свойств коллекции элементов управления перейдем к рассмотрению самих элементов коллекции ——панелей управления и их свойств. Доступ к ним осуществляется через объекты ltem(i:integer), где i — индекс элемента в коллекции.
Элементы коллекции CommandBars, их отображение и расположение
Для начала получим список всех элементов, входящих в коллекцию CommandBars. Для этого» используя свойство Count коллекции и свойство элемента Name, загрузим список элементов в объект типа TCheck List Box (прокручиваемый список с флажками). Свойство Name имеет строковый тип и представляет собой имя элемента. Его можно использовать для доступа к любому элементу коллекции аналогично индексу, имеющему числовой тип. Рассмотрим следующий фрагмент исходного текста в Delphi.
Список элементов коллекции панелей и меню
procedure TOKBottomDlg2.FormCreate(Sender: TObject); var a_:integer;
eee :string;
begin
COMMANDBARS :=Foml. W. COMANDBARS;
for a_:=l to COMMANDBARS.Count do begin
eee__:&C(M4ANDBARS. Item[a__] .name+* = * +CCM4ANDBARS. Item[a__] . NameLocal;
CheckListBoxl. Items .Add (eee_);
CheckListBoxl.Checked[a_-l] : =CmmandBars. ItemfaJ .Visible; end;
end;
Данная процедура, последовательно перебирая все элементы коллекции, загружает их имена в объект CheckListBoxl. Дополнительно загружаются значения свойств Name Local (имя, отображаемое в заголовке панели и соответствующее национальной версии Word, в данном случае ——русскоязычной) и Visible (режим отображения элемента в окне Word). Далее, перемещаясь по списку имен загруженных в CheckListBoxl элементов, можно по- лу^кить или изменить значения других свойств выбранной панели. Полезны, например, свойства: Position, Left, Top, Width, Height:integer — положение и размеры панели; Rowindex:integer — номер строки, занимаемой панелью, когда панели собраны в какой-либо части главного окна; если панель содержит кнопки или другие элементы управления, то свойство Builtlniboolean имеет значение True, иначе — значение False; Context — содержит строку со ссылкой на файл шаблона; Protection:integer ——определяет режим защиты панели от изменений со стороны пользователя (возможные значения этого свойства, а также свойства Position см. в Приложении /). С целью изучения некоторых из этих свойств рассмотрим следующий фрагмент программы» который представляет собой процедуру обработки для объекта CheckListBoxl.
:Выбор панели управления, изменение ее свойства Visible и расположения
procedure TOKBottomDlg2.CheckListBoxLC1ick(Sender: TObject); begin
CommandBars. Item[CheckListBoxl. Itemlndex+l] .Visible:=
CheckListBoxl.Checked[CheckListBoxl.Itemindex];
end;
procedure T0KBottomDlg2,Positionclick(Sender: TObject);
begin
CoiroTiandBaEs. Item [ CheckListBoxl. Itemlndex+l] . Posit ion: =Pos it ion. Itemindex; end;
Результат наших манипуляций co свойствами Visible n Position может быть таким, как показано на рис. 10.4. В данном случае для панели Стандартная свойство Position имеет значение msoBarFloating (4).
Рис. 10.4. Изменение положения панели
Далее, в режиме, когда панель находится в центре как самостоятельное окно, ее положение можно изменить — как по вертикали, так н по горизонтали. Для этого достаточно изменить значения свойств Left и Тор. Следующая процедура позволяет смещать панель вправо.
Смещение панели вправо
procedure TOKBottoinDlg2-Button3CIick(Sender: TObject);
begin
CcmnandBars. Item [CheckListBoxl ・ Itemlndex+l] . left:二
CornmandBars.Item[CheckListBoxl.Itemlndex+l]*left+10; end;
Результат выполнения процедуры показан на рис. 10.5.
Нужно отметить, что не все панели доступны для изменений их свойств. Некоторые панели не могут находиться в главном окне и располагаются в других окнах, например в окне просмотра печати. Изменение их свойств вызовет ошибку выполнения. Но большинство панелей все же доступны для изменения их свойств. В качестве примера можно отобразить некоторые
панели в главном окне и придать им новое расположение. Рассмотрим процедуру, отображающую панель Цвет заливки.
|Пп"о・снн1Ь па”с“ей| управнинха I。虱andard ■ Стандартная 一**"|Пп"о・снн1Ь па”с“ей| управнинха I。虱andard ■ Стандартная 一**"g Fam占Hng = Формеггироа^ниеПТ аЫе^ and Bordet* = Т абл-щы к границы 门 Det abate = Б азы данных □ Drawing = РисоеанмеLj Form я Формы「: Full Scwen * Во весь экран□ Edit Pictwe - Изменение рисункаg VkW Bdsic м Visual BasicU Stop Recording ■ Остановка записи'J Май Meige ・ Слияниеg Fam占Hng = Формеггироа^ниеПТ аЫе^ and Bordet* = Т абл-щы к границы 门 Det abate = Б азы данных □ Drawing = РисоеанмеLj Form я Формы「: Full Scwen * Во весь экран□ Edit Pictwe - Изменение рисункаg VkW Bdsic м Visual BasicU Stop Recording ■ Остановка записи'J Май Meige ・ СлияниеF панали до.сгп|гнь|/н«,осту1мь*F панали до.сгп|гнь|/н«,осту1мь*OK IOK I
|Пп"о・снн1Ь па”с“ей| управнинха I。虱andard ■ Стандартная 一**"
|Пп"о・снн1Ь па”с“ей| управнинха I。虱andard ■ Стандартная 一**"
g Fam占Hng = Формеггироа^ние
ПТ аЫе^ and Bordet* = Т абл-щы к границы 门 Det abate = Б азы данных □ Drawing = Рисоеанме
Lj Form я Формы
「: Full Scwen * Во весь экран
□ Edit Pictwe - Изменение рисунка
g VkW Bdsic м Visual Basic
U Stop Recording ■ Остановка записи
'J Май Meige ・ Слияние
g Fam占Hng = Формеггироа^ние
ПТ аЫе^ and Bordet* = Т абл-щы к границы 门 Det abate = Б азы данных □ Drawing = Рисоеанме
Lj Form я Формы
「: Full Scwen * Во весь экран
□ Edit Pictwe - Изменение рисунка
g VkW Bdsic м Visual Basic
U Stop Recording ■ Остановка записи
'J Май Meige ・ Слияние
F панали до.сгп|гнь|/н«,осту1мь*
F панали до.сгп|гнь|/н«,осту1мь*
OK I
OK I
Рис* 10.5. Смещение положения панели
;Отображение панели Цвет заливки
procedure TOKBottomDlg2.CheckListBoxlClick(Sender: TObj ect); begin
ComniandBars< Item[f Fill Color*} .Visible:==Тгие;
end;
В результате получим панель, представленную на рис. 10.6*
Если попытаться изменить положение панели Цвет заливки, т. е. пристыковать к одной из сторон главного окна, то результат будет отрицательным, т. к. тип этой панели не предусматривает таких изменений. Тип определяется при создании панели, для стандартных панелей изменить его нельзя; также к этим панелям нельзя применять метод Delete; есть и другие ограничения. Если тип панели позволяет, то ее расположение можно изменить, например» пристыковав к одной нз сторон главного окна. Для этого свойству Position объекта "панель" нужно присвоить одно из значений, указанных в табл. 102
Таблица 102 Возможные положения панелей
Константа
Значение
Описание
msoBarFloating
4
Отдельная панель в центральной части главного окна экрана
msoBarBottom
3
Панель с кнопками, расположенная вдоль нижней стороны главного окна
Таблица 70.2 (окончание)
Константа
Значение
Описание
msoBarLeft
0
Панель с кнопками, расположенная вдоль левой стороны главного окна
msoBarMenuBar
6
Системное меню
msoBarPopup
5
Всплывающее меню
msoBarRight
2
Панель с кнопками, расположенная вдоль правой стороны главного окна
msoBarTop
1
Панель с кнопками, расположенная вдоль верхней стороны главного окна
Рис. 10.6. Открываем панель Цвет заливки
В качестве примера изменим положение панели Стандартная, используя
следующий оператор:
CommandBars. Item [ * Standard' ] . Position: =msoBarLeft;
где msoBarLeft=0. Результат представлен на рис. I0.7.
Рис. 10.7. Панель Стандартная расположена вдоль левой стороны окна
Рассмотрим еще одно свойство панели, которое позволяет активировать или деактивировать панель в главном окне приложения Word. Свойство панелей Enabled имеет тип Boolean и определяет возможность доступа пользователя к ним. Когда свойство Enabled имеет значение False, пользователь не может пользоваться данной панелью ——она вообще не отображается. Если установить это свойство в значение Тше, то панель будет доступна и займет свое прежнее место в окне приложения Word. Возможно, этим свойством необходимо воспользоваться, когда требуется блокировать доступ пользователя к некоторым элементам управления. Рассмотрим следующую процедуру.
: •""^.^-•^-•"^,^^.^"”"•…*T,号:炉T…屮可飞,"”"""“ К,…丁产「,Tm.""""仲",中"" ".."・:""::记
:Отключение панелей управления
procedure TOKBottcmiDlg2.CheckBoxlClick{Sender: TObject};
var a_:integer;
begin
for a_:=l to ConsnandBars. Count do
CortinandBars. Item[a_] * Enabled: =CheckBoxl .Checked; end;
Данная процедура, перебирая все элементы коллекции Command Bars, устанавливает их свойство Enabled либо в значение True, либо в значение False
в зависимости от состояния свойства Checked объекта Check Box 1. Установим с ее помощью (для этого надо снять соответствующий флажок в форме) свойство Enabled в значение False для всех панелей. Результат выполнения процедуры представлен на рис. 10.8.
Рис. 10.8. Отключаем панели управления
Мы рассмотрели некоторые свойства встроенных панелей приложения Word. Есть возможность программно создавать и удалять пользовательские панели и меню. При работе со стандартными панелями и меню есть некоторые особенности, например их нельзя удалить. Далее рассмотрим создание новой панели (или меню).
Создание пользовательской панели или меню
Для создания пользовательской панели используем метод Add коллекции CommandBai^. У этого метода есть несколько аргументов. Синтаксис вызова метода Add:
Add(Name, Position, MenuBar, Temporary);
где Nameistring — название создаваемой панели, Position:integer — ее расположение (см. табл. 10.2), MenuBar:booleaii ——признак создания меню, Temporary:boolean ——признак создания временной панели* Используя данные аргументы н их комбинации, мы можем как создать обычную панель с кнопками или меню, так и заменить существующее главное меню приложения Word. Любой из создаваемых компонентов коллекции Command Bars может быть создан как временный объект (на время одного сеанса работы приложения) или как постоянный объект. Рассмотрим создание новой панели в приложениях Delphi на примере следующей процедуры.
} Создание пользовательской панели
procedure ТForml.Button2Click(Sender: TObject);
const msoBarFloating=4;
var CommandBar_:variant;
begin
CammandBar__: =W.CommandBars.Add(1Пользовательская панель 1,msоВагFloating, False, True);
CctniTiandBar_. Enabled: =T rue;
CommandBar_.Visible:^True;
end;
Рис. 10.9* Созданная пользовательская панель
По конкретным условиям, задаваемым аргументами в данной процедуре, новая панель создается и отображаете兄 в центральной части главного окна. Результат выполнения процедуры представлен на рис. 10.9. Поскольку на панели нет ни одной кнопки, ее размер задан по умолчанию.
Мы исследовали общие свойства панели, одинаково присущие как панелям с кнопками, так н меню. Чтобы понять отличият необходимо рассмотреть содержание самих панелей.
Элементы управления и их свойства
Как известно, панель может содержать кнопки и другие элементы управления, например, раскрывающиеся списки или пункты меню. Эти элементы в свою очередь принадлежат самой панели и объединены в коллекцию Controls. Посредством этой коллекции осуществляется доступ ко всем элементам управления выбранной панели. Коллекция Controls имеет несколько свойств и один метод. Мы будем использовать свойства Count (количество элементов коллекции) н Iteni(i:integer) (элементы коллекции, где i ——индекс кнопки), а также метод Add, позволяющий добавлять на панель новые элементы.
Рассмотрим свойства и методы элемента управления (табл. 10.3).
Таблица 103 Свойства 川 методы элемента управления
Свойство или метод
Тип
Описание
DescriptionText
String
Назначение элемента управления
Caption
String
Надпись на элементе управления
Execute
Метод
Выполнить команду, ассоциированную с элементом управления (кнопкой)
Enabled
Boolean
Доступный/недоступный элемент управления
Visible
Boolean
Видимый/невидимый элемент управления
HelpFile
String
Файл помощи для элемента управления
HelpContextID
Integer
Индекс в файле помощи для элемента управления
ID
Integer
Идентификатор элемента управления
Index
Integer
Индекс элемента управления на панели
OnAction
String
Имя макроса для элемента управления
Reset
Метод
Сбросить пользовательские настройки для элемента управления
Таблица 10.3 (окончание)
Свойство или метод
Тип
Описание
SetFocus
Метод
Активировать элемент управления
TooitipText
String
Всплывающая подсказка для элемента управления
Исследуем содержание панели и некоторые свойства элементов управления. Если рассматривать меню, то его основное отличие от панели с кнопками состоит в том, что элементом управления в составе меню может быть как пункт меню, так и подменю со своими элементами управления и т. д.
Чтобы проанализировать свойства панели, используем свойства Count и Item() коллекции Controls, а также свойства Caplion и TooitipText. Загрузим весь список кнопок и других элементов управления панели в объект ListBox с помощью следующей процедуры.
;Загрузка списка элементов управления панели
procedure TOKBottomDlg5•FormCreate(Sender: TObject);
var a_:integer;
eee_:string;
begin
MYCONTROLS: =OKBottomDlg4 .ConffnandBars. Item[
OKBottomDlg4 LiatBoxl. Itsnlndex+l ] /CONTROLS;
for a_:=l to MYCONTROLS- Count do begin
eee__: ==MYCONTROLS .1 tern[a_] .Capt ion+'工 * +MYCONTROLS. Item [a__l. TooitipText;
ListBoxl. Items. Add (eee_);
end;
MYCONTROL: ffCONTRQLS, Item [1];
end;
Результат выполнения процедуры представлен на рис. 10.10.
Как видно из рис. 10.10, переходя от одного элемента управления к другому, мы можем получать и изменять их свойства. Для этого достаточно загрузить в переменную типа variant ссылку на элемент hem(), например, как в следующем операторе:
MYCONTROL:=MYCONTROLS.Item[ListBoxl.工七emlndex+l];
Далее, работая со ссылкой, мы получаем доступ к различным свойствам выбранного элемента управления. В качестве примера сделаем невидимой выбранную кнопку, изменим ее надпись (свойство Caption) и запустим на выполнение команду, связанную с данной кнопкой.
Рис*10.10. Состав панели
;Управление свойствами элемента управления
procedure TOKBottomDlg5.b_visibleClick(Sender: TObject); begin
MYCONTROL. Visible :=b_viaible .Checked;
end;
procedure TOKBottc^nDlgb.b_CaptionClick(Sender: TObject); begin
MYCONTROL* Caption:二'Новая кнопка1;
end;
procedure TOKBottomDlg5.ButtonlClick(Sender: TObject); begin
MYCONTROL.Execute;
end;
Главное меню
В отличие от панели инструментов, главное меню н его элементы имеют несколько иные свойства, основным отличием является возможность для каждого элемента меню содержать свою коллекцию элементов. Проще говоря, каждый элемент меню может содержать подменю, элементы которого также могут содержать свое подменю. Таким образом, меню имеет древовидную структуру. В этом случае доступ к любым элементам обеспечивается посредством элементов коллекций Controls, принадлежащих индивидуально каждому элементу меню. На рис. 10.11 представлен пример объектной модели меню.
Рис. 10.11. Объектная модель главного меню
Используя коллекции Controls и методы Execute и SetFocus элементов этих коллекций, можно развернуть главное меню примерно так, как показано на рис. 10.12. Исходный текст этого модуля программы и форму для среды
разработки приложений Delphi можно посмотреть в приложении на сопроводительном диске книги.
图 Mioosail Wittd Л;акфм)нн11
紆 ЗиамаЕь紆 ЗиамаЕьП^ ^"П^ Пр«1ыонт,2»н自 просмоп) •= Пр«йЬм(ХГГ«п*Ы)пр<' ЬПвчагь.. « Ы1»м>ь... КШлП^ ^"П^ Пр«1ыонт,2»н自 просмоп) •= Пр«йЬм(ХГГ«п*Ы)пр<' ЬПвчагь.. « Ы1»м>ь... КШлB»fViVMrtiB»fViVMrtiПс^«мт*Пс^«мт*in.in.Сво&йел * Сло&Аствв11 GA \И«1ЛройкаФормагиочнсялмиен.. «Слисока IU GrV АНастрайла ^opt^aro© чисел е цен, -Спиежч ]Сво&йел * Сло&Аствв11 GA \И«1ЛройкаФормагиочнсялмиен.. «Слисока IU GrV АНастрайла ^opt^aro© чисел е цен, -Спиежч ]Рис. 10.12. Анализ объекта "Главное меню"Рис. 10.12. Анализ объекта "Главное меню"'睥史ай«1Ьшм 痴 Berih ' ^одадт £вр«цю| 才 Qtn卩ыг* 一QNiu
紆 ЗиамаЕь
紆 ЗиамаЕь
П^ ^"П^ Пр«1ыонт,2»н自 просмоп) •= Пр«йЬм(ХГГ«п*Ы)пр<' ЬПвчагь.. « Ы1»м>ь... КШл
П^ ^"П^ Пр«1ыонт,2»н自 просмоп) •= Пр«йЬм(ХГГ«п*Ы)пр<' ЬПвчагь.. « Ы1»м>ь... КШл
B»fViVMrti
B»fViVMrti
Пс^«мт*
Пс^«мт*
in.
in.
Сво&йел * Сло&Аствв
11 GA \И«1ЛройкаФормагиочнсялмиен.. «Слисока I
U GrV АНастрайла ^opt^aro© чисел е цен, -Спиежч ]
Сво&йел * Сло&Аствв
11 GA \И«1ЛройкаФормагиочнсялмиен.. «Слисока I
U GrV АНастрайла ^opt^aro© чисел е цен, -Спиежч ]
Рис. 10.12. Анализ объекта "Главное меню"
Рис. 10.12. Анализ объекта "Главное меню"
16L3*cTpcflMi *Юр1лвтс* **<cen t> цен , 2Б:к ЛНacrpttfr.a Фс#»>иггм кысал в ывн.- j G: к,\Нктройм Фирмлтов чисаи и.&гм
4 GA ,\НПтрМ“ ФОртатм чис«л»иен,..
Из рис. 10.12 понятно, что мы раскрываем подменю (дочерний набор элементов меню), используя свойства и методы родительских объектов, которым принадлежат коллекции Controls (раскрываемое подменю), В качестве примера открываем меню Файл (элемент главного меню) и подменю Отправить (элемент меню Файл). Метод Execute запускает команду, связанную с выбранным элементом меню. Если с этим элементом связано подменю, то данная команда раскрывает его. Метод SetFocus устанавливает фокус на данный элемент меню.
От исследования существующих элементов управления меню и панелей инструментов перейдем к созданию собственных элементов.
Создание нового элемента управления
Все элементы управления любой панели собраны в коллекцию Controls. Данная коллекция не только объединяет элементы и их свойства, но и обладает методами, позволяющими создавать или удалять элементы управления. Рассмотрим два метода коллекции. Метод Add ——создает новый элемент, метод Delete — удаляет выбранный элемент. Причем метод Delete
принадлежит элементу коллекции, а не самой коллекиии (как метод Add) и его нельзя применить к стандартным элементам коллекции» а только к пользовательским.
Рассмотрим синтаксис вызова метода Add. В справочной системе он выглядит так:
Add(Type, ID, Parameter, Before, Temporary);
где Type:integer — тип объекта, ID:integer— идентификатор объекта, Pararneterstring — имя связанной с данным элементом команды, Befbre:boolean — признак разделителя, Temporary:boolean —— признак создания временного элемента. Возможные типы создаваемых объектов указаны в табл. 10.4.
Таблица 10・4・ Возможные типы создаваемых объектов
Константа
Значение
Тип создаваемого объекта
msoControlButton
1
Кнопка
msoControlEdit
2
Поле ввода
msoControlDropdown
3
Раскрывающийся список
msoControlComboBox
4
Комбинированный список
msoControlPopup
10
Элемент меню
Создадим обычную кнопку на панели Стандартная. Используем метод Add, первый аргумент которого (Туре) равен msoControlButton, а второй (ID)— единице. Установим значение надписи, задав в свойстве Caption текст» выберем значок (свойство Faceld) и стиль кнопки (отображение и значка, и надписи).
Создание новой кнопки !上“二….工…“宀二:―.:二……… 二宀
procedure TOKBo11cunDlg8.Button2Click(Sender: TObject); begin
msBut t on: ==CommandBars. I tern [1 standard' ] . Controls. Add (
Type:=msoControIButton, ID:=1);
msButton.Caption:='Простая кнопка';
msButton.Style:s msoButtonlconAndCaption;
msButton.Faceld:=FaceId.value;
end;
Результат выполнения процедуры представлен на рис. 10.13.
Рис. 10.13. Создаем новую кнопку на панели СтандартнаяРис. 10.13. Создаем новую кнопку на панели Стандартная
Рис. 10.13. Создаем новую кнопку на панели Стандартная
Рис. 10.13. Создаем новую кнопку на панели Стандартная
Изменим стиль кнопки (отображение только значка или надписи), записав в свойство msButton.Style константу msoButtonlcon или msoBuitonCaption. Соответственно получаем результат, представленный на рис. 10.14 и 10.15.
Рис. 10.15. На кнопке только надписьРис. 10.15. На кнопке только надпись
Рис. 10.15. На кнопке только надпись
Рис. 10.15. На кнопке только надпись
При создании пользовательского элемента (кнопки) мы присваивали аргументу ID значение, равное единице* Если данному аргументу присвоить другое значение, то получим функциональную кнопку со своими значком и командой, выполняемой при обращении к элементу управления. Для примера можем использовать значения от 2 до 9 или от 1850 до 1859.
;Создание элементов управления с предопределенными свойствами
Создание кнопок с различными значками
procedure TForml.Buttonl3Click(Sender: TObject);
var panel, button:variant;
a_:integer;
begin
panel: =W. CommandBars .Add (1 Новая панель');
panel. Visible: =True;
for a_:= 0 to 500 do begin
buttomi^panel.Controls.Add(Type:=msoControlButton, ID:=1);
but tom. Style: =s:msoButtonIconAndCaption;
button*Caption:=inttostr(a_);
buttom.Faceld:=a_;
end;
end;
Кнопки созданной панели показаны на рис. 10.16.
Т^ 1学2口3昌4□*①日唠7口8119皿/百1;后12面门“ 1,津15刁15 Q 户 口 iH通19=加工X盛22寸打0 MQ 2S 国参/订函29б29'Эа0匿O32033@34卷工曲謳口"?*・泅,《)中小|7*?品"0!“壁,5“毎0"句。y4 9 !lB5Q«Q51t>52t?S3 — 54-58 = S6«*57-i S9 © Ю Д 60£G4 62AM 口* “由 65# 修巾$7。6« 口的 0 70 1 N2 以 3 73
4 74 5 7Se7S7 77e?8 9?3AeoBeiC82Da3EMFe5Gfi6HW|8eje9KWL9lM53N33O9«PS6QS6R37
$ 91 T » U 100 V МП W W X »o Y 10» Z 105 ■ 1(«凶 13 О IS QjM 3 110 У 1П 112 Ж ИЗ К 114 и 115 田 116 口 И/ М >16
q HI ■ «0 ■ 121 ■122 ■ 1Z3 Ц?汜,И1» 0 125 ® W ^ 1Я г» !3\130 o 131 ♦ IC ♦ 133 ♦П4 ♦ 13 ♦ 136 ♦ 1» •138 Щ 13Э
0 14。M M,CS 1*2 ИЕМ3 曉 14 4 — U5 _146 I 14,| 1« 王 l« 口 1»151 О 152 > 153 H 154 4155 » IS H 157 ” 旧 先]侬 W ISO
〉》瀬U ir = ik IS и右阳Q咼R©© t龍専哪q 1内t& in曲in唯its m q 1万山,方田m 口 ITS伤m 口圍0 ■
0 182 碗 103 •旧 U#1修,岡 D 何 J1 岡 II «89 Д 1J0 ю 1 引二慳5足 / 154 朋例然 1% W1* £ 198 心旧 12120111s醐色 ЯК
:田蹣・”к ■ :Сб &20Б % 工,汇?W 飽2И,| ND * 2nMz1?凤 21】曦4 4 □!不6 % 216 St J17 C5R8 ・| 幫9 9 220 曰蜀杳 222 廟 223
;□ 224 fi 225 Е 22Б S 227 .220 紡 229口230@231 白 ZKQSW 口①合 ZJ5 ^ 236 g 237,幽弓 П9 ® W0 R 第匸 W、2«冊1a44 ,1.243吧;!%10 2"?1?也相209?250=251L25?A253n翔用255电?《电期/2»回259。2«)■齒号0跋侬9 264導265 М 258л1»7 0 26Э^азвггаЙ|2Л』mA m о 2M 0 2K ® m、277 to 2Я % 2nB Ж W»1 U 262 Ё3 2Ю •剧 fir 206 • 386 D 2W <•)288 ii 2B3 Л 290 ta гл g- 23? > 293 V 2И # 3® 矛 296 廿 加日 298 国 39 |1г,: ЭШ ^ XI П ^ "8 303 ^Г Х4 »S 0^ ЗЮ 9 307 Я зовКиз» г 310 а 小 亀 312"; 31」9 зн а 羽5 n Э« а 31 才血 з« 口 319 и згп ^ ЗИ Q зэ $ кэ 招認 盘 з» S з» а згт s зи ® зм 0 ззо tf 331 ззгаиэ зз* за ззь 13? <5 за в за ^ ж QI эн Q 342 Q ю зи 6 ms / з« ■ w 杀 *5 / з« 4 350 Q 351 曹 3SD3®3Z3M@355 5 拉公 357ХЖЙ* 脚叵吏]/刘 0总/M310&@)痴硕:》61力%3e8覇宓#面3m И Зm a »? .=" m * 374 -• J75 * m / m -^ pb '('珈 丁 :л0 т Зт 7期 / 奪 * 364 1c,珏 К 瀛 紹 新 口斑口粉口 烟L面 П 通口 3SJ ■ 3M 电》5 X 3» . 397 鴻 ЭМ 菱 ЮЭ £ 400 厶例困《г К 心 6 «М I,U5 W «Ю К 407 耽《Й % 4QS 口 4g 仪 4"亜 412 同413A414 & 6②4正@ 41?■4招M0 9 M例皿面山位0心3 ,42 4■电0柄 > 心,* E ■ 425屋求厚4112412吼4更
世 <34 田 435 Q 4ЭБ 后07 皿《8 囲 О ® 440 :: “1 >; М2 1一 ♦« 段《4 d4« « 44€ 倒“,& ■ 4 MS -^ <50 4- 451 > 452 ^4Я Ь 464
吶 4b5 咕,% 丽 457 Т・《В { 459 ^J 4® «Ь 4fi1。三侬①《3 13三 4Ы 自 3 ■妣 口 4fi? ♦4G8 Ш «» 8 4701al 仞 4 4能哲 4?3 霞 3 gB 5
,5 唯仞 X 47B 山47sl3 40) * ■ ♦462 ♦皿•处 ^: <«5 ^> 4» ОW gj 4Ю Q4Ю П 400 П 431 П 4» П <93 ГТ «Ы Г495 ' 436
予 499 |Д SJO
Рис. 10.16. Варианты значков кнопок
Создание и использование
макроса Visual Basic средствами Delphi
Возможно, это самый интересный раздел. Как уже говорилось н было показано на многочиеленных примерах, используя среду визуального программирования приложений Delphi, можно без особого труда создать и исполь-
J82 Часть 〃. Разработка документов 川门ри门。*ену宓 MS Wad в Delphi зовать любой документ приложения Word. Но есть некоторые ограничения, которые порой достаточно трудно обойти. Одним из таких ограничений является невозможность передавать из Delphi в Visual Basic значения, типы которых не поддерживаются лля такого взаимодействия. Например, в документе требуется создать объект — ломаную линию. Для создания такого объекта приходится заполнять массив данных для точек изломов этой линии, затем вызывать метод, аргументом которого является этот массив. При создании контроллера автоматизации мы не можем использовать внзов из Delphi функций Visual Basic, аргументами которых являются массивы. Как быть в таком случае или в других случаях, когда ситуация кажется безвыходной? Решением может быть создание макроса средствами Delphi с использованием объектов Visual Basic и выполнение этого макроса, а затем его удаление после выполнения задачи.
Макросы представляют собой тексты процедур ня и функций на языке Visual Basic, связанные с проектами. Проекты являются родительскими объектами по отношению к макросам. В свою очередь проект связан или с документом, или с шаблоном документа. Все проекты объединены в коллекцию проектов. Текст макроса хранится в программном модуле, в котором могут храниться и несколько макросов.
Доступ к коллекции или к любому проекту коллекции обеспечивают объекты W.VBA.VBProjects н W.VBE.VBProjects.Item(i:integer), где i — индекс элемента коллекции. Имя элемента коллекции связано с именем шаблона или документа, обычно для шаблона Normal индекс равен единице. Проекту, в свою очередь, принадлежит коллекция VBComponents элементов проекта — это и визуальные объекты, и тексты макросов. Метод Add коллекции VBComponents создает новый элемент. Чтобы создать стандартный модуль, содержащий тексты макросов, аргумент этого метода должен быть равен vbext_ct__StdModule. После создания модуля мы получаем доступ к текстовой части макроса и можем записать в него любые операторы, соответствующие спецификации языка Visual Basic. Рассмотрим пример процедуры.
:Создание и использование макроса Visual Basic средствами Delphi
procedure TFornil. Button5CLick (Sender: TObj ect);
const vbext_ct_StdModule-l; var
CodeModule: variant;
ConroandBar:variant;
msbootom:variant;
eee_: string;
begin
CodeModule:=
W.VBE.VBProjects. Item(1) .VBComponents・Add(vbext_ct_StdModule) .CodeModule;
еее」='Sub Макрос! () 1 +Chr (10) +Chr (工3) +
'MsgBcoc 1+Chr(34)+1Выполняется процедура нажатия кнопки1+Chr(34)+
Chr(10)+Chr(13)+
* set document-Application.Documents・ Add '+Chr(10)+Chr(13) +
Dim pts(1 To 7, L To 2) As Single '+Chr(10)+Chr(13) +
^tsd, 'pH, •pts(2, pts⑵ 'РЕЗ 'pts(3, 'pts(4, 'pts(4, *pts(5, lpts(5, Rts{6, 'pts ⑹ 'ptsQ 'pts ⑺^tsd, 'pH, •pts(2, pts⑵ 'РЕЗ 'pts(3, 'pts(4, 'pts(4, *pts(5, lpts(5, Rts{6, 'pts ⑹ 'ptsQ 'pts ⑺= 0 ,+Chr(10)+Chr(13)+
^tsd, 'pH, •pts(2, pts⑵ 'РЕЗ 'pts(3, 'pts(4, 'pts(4, *pts(5, lpts(5, Rts{6, 'pts ⑹ 'ptsQ 'pts ⑺
^tsd, 'pH, •pts(2, pts⑵ 'РЕЗ 'pts(3, 'pts(4, 'pts(4, *pts(5, lpts(5, Rts{6, 'pts ⑹ 'ptsQ 'pts ⑺
= 0 ,+Chr(10)+Chr(13)+
= 72 1+Chr(10)+Chr(13)+ 2) = 72 ,+Chr(10)+Chrll3)+ 1) = 100 l+Chr(10)-bChr(13) + 2} = 40 *+СЬга0)+СЪг(13) + 1} = 20 ,+Chr(10)+Chr(13)4- 2} = 50,十Chr(lS+Chr (13) + 1) = 90 гч-СЬг(10)+СЬг(13) +
= 120 ,+Oir(10)+Chr(13) + 1) = 60 ^ChrdOJ+Chr (13) + 2) = 30 '-t-Chr (10)+Chr (13) +
1) = 150 *+0^(10)+Chr(13) + 2) = 90 *+Chr(10)+Chr(13)+
1ActiveDocument.Shapes.AddPolyline (pts) 1+Chr(10)+Chr(13)+
'End Sub';
CodeModule. AddFromString (eee_);
eee_: =CodeModule*name;
messagebox (handle, pchar <'Макрос "Макрос】” создан в модуле ‘…+ =€_+■"> J,О);
CommandBar: =W. CommandBars. Add (Name:二'Временная панель ',
Position: =s4nsoBarFloating);
CommandBar. Enabled: =true;
CoranandBar .Visible: =true;
messagebox(handle,pchar(1Создана временная панель■)# *',0);
MSBootom:^.CammandBars.Item[1Временная панель'].Controls.Add{Type:= msoControlButton, ID:=1);
MSBootom.Caption:二 *Временная кнопка';
MSBooton. OnAction: «CodeModule. name+'・ Макрос!';
messagebox(handle,pchar(1Создана временная кнопка1)f * 1< 0);
msboctom.Execute;
MSBootom-Delete;
messagebox(handle,pchar(* Удалена временная кнопка'),',,0);
CoraniandBar. Delete;
messagebox(handle,pchar{1 Удалена временная панель *),* 1r 0);
W.VBE.VBProj ects.Item(1).VBComponents.Remove(CodeModule.parent);
messagebox(handle,pchar(1Модуль ” *+eee_+ и "Макрос!1' удалены*),*1,0); end;
В первом операторе этой процедуры мн создаем н получаем доступ к программному модулю, в который сможем записать текст создаваемого макроса. Далее в строковую переменную записываем текст создаваемого макроса, учитывая стиль написания операторов Visual Basic. Оператор
CodeModule.AddFromString(еее_);
где еее_ — строка, содержащая текст макроса, записывает текст макроса в модуль* Далее создаем меню и кнопку, в свойство On Act ion которой записываем строку —— имена модуля и макроса, разделенные точкой. Метод Execute кнопки запускает созданный макрос на выполнение. Далее удаляем кнопку, панель и компонент, содержащий программный модуль. Если эту процедуру выполнять по шагам, то сможем наблюдать следующее. На первом этапе мы видим в окне редактора Visual Basic, как создается программный модуль и в него записывается текст макроса (рис, 10.17).
Рис. 10.17* Создан модуль и записан текст макроса
Далее, вызывается метод Execute кнопки, с которой связан макрос, м выполняется программа на Visual Basic, записанная в программном модуле (рис. 10.18).
После выполнения удаляются созданные элементы управления и профамМ' ный модуль с текстом подпрограммы на Visual Basic (рис. 10.19).
Рис. 10.18* Макрос запущен на выполнение
Рис. 10.19* Макрос выполнен, элементы управления и программный модуль удалены
Коллекция диалогов
Рассмотрим еще один тип элементов управления в приложении Word —— элементы, собранные в коллекцию Dialogs. У этой коллекции не очень много свойств. Нас интересуют два из них — количество элементов коллекции (свойство Count) и набор элементов коллекции Item(i:integer), где i — индекс диалога (диалогового окна) в коллекции. Чтобы ознакомиться со всем списком и значениями индексов и аргументов диалогов, достаточно обратиться к нужной странице справочной системы Word. Здесь мы рассмотрим только общие принципы вызова диалогов Word из программ, разработанных в среде Delphi, и несколько примеров использования диалогов. У каждого диалога есть методы и свойства. Есть общие свойства диалогов и свойства, присущие каждому отдельному диалогу. Например: свойство typeiinteger — тип диалога (это свойство совпадает с индексом диалога в коллекции и есть у каждого диалога); свойство Nameistring — принадлежит диалогу, тип которого определяется константой wdDialogFileSaveAs, и не может принадлежать диалогу типа wdDialogConnect. Это нетрудно проверить — достаточно попытаться использовать свойство Name для диалога второго типа — сразу возникнет ошибка выполнения. Для каждого диалога есть четыре метода, предназначенных для запуска или отображения диалогового окна. Рассмотрим их.
Метод Execute выполняет действия, связанные с диалогом, но без отображения самого диалога. Например, вызвав этот метод для диалога wdDialogFileOpen, можно открыть файл так же, как с помощью метода Open коллекции Documents. Вот пример процедуры.
Открытие файла без отображения диалогового окна
procedure TForml,ButtonllClick(Sender: TObject);
var msdialog:variant;
begin
msdialog: =W. Dialogs. Item (wdDia log Fil eOpen);
msdialog•Name:^inputbox t'Введите имя файла•「I '* ・ doc*);
msdialog.Execute;
end;
Метод Show отображает диалог, выполняет заданные в нем действия и возвращает значение, связанное с нажатием кнопок диалога.
Метод Display отображает диалог, но не выполняет заданные в нем действия н возвращает значение, связанное с нажатием кнопок диалога. Возвращаемые значения: 一2 — была нажата кнопка Закрыть; -1 — была нажата кнопка ОК; 0 — была нажата кнопка Пропустить; > 0 — была нажата кнопка 1, 2,.. диалога.
Метод update вызывается для гарантирован ной установки значений элементов диалога. Перед вызовом диалога или по окончании внзова мы можем установить значения некоторых визуальных элементов диалога или получить их значения, введенные или измененные пользователем- В качестве примера рассмотрим следующую процедуру и результат ее выполнения. Данный пример можно использовать, когда требуется задать в качестве имени файла определенное значение, отличное от значения по умолчанию.
Пример изменения значения элемента диалога до его выполнения
procedure TForml.Buttonl5Click(Sender: TObject);
var myDialog_: variant;
begin
myDialog_:=W. Dialogs * Item {wdDialogFi leSaveAs);
myDialog_.Name: =1 Подставляем свое имя файла1;
myDialog」Display;
end;
Результат выполнения данной процедуры представлен на рис. 10*20.
Из уже пройденных материалов нетрудно оделать вывод, что при умелом использовании можно с легкостью превратить приложение Word в инструмент для подготовки различных отчетных форм и использовать это в ваших приложениях, разрабатываемых в среде Delphi. Положительной особенностью здесь является тот факт, что при переходе от одной версии MS Word к другой не требуется вносить в разрабатываемые приложения какие-либо изменения, потому что новые версии MS Office поддерживают работу функций, используемых в предыдущих версиях. Для практики программирования панели в приложении Word немного изменим рассмотренный ранее пример.
ГПЯ1
司倒倒当匠画标I si
_J9301IS520 (4 20905561)
ZjlCQLDte
2_|My eBook$
二 J My Music
JJPalm
_J Pocket _PC My Documents -□proxy
JProxyl
细鼻файла:
Mi файла:
Сохранение документа
Папке: ^23 Мои документы
Рис. 10.20. Управление диалоговым окном
|документ Word
Пример программирования панели
Изменим процедуру формирования платежного поручения, рассмотренную ранее. В данном примере мы дополнительно отключим все стандартные панели Word, блокируем доступ пользователя к изменению содержания документа и создадим пользовательскую панель, на которой разместим кнопки сохранения документа, выполнения печати и изменения масштаба отображения документа в окне Word.
procedure TForml.Buttonl4Click(Sender: TObject); var a_:integer;
CoinmandBar_: variant;
msbootom_:variant;
begin
// Отключаем панели
for a_:=l to W. CcunmandBars. Count do
W.CommandBars• Item[a_].Enabled:=false;
// Создаем новый документ на основе шаблона
W・ documents.Add(ExtractFileDir(Application.ExeName) +
'\Шаблон платежного поручения.dotr);
// Подставляем текст
FindAndlnsertf###^ П・П・&1'1');
FindAndlnsert('###Дата&',datetostr(date));
FindAndlnsert('###Вид платежам1r * почтой,);
FindAndlnsert(1###Сумма прописью&1,'Двести пятьдесят рублей сорок ,+ * копеек');
FindAndlnsert (^ttttCyMMa&S *250,40t);
FindAndlnsert('###ИНН плательщика&'J0000000000,);
FindAndlnsert('###КПП плательщика&','000000000011 *);
FindAndlnsert(1# ##Плательщик&1,* ЗАО Селена *);
FindAndlnsert('###P/C FindAndlnsert(* ###БИК FindAndlnsert(1###K/C FindAndlnsert(1###ИНН FindAndlnsert(1###КПП FindAndlnsert('###БИК FindAndlnse rt(1###K/C FindAndlnsert(* ###P/CFindAndlnsert('###P/C FindAndlnsert(* ###БИК FindAndlnsert(1###K/C FindAndlnsert(1###ИНН FindAndlnsert(1###КПП FindAndlnsert('###БИК FindAndlnse rt(1###K/C FindAndlnsert(* ###P/Cплательщика&','00000000000000000000 *);
FindAndlnsert('###P/C FindAndlnsert(* ###БИК FindAndlnsert(1###K/C FindAndlnsert(1###ИНН FindAndlnsert(1###КПП FindAndlnsert('###БИК FindAndlnse rt(1###K/C FindAndlnsert(* ###P/C
FindAndlnsert('###P/C FindAndlnsert(* ###БИК FindAndlnsert(1###K/C FindAndlnsert(1###ИНН FindAndlnsert(1###КПП FindAndlnsert('###БИК FindAndlnse rt(1###K/C FindAndlnsert(* ###P/C
плательщика& *,* 000000 *);
плателыцика& *,1000000000000000000001);
получателяй1,* 1111111111');
получателя&1,* 1111111111001);
получателя&','111111');
получателя&1,111111111111111111111');
получателям \ 111111111111111111111 *);
FindAndlnsert(1###Получатель& *,'ЗАО Комета,);
FindAndlnsert ('###В.О.& \ * •);
Fin 必ndlnsetj『###H*U.&'J ');
FindAndlnsert(' ##学Код&3 ' *);
FindAndInsert(,###C.n.&,< 1 Ч;
FindAnd工nsert「###О.П. &「');
FindAndlnsert (,###Р.П. &,「');
Finctodlnsert (■ #H1 G I '');
FindAndlnsertГ #H2& О
FindAndlnsert {『#H3 & I j );
FindAndlnsert (* 斗 H4 & I;
FindAridlnsert (1 #H5&','');
FindAndlnsert (' #H6& 'JU;
FindAndlnsert (1 #H7 i1, * 4 ;
FindAndlnsert(1###Назначение платежа& r,'Оплата за поставку товара1);
/ / Блокируем возможность изменения документа поль зов ат ел ем
W. Active Document. Protect (Password: = '1, NoReset: ^False, Type:二wdAIlowOnlyFonnFields};
/ / Создаем временную неперемещаемую панель
CornmandBa 工一 :=W. CommandBar s ・ Add (' Печ ать документ а *, msoBa rT op, False, True);
CommandBar_. Enabled:2^ rue;
CoraniandBa r__. Vis ible:=true;
CommandBar_. Protection: =msoBarNcMove;
// Создаем кнопки на панели
for з_:=3 to 7 do begirt
try
msbootom_: =CommandBar_,Controls .Add (Type: ==msoControIButton, ID: ^inttostr (a_));
msbootom_.Caption: = * ID='+inttostr (己_); except end;
end;
end;
Результат выполнения процедуры представлен на рис. 10,21. После печати и закрытия документа необходимо восстановить прежний вид панелей. Это нетрудно сделать, используя методы программирования панелей н макросов.
Мы рассмотрели возможности объекта Word.Applicaiion, обеспечивающие формирование документов Word. Конечно, это далеко не все его возможности, но даже они позволяют создавать документ Word посредством приложений, разработанных в среде Delphi. Далее рассмотрены аналогичные возможности использования объекта Excel.Application в приложениях Delphi.
Рис. 10.21. Пользовательская настройка приложения Word для печати документа
ЧАСТЬ III
Разработка документови приложений MS Excel в Delphi
Глава 11. Работа с объектом ExceLApplication
Глава 12. Работа с ячейками
Глава 13. Работа с объектами в книге Excel
Глава 14. Диаграммы в рабочей книге Excel
Глава 15. Печать
Глава 16. Программирование свойств MS Excel
ГЛАВА 1 1
Работа с объектом
Excel.Application
В первой части книги мы рассмотрели в общих чертах объектную модель приложения MS Excel, В первую очередь эта модель интересует нас как средство работы с рабочими книгами Excel, которые также представляют собой объекты и являются составной частью объектной модели приложения. Как было показано в первой части книги, доступ к объектам MS Excel, к открытым книгам и всем компонентам любой книги производится через корневой объект Application. Доступ к этому объекту в приложениях Delphi можно получить с помощью функции CreateOleObject, которая возвращает ссылку на объект Application, а единственным ее аргументом является строковый идентификатор 'Excel.Application:
В этой главе рассмотрены следующие темы:
создание объекта Excel.Application, запуск и визуализация окна приложения;
口 создание рабочей книги;
создание рабочей книги на основе шаблона;
открытие существующей рабочей книги;
口 доступ к рабочей книге;
сохранение рабочей книги;
настройка окон рабочей книги;
口 работа с листами рабочей книги;
чтение и запись информации в ячейки листа рабочей книги.
Создание объекта Excel.Application, запуск и визуализация окна приложения
Запуск приложения Excel производится непосредственно при вызове функции CreateOIeObjecl, входящей в состав стандартной библиотеки ComObj.pas.
7 Зак. 723
Функция возвращает ссылку на объект, представляюший собой переменную типа variant. Рассмотрим следующий программный код.
;Создание объекта Excel.Application
uses ComObj;
E:variant;
procedure TForml.ButtonlClick(Sender: TObject);
begin
E: =Create01e0bject ('Excel. Application'); end;
Результатом выполнения данной процедуры будет запуск приложения Excel на выполнение. Вы можете обнаружить это, просмотрев список задан, запушенных на выполнение в операционной системе. Но для того чтобы убедиться, что приложение запущено, можно и не обращаться к списку выполняющихся задач. Можно просто сделать объект Excel видимым. Для этого используем свойство Visible объекта Application. Если это свойство установить в значение True, то окно приложения Excel тут же отобразится на эк^ ране. Манипулируя со свойством Visible, мы можем скрывать окно приложения или отображать его на экране.
( Примечание )
Для ускорения формирования готового документа лучше» чтобы приложение было запущено в фоновом режиме, т. е, его окно не должно отображаться. Напротив, если требуется отследить ход формирования рабочей книги по шагам, то необходимо включить режим отображения (при Visible=True).
Рассмотрим следующую процедуру.
;Отображение окна приложения Excel
procedure TForml.CheekBoxlClick(Sender: TObject);
begin
E.Visible:=CheckBoxl.Checked;
end;
На рис. 1L1 представлено окно Excel, отображенное на экране монитора, как результат выполнения приведенной процедуры.
Как видно из рис. 11.1, вновь созданный и запущенный экземпляр приложения Excel не содержит нн одной рабочей книги. Все рабочие книги, которые в данный момент могут быть активны или принадлежать объекту Application (переменная Е), являются при надлежностью коллекции Work Books, которая в свою очередь принадлежит корневому объекту. Свойство Count:inleger коллекции WorkBooks содержит количество открытых рабочих книг (в нашем случае Count =0). Если мы создаем новую рабочую или
открываем ранее сохраненную книгу, то значение Count увеличивается, если закрываем, то уменьшается каждый раз на единицу.
Далее мы рассмотрим некоторые свойства и методы этой коллекции.
Рис. 11.1. Отображение окна приложения Excel на экране задается флажком Визуализация Excel
Создание рабочей книги
Метод Add коллекции Work Books позволяет создать новую рабочую книгу. При этом если аргументом метода будет строка, указывающая на файл шаблона, то новая книга будет создана на основе этого шаблона. Если аргументов нет, то будет создана обычная книга в режиме "по умолчанию". Создадим новую книгу в режиме по умолчанию с помощью следующей процедуры.
Создание рабочей книги по умолчанию
procedure TForml*Button4Click(Sender: TObject); begin
E.WorkBooks.Add;
end;
Результат выполнения данной процедуры представлен на рис. 11.2. Создана обычная рабочая книга.
Рис. 112 Создаем рабочую книгу Ппо умолчанию"
После того как мы создали новую рабочую книгу, значение свойства Count коллекции Workbooks увеличилось на единицу, а объект Item(l) содержит ссылку на созданную рабочую книгу.
Создание рабочей книги на основе шаблона
Создадим рабочую книгу по шаблону с помощью метода Add, в качестве аргумента которого используем или целочисленную константу, или строку, указывающую на файл шаблона. В качестве примера рассмотрим следующие процедуры, созданные в среде Delphi. В первом случае аргументом метода Add служит константа, в результате чего создается лист с диаграммой, во втором случае в качестве шаблона используем один из стандартных шаблонов MS Office.
J"1叶" "З“……"二界制/[.:[,.,""".…"…二:丁—l,,":.嘱"墨Т货t
:Создание рабочей книги на основе шаблона
procedure TFoml * Button5Click (Sender: TObj ect >;
const xlWBATChart ^-410 9;
begin
E .Workbooks.add(xlWBATChart);
end;
procedure TForml.Button5click(Sender: TObject);
begin
if not OpenDialogl.Execute then exit;
E.Workbooks.add(OpenDialogl.FileName);
end;
При выполнении второй процедуры нужно выбрать в специальном окне (рис. 11.3) файл с расширением XLT из стандартной поставки MS Office.
Новая рабочая книга будет создана на основе выбранного шаблона (рис. 11.4).
HOHO倒知昼]画画倒知昼]画画[.Сокрыть ]Отмена I *[.Сокрыть ]Отмена I *Открытие Флйла
HO
HO
倒知昼]画画
倒知昼]画画
[.Сокрыть ]
Отмена I *
[.Сокрыть ]
Отмена I *
曰 Решения▼:
mWmW~国 Писк 3.5 囿 J
mW
mW
@ Main (С:)
口 Program Fites
口 MictowIL OfficeО Шаблоны
О ©J
11^ Файла: |Счет
Тип файлов |й!аб工 Excei
Рис. 1U. Выбираем шаблон для создания книги
Открытие
существующей рабочей книги Excel
Использование методов коллекции Work Books позволяет не только создавать, но н открывать имеющиеся рабочие книги, которые хранятся в файлах. Для этих целей предназначены методы Open и OpenText. Первый метод открывает файл формата XLS, а второй —— обычные текстовые файлы. Для простоты используем метод Open с одним аргументом — строкой-указателем на файл. Вот текст процедуры Delphi, использующей метод Open.
Рис. 11.4. Рабочая книга, созданная по шаблону
;Открытие существующей рабочей книги Excel
procedure TForml* Button?Click(Sender: TObj ect); begin
if not OpenDialog2.Execute then exit;
E.WorkBooks.Open(OpenDialog2.Filename); end;
Полная спецификация вызова метода Open представлена в справочной сис* теме MS Excel и имеет следующий вид:
OpenfFileName, UpdateLinks r Readonly, Format, Password, WriteResPassword, IgnoreReadOnlyRecommended, Origin, Delimiter, Editable, Notify, Converter, AddToMRU);
Обязательным является первый аргумент. Для задания специфических режимов открытия файла можно использовать н другие аргументы. Их список и краткое назначение приведены в табл. ПЛ.
Таблица 77.1. Аргументы метода Open
Имя
Тип
Назначение
FileName
String
Имя файла
UpdateLinks
Integer
Режим обновления ссылок в рабочей книге
Readonly
Boolean
True — открыть в режиме "только для чте- нмя"
Format
Integer
Формат открытия текстовых файлов
Password
String
Пароль, если книга была сохранена с установкой пароля
WriteResPassword
String
Пароль, необходимый для сохранения изменений, если он был задан ранее
IgnoreReadOnlyRecommended
Boolean
True— отключение сообщения о том, что файл открывается в режиме "только для чтения", если он был сохранен в режиме "только для чтения"
Origin
Integer
Кодировка для открываемого текстового файла
Delimiter
Integer
Код сим вола- раздел ител я ячеек таблицы (при открытии текстового файла)
Editable
Boolean
Дополнительный режим при открытии Excel файлов более ранних версий, чем версия 5.0
Notify
Boolean
Если была попытка открыть файл в режиме чтение/запись, но в этот момент времени это было невозможно, то при значении True этого аргумента приложение получит уведомление. когда файл станет доступен. Если значение аргумента False или опущено. и файл занят, то попытки открыть его для чтения/записи обречены на неудачу
Converter
Integer
Индекс конвертора, используемого при открытии файла
AddToMRU
Boolean
True— имя открываемого файла добавляется в список недавно открытых файлов меню Файл
При открытии рабочей книги можно использовать любую комбинацию аргументов метода Open. Например, чтобы открыть файл в режиме "только для чтенияг,, изменим представленный выше пример процедуры и представим его в следующем виде.
\ Открытие рабочей книги в режиме “только для чтения"
procedure TForml.Button7Click(Sender: TObject);
begin
if not 0penDialog2,Execute then exit;
E.WorkBooks. Open (Fi 1 eName:^ 0penDialog2. FileName, Readonly:-True); end;
Доступ к рабочей книге
После того как мы открыли и создали несколько рабочих книг в приложении Excel, можно перейти к анализу содержимого коллекции WorkBooks. Объекты ltem(i:integer) содержат ссылки на все рабочие книги коллекции WorkBooks (i:integer — индекс книги в коллекции). В качестве аргумента при обращении к Item может выступать и строковая переменная, содержащая имя книги. Свойство Count коллекции содержит количество открытых документов коллекции. Используя зти свойства коллекции, мы можем вывести список всех рабочих книг и перейти к работе с любой из них. Для этого рассмотрим следующие процедуры.
;Получение списка рабочих книг и ссылки на выбранную рабочую книгу
procedure TOKBottomDlg2.FormCreate(Sender: TObject);
var a__: integer;
begin
WorkBooks: =FQrml. E. WorkBooks;
for a_:=l to WorkBooks. count do begin
ListBoxl. Items .Add (WorkBooks »Item[a_] .name+
1; ' +Workbooks. Item [ a_] . FullName);
end;
end;
procedure TOKBottomD1g2.ListBoxlClick(Sender: TObject); begin
WorkBooks. item[ListBoxl.Itemlndex+l] .Activate;
WorkBook: =WorkBooks. item [ListBoxl, Iteinlndex+l]; end;
С помощью этих процедур мы можем вывести список всех рабочих книг и отобразить их имена в объекте List Box (список). Затем, перебирая содержимое списка, активируем любую из открытых рабочих книг и получаем ссылку на нее для последующего доступа к этой рабочей книги (рис. 11.5).
:фдйп П*3 Зш Усте* 中!5fHiг £%»нс Ц***<« М« 2
Q自0昌口中х Чйа</■** "外3 助■用]迎_,о;
МННРКУРЗКСПМННРКУРЗКСПММ>УЙСУС»«СПММ>УЙСУС»«СПММИ^СУРСЭ^СГвЧММИ^СУРСЭ^СГвЧсжс НКТЕМЕМШИсжс НКТЕМЕМШИ|Сл»»со» о«>с»4Ti“ ©Менн rum,|Сл»»со» о«>с»4Ti“ ©Менн rum,t[j*«,aT, к>*<»1t[j*«,aT, к>*<»1Рис. 11.5. Выбираем рабочую книгу в спискеРис. 11.5. Выбираем рабочую книгу в спискеЗ?зб.э9救З?зб.э9救河圆制к^.к河圆制к^.кТЦП-11Л1 kpg Ц#0тн*| К|1луст・ с К(ргофйо<м(св*С)ТЦП-11Л1 kpg Ц#0тн*| К|1луст・ с К(ргофйо<м(св*С)通工吐工也一^й^^У^^о&мичный tcfweejltOip . 1Я1 YiTtft8c至嶋1,冊h">0<6屮3(c84Bjijflip. 214 Tpmjgl 短.r^iPOIW [小 M酶][磅е通工吐工也一^й^^У^^о&мичный tcfweejltOip . 1Я1 YiTtft8c至嶋1,冊h">0<6屮3(c84Bjijflip. 214 Tpmjgl 短.r^iPOIW [小 M酶][磅еБЛ IkkTot 匚5 ЯСтмо-Четмм ic 5 Met) 1901PБЛ IkkTot 匚5 ЯСтмо-Четмм ic 5 Met) 1901PТлТог См Я9ло»*« • и>ге«>««с*ым Мекера (е а м«е)ТлТог См Я9ло»*« • и>ге«>««с*ым Мекера (е а м«е)ТМГУТЕ Гкр1 Чьим и Киртофонвм 1工马 **вс] *ДОгТМГУТЕ Гкр1 Чьим и Киртофонвм 1工马 **вс] *ДОгT*rfГе1П п^吧тЬ■吧[Яе吧叩工子史吧е 4 5 |^三竺竺ТИП-ТСЛ ГЪвас №■« f с Э wc) gT*rfГе1П п^吧тЬ■吧[Яе吧叩工子史吧е 4 5 |^三竺竺ТИП-ТСЛ ГЪвас №■« f с Э wc) g4 > ,|%5Л1/4 > ,|%5Л1/?m%Ti3ftCQit №ЮччО * UJHWtrMiQIbM бк«мрй К 8 мес| за ж中叮"怨寸?m%Ti3ftCQit №ЮччО * UJHWtrMiQIbM бк«мрй К 8 мес| за ж中叮"怨寸I屮・1Ч*・ Кяпуста с «ммофягиы ( е Б мк1I屮・1Ч*・ Кяпуста с «ммофягиы ( е Б мк1
МННРКУРЗКСП
МННРКУРЗКСП
ММ>УЙСУС»«СП
ММ>УЙСУС»«СП
ММИ^СУРСЭ^СГвЧ
ММИ^СУРСЭ^СГвЧ
сжс НКТЕМЕМШИ
сжс НКТЕМЕМШИ
|Сл»»со» о«>с»4Ti“ ©Менн rum,
|Сл»»со» о«>с»4Ti“ ©Менн rum,
t[j*«,aT, к>*<»1
t[j*«,aT, к>*<»1
Рис. 11.5. Выбираем рабочую книгу в списке
Рис. 11.5. Выбираем рабочую книгу в списке
З?зб.э9救
З?зб.э9救
河圆制к^.к
河圆制к^.к
ТЦП-11Л1 kpg Ц#0тн*| К|1луст・ с К(ргофйо<м(св*С)
ТЦП-11Л1 kpg Ц#0тн*| К|1луст・ с К(ргофйо<м(св*С)
通工吐工也一^й^^У^^о&мичный tcfweejltOip . 1Я1 YiTtft8c至嶋1,冊h">0<6屮3(c84Bjijflip. 214 Tpmjgl 短.r^iPOIW [小 M酶][磅е
通工吐工也一^й^^У^^о&мичный tcfweejltOip . 1Я1 YiTtft8c至嶋1,冊h">0<6屮3(c84Bjijflip. 214 Tpmjgl 短.r^iPOIW [小 M酶][磅е
БЛ IkkTot 匚5 ЯСтмо-Четмм ic 5 Met) 1901P
БЛ IkkTot 匚5 ЯСтмо-Четмм ic 5 Met) 1901P
ТлТог См Я9ло»*« • и>ге«>««с*ым Мекера (е а м«е)
ТлТог См Я9ло»*« • и>ге«>««с*ым Мекера (е а м«е)
ТМГУТЕ Гкр1 Чьим и Киртофонвм 1工马 **вс] *ДОг
ТМГУТЕ Гкр1 Чьим и Киртофонвм 1工马 **вс] *ДОг
T*rfГе1П п^吧тЬ■吧[Яе吧叩工子史吧е 4 5 |^三竺竺
ТИП-ТСЛ ГЪвас №■« f с Э wc) g
T*rfГе1П п^吧тЬ■吧[Яе吧叩工子史吧е 4 5 |^三竺竺
ТИП-ТСЛ ГЪвас №■« f с Э wc) g
4 > ,|%5Л1/
4 > ,|%5Л1/
?m%Ti3ftCQit №ЮччО * UJHWtrMiQIbM бк«мрй К 8 мес| за ж中叮"怨寸
?m%Ti3ftCQit №ЮччО * UJHWtrMiQIbM бк«мрй К 8 мес| за ж中叮"怨寸
I屮・1Ч*・ Кяпуста с «ммофягиы ( е Б мк1
I屮・1Ч*・ Кяпуста с «ммофягиы ( е Б мк1
Для активизации рабочей книги из списка открытых используем метод Activate объекта Item(i:integer), где i ——индекс открытой рабочей книги, а объект Item(i:integer) представляет собой ссылку на рабочую книгу.
Сохранение рабочей книги
После того как рабочая книга выбрана, мы можем ее редактировать, сохранить под прежним или другим именем и закрыть. Для этого используем методы Save, SaveAs и Close.
Сохранение рабочей книги
procedure TOKBottomDlg2,Button2Click(Sender: TObject); begin
WorkBook・ Save;
end;
procedure TOKBottomDlg2.Button3Click(Sender: TObject); begin
if not SaveDialogl.Execute then exit;
WorkBook.SaveAs(SaveDialogl.FileName); end;
Метод SaveAs должен применяться, как минимум, с одним обязательным аргументом — именем файла, но может быть применен с несколькими аргументами, определяющими режим сохранения файла (табл. 11.2). Спецификация вызова метода приведена в справке по Visual Basic и имеет вид:
SaveAs (Filename, FileFormat, Password, WriteResPassword,
ReadOn1yRecommended, CreateBackup, AddToMru, TextCodePage # TextVisualLayout);
Таблица 7 7.2 Аргументы метода SaveAs
Имя
Тип
Назначение
1 FileName
String
Имя файла
FileFormat
Integer
Формат сохраняемого файла
Password
String
Пароль, который будет использоваться для открытия сохраненной рабочей книги
WriteResPassword
String
Пароль, который будет использоваться для записи изменений в открытую для редактирования рабочую книгу
ReadOnlyRecommended
Boolean
True — при открытии книги отображается сообща* ни© о том, что файл может быть открыт только в режиме "для чтения"
CreateBackup
Boolean
True — создать резервный файл
AccessMode
Integer
Режим доступа к файлу
ContlictResolution
Integer
Реакция приложения на конфликт при записи книги
AddToMRU
Boolean
True — добавить имя записываемого файла в список недавно открытых файлов меню Файл
TextCodePage
Не используется
TextVisualLayout
Не используется
После того как рабочая книга сохранена, можно закрыть ее, лля этого используем метод Close объекта WorkBook. Для того чтобы закрыть сразу все открытые книги, используем метод Close коллекции WorkBooks. Перед тем как закрыть рабочую книгу, нелишне проверить — сохранена она или нет. Для этого используем свойство Saved объекта WorkBook. Значение Saved=True означает, что со времени последнего сохранения рабочая книга
не была изменена, т. е. сохранять ее не нужно. В следующем примере мы проверяем, есть или нет изменения в книге, а затем закрываем ее.
;Проверка сохранения рабочей книги и ее закрытие
procedure TOKBottomDlg2.Button5Click(Sender: TObject); begin
if Workbook.Saved
then mes sagebox (handle, * Документ ' + ' сохранен! I ' Внимание • *, 0)
else messagebox (handle, Документ не *+ * сохранен ",‘Внимание!", 0); end;
procedure TOKBottomDlg2.Button6Click(Sender: TObject);
begin
Workbook.Close;
end;
Результат выполнения первой процедуры представлен на рис. 11.6.
Рис. 11.6. Проверяем факт записи рабочей книги на диск
Мы научились открывать рабочую книгу, сохранять ее и закрывать. Но перед тем, как сохранять, бывает нужно внести некоторые изменения. Это мы и рассмотрим далее.
Настройка окон рабочей книги
Процессор электронных таблиц Excel ——замечательный инструмент для табличного представления данных и их обработки. Главной особенностью такой обработки является гибкое применение формул или целых подпрограмм. Причем такой обработке можно подвергнуть как отдельные ячейки, так и целые массивы данных. При зтом немаловажным остается удобство ввода и отображения информации для пользователя. Рассмотрим одну особенность рабочих книг MS Excel, которая и служит для этого.
Любую рабочую книгу можно отобразить в виде окна, даже не одного окна, а двух и более окон. Для того чтобы добавить новое окно рабочей книги, используем метод NewWindow объекта WorkBook. Вот процедура, позволяющая добавить новое окно для уже открытой рабочей книги.
;Добавление нового окна для открытой рабочей книги
procedure TOKBottamDlg2.ButtonlClick{Sender: TObject);
begin
WorkBook.NewWindow; end;
После выполнения данной процедуры будет отображено сразу два окна для одной и той же рабочей книги. При этом нетрудно заметить, что изменения в первом окне тут же отображаются во втором, и наоборот. Если открыто более одного окна рабочей книги, то эти окна можно разместить в определенном порядке, используя заданные стили ——в виде мозаики, каскадом, расположив в главном окне приложения равномерно по горизонтали или по вертикали. Дополнительно к этому можно синхронизировать перемещения в окнах как по горизонтали или по вертикали, так и в обоих направлениях. Для этого предназначен метод Arrange коллекции Windows. Рассмотрим следующий пример, реализованный в виде процедуры.
;Размещение окон по вертикали и их полная синхронизация
procedure SetArrangewindows;
const xlArrangeStyleVertical=-4166;
begin
with OKBottomDlg2 do begin
Workbook.Windows.Arrange(ArrangeStyle:= xlArrangeStyleVertical, ActiveWorkbook:=True,SyncHorizontal:=True,SyncVertical:^True); end;
end;
Результат выполнения процедуры представлен на рис. IL7.
(史айл 0p4»u god &e恥r Bfift^ £>рпк Qmm 02 ?
’口后0 a a у x Чй ®<? *总工儿кХ他•马 恒:®'
Л.:., .A 3 ■奉導雷国* ,我再#注..小.A.
Jl<i6e6Hri>te*o*«tiJJl<i6e6Hri>te*o*«tiJ2М15 "АЗО^* Гкре Ябяжа Hitypaii^н>е (с Змм?.| JU3r 12“ Ti^Tan Сш ЯВтчнсмв|^<|мМшА 1£ fi М№) 1бОф2М15 "АЗО^* Гкре Ябяжа Hitypaii^н>е (с Змм?.| JU3r 12“ Ti^Tan Сш ЯВтчнсмв|^<|мМшА 1£ fi М№) 1бОфТ Wfl-TCri П0*м Ц»・ЕН КвЛуС'* С КвОТвФв»!《€ • У}2*0 ТИПкТОП Пеоа М“ с Картофелем ie В мес'НЗОг.Т Wfl-TCri П0*м Ц»・ЕН КвЛуС'* С КвОТвФв»!《€ • У}2*0 ТИПкТОП Пеоа М“ с Картофелем ie В мес'НЗОг.1g Tui.ToiCk Я5я»д~Ежеви*~№1м (с 5 мес) ]9(hp 疗Л [yijonfo 干яоч-КлуОачный (с С нас J,90 軍 Л Л 1и1-Тяп Сек Перси! «4 мое) 196单1g Tui.ToiCk Я5я»д~Ежеви*~№1м (с 5 мес) ]9(hp 疗Л [yijonfo 干яоч-КлуОачный (с С нас J,90 軍 Л Л 1и1-Тяп Сек Перси! «4 мое) 196单tiff 1«J«tiff 1«J«Cnwrw ЕН (ИЛ НН (МбЕМН к»Cnwrw ЕН (ИЛ НН (МбЕМН к»Ry %」h丽77Ry %」h丽77ТИП-fОППоя Тм*4, №псжо, АЛрмрс с 5 ывс 3, №1иГОПур>ГР¥”(С*5”6ЭтТИП-fОППоя Тм*4, №псжо, АЛрмрс с 5 ывс 3, №1иГОПур>ГР¥”(С*5”6ЭтТкиТоп Cm R&ngtfcJi Bfcaaap. ftr 3 Migj ]9O*pГнО-Тсп CM ири.ОССшМй iC 4м^С J 190фTwr-Jon Сл fftniFwi Mcf ях*йй (с $ им) f9Dll> fmJg с<ж Ябмчо - цмкммяфвый М*с<|М К В м*с)ТкиТоп Cm R&ngtfcJi Bfcaaap. ftr 3 Migj ]9O*pГнО-Тсп CM ири.ОССшМй iC 4м^С J 190фTwr-Jon Сл fftniFwi Mcf ях*йй (с $ им) f9Dll> fmJg с<ж Ябмчо - цмкммяфвый М*с<|М К В м*с)17».迎«1可17».迎«1可1ИП-ТСП tbofM Z・・ с Ка^лофслвы (c 5 мес) 18№ Tiunjon Rope h*u% 段 E,峙弊單匸 $ *c 岬 1ИП-ТСП r^qpt r^v*fe( c 3 Meet l63t1ИП-ТСП tbofM Z・・ с Ка^лофслвы (c 5 мес) 18№ Tiunjon Rope h*u% 段 E,峙弊單匸 $ *c 岬 1ИП-ТСП r^qpt r^v*fe( c 3 Meet l63tRftiiartaegtiteHotirorfH •]RftiiartaegtiteHotirorfH •]Р ЕупсН«№1лг* "痴褐Р ЕупсН«№1лг* "痴褐Si,70aWf«re€yPC3KCreiSi,70aWf«re€yPC3KCrei
Jl<i6e6Hri>te*o*«tiJ
Jl<i6e6Hri>te*o*«tiJ
2М15 "АЗО^* Гкре Ябяжа Hitypaii^н>е (с Змм?.| JU3r 12“ Ti^Tan Сш ЯВтчнсмв|^<|мМшА 1£ fi М№) 1бОф
2М15 "АЗО^* Гкре Ябяжа Hitypaii^н>е (с Змм?.| JU3r 12“ Ti^Tan Сш ЯВтчнсмв|^<|мМшА 1£ fi М№) 1бОф
Т Wfl-TCri П0*м Ц»・ЕН КвЛуС'* С КвОТвФв»!《€ • У}
2*0 ТИПкТОП Пеоа М“ с Картофелем ie В мес'НЗОг.
Т Wfl-TCri П0*м Ц»・ЕН КвЛуС'* С КвОТвФв»!《€ • У}
2*0 ТИПкТОП Пеоа М“ с Картофелем ie В мес'НЗОг.
1g Tui.ToiCk Я5я»д~Ежеви*~№1м (с 5 мес) ]9(hp 疗Л [yijonfo 干яоч-КлуОачный (с С нас J,90 軍 Л Л 1и1-Тяп Сек Перси! «4 мое) 196单
1g Tui.ToiCk Я5я»д~Ежеви*~№1м (с 5 мес) ]9(hp 疗Л [yijonfo 干яоч-КлуОачный (с С нас J,90 軍 Л Л 1и1-Тяп Сек Перси! «4 мое) 196单
tiff 1«J«
tiff 1«J«
Cnwrw ЕН (ИЛ НН (МбЕМН к»
Cnwrw ЕН (ИЛ НН (МбЕМН к»
Ry %」h丽77
Ry %」h丽77
ТИП-fОППоя Тм*4, №псжо, АЛрмрс с 5 ывс 3, №1иГОПур>ГР¥”(С*5”6Эт
ТИП-fОППоя Тм*4, №псжо, АЛрмрс с 5 ывс 3, №1иГОПур>ГР¥”(С*5”6Эт
ТкиТоп Cm R&ngtfcJi Bfcaaap. ftr 3 Migj ]9O*p
ГнО-Тсп CM ири.ОССшМй iC 4м^С J 190ф
Twr-Jon Сл fftniFwi Mcf ях*йй (с $ им) f9Dll> fmJg с<ж Ябмчо - цмкммяфвый М*с<|М К В м*с)
ТкиТоп Cm R&ngtfcJi Bfcaaap. ftr 3 Migj ]9O*p
ГнО-Тсп CM ири.ОССшМй iC 4м^С J 190ф
Twr-Jon Сл fftniFwi Mcf ях*йй (с $ им) f9Dll> fmJg с<ж Ябмчо - цмкммяфвый М*с<|М К В м*с)
17».迎«1可
17».迎«1可
1ИП-ТСП tbofM Z・・ с Ка^лофслвы (c 5 мес) 18№ Tiunjon Rope h*u% 段 E,峙弊單匸 $ *c 岬 1ИП-ТСП r^qpt r^v*fe( c 3 Meet l63t
1ИП-ТСП tbofM Z・・ с Ка^лофслвы (c 5 мес) 18№ Tiunjon Rope h*u% 段 E,峙弊單匸 $ *c 岬 1ИП-ТСП r^qpt r^v*fe( c 3 Meet l63t
RftiiartaegtiteHotirorfH •]
RftiiartaegtiteHotirorfH •]
Р ЕупсН«№1лг* "痴褐
Р ЕупсН«№1лг* "痴褐
Si,70aWf«re€yPC3KCrei
Si,70aWf«re€yPC3KCrei
Рис. 11.7. Вертикальное размещение двух окон рабочей книги
В данном примере рабочая книга состоит из одного листа, но в большинстве случаев рабочая книга может содержать гораздо больше листов. Обычно по умолчанию при создании книги она уже содержит три листа. Поэтому для записи или чтения информации с листа необходимо сначала выбрать его. В следующем разделе мы рассмотрим, как это делается.
Работа с листами рабочей книги
Лист, ячейки которого непосредственно хранят информацию, является принадлежностью книги. В рабочей книги может быть больше одного листа. Как получить доступ к списку листов или к любому листу рабочей книги? Ответ: с помощью коллекции Sheets, Как н любая коллекция, она содержит
свойство Count:integer (количество элементов коллекции) и набор объектов kem(i:integer) — собственно листы, где i — индекс выбранного листа (от 1 до Count). Некоторые методы коллекции Sheets: Select — выделение всех листов рабочей книги, Сору — копирование всех листов в новую рабочую кннгу, Print Preview — предварительный просмотр печати, Printout — вывод на печать, Add — добавление нового листа в рабочую книгу.
Рассмотрим метод Add подробнее. Его можно использовать как без аргументов, так и с аргументами, определяющими место, куда будут добавлены листы (лист), их количество и тип. Если использовать метод Add так, как показано в следующем примере, то будет добавлен лист перед листом Sheet.
j Добавление нового листа перед указанным листом рабочей книги
procedure T0KBottomDlg3.ButtonlClick(Sender: TObject); begin
Sheets.Add (Before:-Sheet);
end;
Добавив листы или просто открыв или создав рабочую книгу, мы можем получить список листов и доступ к любому листу рабочей книги. Для этого используем уже известные свойства коллекции Sheets.
j Получение списка листов рабочей кнм「м
procedure T0KBQttQWDlg3.FormCreate(Sender: TObject);
var a_:integer;
begin
for a_:=l to Sheets .count do Lis tBoxl. Items. Add l Sheets. Item [a_] *nawe); end;
Результат выполнения процедуры представлен на рис. 11.8.
После загрузки списка листов мы можем получить доступ к любому листу для работы с ним. Для начала попробуем изменить непосредственно свой' ства самого листа, например его имя. Имя листа представляет собой строку и содержится в свойстве Name объекта Sheet, Доступ к листу рабочей книги получим, например, с помощью следующей процедуры.
;Получение доступа к листу рабочей книги
var Sheet:va riant;
procedure TOKBottomDlg3.ListBoxlClick(Sender: TObject); begin
Sheet :=Sheets. item[ListBox.l. It^ulndex+l];
end;
*s】;一,「. . - -^^^' ^: :$ ^^^а^ш^ж1*^^-.~/2其*f 加WA M 售Gd 呼〜"£ёреис举)~ 02 ?-「 二 1 」白1其I胆石0毋区齿閣鶏晦岁 •事奪*心外■匂豊存‘餐丁亘1恒可一_互" 一 "9 卡■■回图父,溯/3炽*-"®•a・1■*s】;一,「. . - -^^^' ^: :$ ^^^а^ш^ж1*^^-.~/2其*f 加WA M 售Gd 呼〜"£ёреис举)~ 02 ?-「 二 1 」白1其I胆石0毋区齿閣鶏晦岁 •事奪*心外■匂豊存‘餐丁亘1恒可一_互" 一 "9 卡■■回图父,溯/3炽*-"®•a・1■Рис. 11,8. Список листов рабочей книгиРис. 11,8. Список листов рабочей книгийш^йш^^名謂^名謂
*s】;一,「. . - -^^^' ^: :$ ^^^а^ш^ж1*^^-.~
/2其*f 加WA M 售Gd 呼〜"£ёреис举)~ 02 ?-「 二 1 」白1其I
胆石0毋区齿閣鶏晦岁 •事奪*心外■匂豊存‘餐丁亘
1恒可一_互" 一 "9 卡■■回图父,溯/3炽*-"®•a・
1■
*s】;一,「. . - -^^^' ^: :$ ^^^а^ш^ж1*^^-.~
/2其*f 加WA M 售Gd 呼〜"£ёреис举)~ 02 ?-「 二 1 」白1其I
胆石0毋区齿閣鶏晦岁 •事奪*心外■匂豊存‘餐丁亘
1恒可一_互" 一 "9 卡■■回图父,溯/3炽*-"®•a・
1■
Рис. 11,8. Список листов рабочей книги
Рис. 11,8. Список листов рабочей книги
йш^
йш^
^名謂
^名謂
Для того чтобы переименовать выбранный рабочий лист, запишем в свойство Name новое значение имени листа, например:
Sheet. Name : = ' ЛистЗ';
Результат такого преобразования представлен на рис. 11.9*
Мы можем скопировать лист и его содержание с помощью метода Сору объекта Sheet. Этот метод позволяет копировать лист и вставлять копию или до или после оригинала — это зависит от значения аргумента метода Сору. Вот пример использования этого метода в процедурах, разработанных в среде Delphi,
Копирование листа рабочей книги и вставка его копии до и после оригинала
procedure TOKBottomDlg3.Button5Click(Sender: TObject); begin
Sheet.Copy(before:^Sheet);
end;
procedure T0KBottcmDlg3*Button4Click(Sender: TObject); begin Sheet.Copy(after:=Sheet); end;
ХЧЙЧ^А*! ftcd ¥""":'「1『「1 -
:七JfMd 住曲*м fiiu 8GH 中*цм 5да« Двнчыв flw J
j 口田0g®>*电匣。也吿ё石"*独♦刁厘:©.
P Пм»М|Т*ЛпрЯГ*0 £об>мй*Пяреичяммип-Сййздц»Л1ХНя .mcr-a плел IСдмт> катни а«г& дз 1У«а*шP Пм»М|Т*ЛпрЯГ*0 £об>мй*Пяреичяммип-Сййздц»Л1ХНя .mcr-a плел IСдмт> катни а«г& дз 1У«а*шм/£ 4 fa图即第.奪置魂卑. ・ a 一 A ,
P Пм»М|Т*ЛпрЯГ*0 £об>мй*
Пяреичяммип-
Сййздц»Л1ХНя .mcr-a плел I
Сдмт> катни а«г& дз 1
У«а*ш
P Пм»М|Т*ЛпрЯГ*0 £об>мй*
Пяреичяммип-
Сййздц»Л1ХНя .mcr-a плел I
Сдмт> катни а«г& дз 1
У«а*ш
Рис. 11.9. Переименование листа рабочей книги
Результат выполнения этих процедур может быть таким, как показано на рис. II .10, при этом копируется не только содержание листа, но и все его настройки.
После работы с книгой может понадобиться удалить некоторые листы. Для этого предназначен метод Delete объекта Sheet. Если попытаться с его помощью удалить выбранный лист, то приложение выведет на экран сообщение (рис. 11.11).
Блокировать данное сообщение и другие сообщения приложения позволяет следующий оператор:
Е • DisplayAlerts: =False;
Следующая процедура удаляет лист, подавив предупреждающие сообщения приложения»
j力 *Z" Qimoui Вна Всг^вва 牛c^r Op®« Д*г». :£ke £
!山處、@0?温电电.・,•■工4効m秋■刁口蔬二②,
I e jfyr,1. ж л S ■■-ЙЗ 困% .у 毒綱偉「祈・d・
;一一 d . 一一У^"“
Рис. 11.10. Создание копии листа рабочей книги
|?7а西|30|31衣力|34g血
MiciD$uft Excel
Отменить удаление виде пенных листов будет не—жно.
,* \ • Чтобы удалить пикты.! нажмите кнопку "ОК*1.
• Чтобы отменить удалая, нажьмте толку "Отмеиа".
II отиена
Рис. 11.11. Окно подтверждения /даления листа
Удаление листа рабочей книги
procedure ТОКВо11omDlg3•Button2Click《Sender: TObject); begin
E•DisplayAlerts:=False;
Sheet.Delete;
E.DisplayAlerts:=True;
end;
После того как мы открыли рабочую книгу и выбрали необходимый лист, можно перейти к чтению или записи информации.
Чтение и запись информации ячейки листа рабочей книги
Для доступа к ячейкам можно использовать два разных объекта —— объект типа Range, который ассоциируется с областью ячеек, или непосредственно объект Cell (ячейка листа рабочей книги). Если первый объект удобен для работы с целыми областями ячеек, то второй больше подходит для работы с отдельно взятой ячейкой. Эти объекты принадлежат объекту ”月нет" и требуют задания координат ячейки или области ячеек при обращении к ним. Например, для задания объекта, ассоциированного с областью ячеек AI:D5, используем следующий оператор:
MyRange: =Sheet.Range [A1:D5];
где Sheet — ссылка на лист рабочей книги. После удачного выполнения данного оператора переменная MyRange:variant содержит ссылку на объект, ассоциированный с выбранной областью ячеек. Другой вариант данного оператора:
MyRange:= Е.Sheets.Item(l).Range('Al:D51);
Здесь мы получаем ссылку на область ячеек первого листа рабочей книги. Обеспечить доступ к отдельной ячейке можно с помощью как объекта Range, так и объекта Cell. Использование последнего в операторе получения доступа к ячейке может выглядеть так:
MyCell:=Sheet.Cells[1,1];
При выполнении данного оператора переменная MyCell будет хранить ссылку на ячейку AL
Итак, мы получили доступ к ячейкам. Попробуем записать в них информацию из приложения на Delphi.
:Запись информации в ячейки листа рабочей книги
procedure T0KBottomDlg4.ButtonlClick(Sender: TObject); var a_:integer;
begin
randomize;
for a_:=l to 100 do Sheet.Cells{a_f1):=random{10000); end;
В данном примере переменная Sheet содержит ссылку на лист рабочей книги (эта переменная была инициализирована ранее). Полный исходный текст приложения находится на сопроводительном диске книги. Результат выполнения процедуры представлен на рис. 11.12.
Рис. 11.12, Запись случайных чисел в ячейки листа рабочей книги Excel
Если для записи в ячейки мы присваивали объекту Cells(row, column) значение, то для чтения данных используем оператор, в котором строковой переменной присваивается значение объекта Cells(row? column). В качестве примера импортируем значения ячеек рабочей книги, запишем их значения в объект ListBoxl и отобразим в форме.
:Чтение информации листа рабочей книги Excel
procedure T0KBottomDlg4,Button2Click(Sender: TObject);
var eee_:string;
a_:integer;
begin
ListBoxl. Items. Clear;
for a_:=l to 100 do begin
eee_^Sheet. Cells [a_, 1];
ListBoxl»Items .Add (eee_);
end;
end;
Результат чтения данных представлен на рис. 11.13.
Рис. 11.13. Чтение информации листа рабочей книги Excel
В приведенных примерах для записи данных в ячейку мы присваивали значения непосредственно объекту Cells() или Range(). Эти данные распознавались как значения ячеек и отображались на листе. Но ячейки могут иметь разные типы. Например, они могут содержать как целые значения, так и формулы. Для чтения или записи значений используются, например, свойства Value и Text ячейки, для записи формулы ——свойство Formula.
Изменим наши процедуры записи и чтения значений ячеек.
Использование свойств Value и Text ячейки для записи и чтения ее значения
procedure TOKBottomDlg4.ButtonlClick(Sender: TObject);
var a:integer;
begin
randomize;
for a_:=l to 100 do Sheet.Cells(a__, 1),Value:=random(10000);
end;
procedure TOKBottomDlg4 *Button2Click(Sender: TObject);
var eee_:string;
a :integer;
begin
ListBox 1. Items. Clear;
for a_:=l to 100 do begin
eee_:=Sheet.Cells[a_, 1].Text;
ListBoxl * Items >Add(eee_);
end; end;
Ячейка или область представляет собой объект. Этот объект описывает не только значение, хранящееся и отображаемое в ячейке, но и другие ее параметры. Остальные свойства ячейки, которые будут рассмотрены в следующей главе, определяют способ отображения информации.
ГЛАВА 12ГЛАВА 12
ГЛАВА 12
ГЛАВА 12
Работа с ячейками
Основа ввода и отображения информации в рабочих книгах Excel — работа с ячейками листа. Каждая ячейка представляет собой объект со множеством свойств, необходимых для отображения информации. Ячейка ——прямоугольная область, имеющая определенные координаты в границах листа. Эти координаты могут выражаться как в буквенно-цифровом формате, так и в цифровом формате в виде номеров столбца и строки, пересечение которых и образует ячейку. Основным свойством каждой ячейки является ее содержание, или иначе отображаемое значение. Но часто бывает недостаточно просто отобразить какое-либо значение, будь то строка или число, поэтому для лучшего восприятия информации используется такое понятие, как способ отображения. На способ отображения влияют такие факторы, как формат представления, различные способы размещения значения относительно границ ячейки, шрифт, толщина н цвет линий границ а также цвет и стиль заливки ячейки. Для доступа ко всем свойствам и содержимому ячеек в Excel используются два объекта — Range и Cells. Между ними есть только одно отличие — первый объект обеспечивает доступ к области ячеек, а второй ——только к одной ячейке. В конце предыдущей главы мы рассмотрели пример использования этих объектов для обмена информацией между приложением Delphi и рабочей книгой Excel, в настоящей главе рассмотрим работу с ячейками как с объектами, позволяющими представлять информацию в удобном для пользователя виде.
Объекты Range и Cells
Объекты Range w Cells обеспечивают доступ к выбранным ячейкам листа рабочей книги. По сути. Range и Cells представляют собой методы, возвращающие ссылку на объект-ячейку (или на область), но для понимания
можно ассоциировать их с объектами. Для задания адреса ячеек, на которые мы хотим получить ссылку, используем аргументы этих методов. Для Range аргументом является строка адреса, а для Cells — номера строки и столбца. Так, например, для получения ссылки на объект-область можно использовать следующий оператор:
MyRange: =Е. ActiveSheet. Range [' В2'];
Оператор с использованием объекта Cells:
MyRanga:=Е. ActiveSheet.Cells (2,2];
После того как определен объект (ячейка или область ячеек), с ним можно работать.
Чтение и запись значений ячеек; очистка ячеек
Переменная, которую отображает ячейка, хранится в свойствах Text и Value объекта Range (Cells), поэтому для того чтобы ее получить, достаточно прочитать значение одного из этих свойств. Если тип данных (формат) значения ячейки неизвестен, используем свойство Text, чтобы получить его в виде строки. Когда тип данных известен, можно попытаться использовать свойство Value.
Допустим, нам неизвестен тип данных ячейки. Используем следующую процедуру, которая позволяет прочитать ее значение.
Чтение значения ячейки
Используя данную процедуру, запишем строку символов Ч 111111Г в ячейку В2. Результат представлен на рис. 12.1. Такой же результат можно получить, используя объект Cells:
Cell .Value: =^value2.Text;
И в этом случае записанные в ячейку символы отображаются как строка.
Рис. 12.1. Запись строки в ячейку
Для того чтобы записать значение в числовом формате, достаточно немного изменить процедуру и записывать в свойство Value не строковую переменную, а переменную типа Integer или Currency, как это показано на следующем примере.
Запись числового значения в ячейку
procedure T0KBottamDlg2.Button3Cliuk(Sender: TObject);
begin
Range.Value:^strtocurr{valuel* Text); end;
Результат выполнения процедуры представлен на рис, 12.2* В данном случае объект Range автоматически определил тип записываемого значения и отобразил его соответствующим образом, изменив формат ячейки.
Рис. 12.2. Запись числа в ячейку
Если требуется отобразить записываемое значение в виде даты, то в свойство Value мы должны записать переменную, которая имеет в разрабатываемом приложении Delphi тип TDaie.
Рис, 12.3. Запись даты в ячейку
Соответственно результат будет выглядеть, как показано на рнс. 123
Мы выяснили следующий факт: свойство Value объекта Range, имеющее тип variant, допускает запись данных разного типа, “то позволяет изменить формат ячейки в дальнейшем.
Это утверждение относится не только к объекту Range, но и к объекту Cells, т. к. они оба представляют собой ссылку на ячейку (или область). Но независимо от того, какой тип имело записанное в ячейку значение, мы можем изменить формат ячейки в любой момент.
Формат отображения данных ячейки
Формат ячейки определяется свойством NumberFormat объекта Range. Это свойство имеет строковый тип, а форматы данных представляют собой определенным образом заданные символьные константы. Используя свойство NumberFormat, можно изменить формат любой ячейки или области, а также прочитать значение формата с целью его анализа для внесения изменений.
Определим формат ячейки, которая содержит дату. Для этого воспользуемся представленной ниже процедурой, записанной для приложения Delphi (см. приложение на сопроводительном диске книги).
формат этой ячейки, чтобы отобразить год в четырехзначном формате с помощью следующей процедуры.
Изменение формата ячейки
— 2 34..'5 67iw一13.114一— 2 34..'5 67iw一13.114一0 口0 口30.04,200430.04,2004Рис. 12*5. Изменяем формат представления даты для выбранной ячейкиРис. 12*5. Изменяем формат представления даты для выбранной ячейкиРис, 12,6. Задание пользовательского формата для выбранной ячейкиРис, 12,6. Задание пользовательского формата для выбранной ячейки
— 2 34..'5 67iw一13.114一
— 2 34..'5 67iw一13.114一
0 口
0 口
30.04,2004
30.04,2004
Рис. 12*5. Изменяем формат представления даты для выбранной ячейки
Рис. 12*5. Изменяем формат представления даты для выбранной ячейки
Рис, 12,6. Задание пользовательского формата для выбранной ячейки
Рис, 12,6. Задание пользовательского формата для выбранной ячейки
сказывают опыт и интуиция. Например, зададим формат в виде строки символов 'ООО 000 000 000'. В результате значение ячейки будет отображено как целое число, разбитое на разряды (рис. 12.6)*
87:I*艺1D7
~07Й4.Й34 '"
23
Формулы
Мы рассмотрели способы записи значения ячейки из приложений Delphi, но ячейка и сама может принимать любое значение» когда она содержит формулу. Формула представляет собой некое математическое выражение, состоящее из констант, адресов ячеек, стандартных функций Excel, пользовательских функций и математических символов, записанных в виде строки. Для придания ячейке таких свойств используют запись строки, представляющей формулу, в свойство Formula объекта Range. Для чтения формулы также используется свойство Formula.
Зададим для выбранной ячейки ее формулу с помощью следующей процедуры.
;Запись формулы
procedure TOKBottomDlg2.ButtonsClick(Sender: TObject); begin
Range. Formula: =valuel.Text; end;
В ячейку B7 запишем формулу, позволяющую вычислить конечную дату, просуммировав начальную дату и количество дней. Формула представляет собой выражение =А1+А2. Результат выполнения этой процедуры представлен на рис. 12.7.
Есть и другой способ, который требует определенных знаний от пользователя, но в некоторых условиях быть более эффективным. Этот способ основан на использовании мастера функций, представляющего собой последовательность диалоговых окон, которые позволяют конструировать формулу для данной ячейки по шагам. Для активизации данного способа необходимо вызвать метод FunctionWizard объекта Range. Рассмотрим следующую про- целуру, которую можно использовать для конструирования формулы.
Вызов мастера функций
procedure TOKBOttomDlg2.ButtonlOClick(Sender: TObject); begin
Range. Functionwizard;
end;
Вызов этой процедуры, содержащей только оператор активизации метода FunctionWizard, повлечет запуск диалогового окна (рис. 12.8)* После выполнения всех необходимых шагов в ячейке Range будет записана формула.
X Mi^OsnN I .«;td - %";;-,」
%球1吧,
|1勺史由" правкае也8G第& Формат 口吃优 9 总Q ;昌&学X电IS D s , …心* ж /с Я Ж
,11-._-一!一■_2^一一 .
В7 2J ■ i =A1 +A2 F I в;~c
Панина 0кн。
暮塞雷雷
6
E卉以"&货初3% % J鏘照串串一:3
「盛
• A
~"~'~F~'~G"
21222324252627
H
Рис. 12.7. Запись формулы в выбранную ячейку
Рис. 12.8. Окно мастера функций
Иногда требуется проверить, что находится в ячейке — значение, записанное пользователем, или сформированное в результате выполнения формулы. Для этого можно анализировать содержимое свойства Formula объекта Range, но лучше использовать свойство HasFormula. Если оно имеет значение True, то ячейка содержит формулу, если False — то нет.
;Проверка наличия формулы в ячейке
procedure T0KBottomDlg2.ButtonlClick(Sender: TC&iject); begin
if Range. HasFormula
then messagebox(handle,'Данная ячейка содержит формулу!',1Внимание!’,0) else messagebox (handle, 1 Данная ячейка не содержит форелулу 11,
1 Внимание!',0) end;
В нашем примере ячейка В! содержит формулу — это можно определить с помощью представленной процедуры, результат выполнения которой показан на рис* 12.9.
Рис. 12.9. Проверка наличия формулы в ячейке
Определив, что нужная ячейка содержит формулу, мы можем прочитать эту формулу с целью корректировки или анализа ее содержимого. Процедура чтения формулы может быть такой.
[Чтение формулы
procedure TOKBottomDlg2. ButtonSClick (Sender: TObj ect}; begin
valuel・ Text:-Range.Formula;
end;
Запись и чтение комментариев
Еще одним важным свойством, которым обладает ячейка листа рабочей книги Excel, является комментарий. Смысл использования комментария очевиден. Его можно записать индивидуально для каждой ячейки, он не отображается в печатной форме и служит только для описания содержимого ячеек. В одну ячейку можно записать один комментарий. Программно комментарий представляет собой объект Comment, принадлежащий ячейке. Для того чтобы изменить комментарий, необходимо очистить ячейку от старого комментария, а затем записать новый. Прочитать комментарий, записанный в данную ячейку, позволяет свойство Text объекта Comment.
Запишем, а затем прочтем комментарий для любой ячейки листа рабочей книги. Для этого используем следующие процедуры.
;Запись и чтение комментария
procedure TOKBottomDlg2.Button6Click(Sender: TObject);
begin
Range.ClearComments;
Range.AddComment(valuel.Text); end;
procedure TOKBottomDlg2.Button?Click(Sender: TCfoject);
begin
valuel.Text:=Range.Comment.Text; end;
Результат выполнения представленных процедур показан на рис. 12.10.
Мы рассмотрели некоторые действия с одной выбранной ячейкой с применением объектов Range и Cells. Результаты при использовании любого из этих объектов полностью идентичны. Но если требуется воздействие на область, нам придется использовать объект Range. Аргументом данного объекта может быть адрес одной ячейки или прямоугольной области из нескольких ячеек.
Область (интервал ячеек)
Попробуем задать координаты области и поработать с ними. В первую очередь нас могут заинтересовать такие параметры этой области, как количество ячеек и ее реальный адрес на листе рабочей книги Excel* Во-вторых, нам будет полезно узнать, как изменить, скопировать или очистить содержание ячеек этой области.
Рис. 12.10. Запись и чтение комментария для ячейки
Рассмотрим в качестве примера следующие процедуры (см. приложение на сопроводительном диске книги).
Параметры области, заполнение ячеек области
procedure TOKBottomDlg3・ addresExit(Sendeг: TObject); begin
// Определяем ссылку на область
Range: =forml. E. ActiveSheet. Range [addres. Text ];
count.Text:=inttostr(Range * Count); // Количество ячеек в области area__addres.Text:=Range.Address;// Реальный адрес области
end;
procedure TOKBottcanDlg3.ButtonlClick(Sender: TObject);
begin
// Вьзделяем область
Range. Select;
end;
8 Зак 723
procedure TOKBottomDlg3.Button3Click(Sender: TObject); begin // Очищаем область Range.Clear;
end;
procedure TOKBottomDlgS.Button2Click(Sender: TObject); begin // Заполняем ячейки выбранной области Range* Value:=taxtl.Text;
end;
Результат выполнения процедуры заполнения ячеек области представлен на рис. 12.1 L
Рис. 12*11. Заполнение ячеек области
К области можно применять почти все методы, которые мы применяли к одной ячейке. Есть и дополнительные возможности, присущие области. Важной особенностью является использование виртуального адреса внутри заданной области. Это означает, что внутри области можно задавать адреса, начиная с адреса А1 для верхней левой ячейки области. Эта замечательная особенность обусловлена тем, что объект Range включает в себя такой же по характеристикам дочерний объект Range. Первая ячейка дочернего объ-
екта имеет виртуальный адрес AI, а ее реальный адрес совпадает с адресом начала области. Это может избавить программиста от многих проблем, связанных с адресацией ячеек, и существенно упростить исходный текст программы. Например, зададим адрес и размер области 'B5:F151 Получим ссылку на нее:
Range: =Е, Active Sheet. RangeВ5: F工 5'];
После этого определим дочернюю область, принадлежащую заданной области. Для этого используем оператор:
MyRange :=Range [ fAl :В2 1 ];
Область MyRange принадлежит области Range и находится в ее начале. Далее заполним ячейки области MyRange строкой символов, например:
MyRange.Value:=т222';
Все эта манипуляции можно выполнить иначе (см* следующую процедуру).
procedure TOKBottomDlg3.Button4Click(Sender: TObject);
begin
Range.Range[addresl*Text].Value:=text2.Text; end;
Результат будет таким же (рис. 12.12).
Мы рассмотрели случаи, когда область задается программным путем посредством адресов. Но часто пользователь просто выделяет область ячеек, а затем выполняет с ней поеледовательность каких-либо действий. Программист Delphi, разрабатывая свое приложение, должен учесть этот случай и обработать выделенную часть листа рабочей книги Excel. Одним из свойств объекта Application является объект Selection, который обладает множеством свойств и методов, присущих визуальным компонентам Excel, в том числе некоторыми свойствами объекта Range, позволяющими обеспечить доступ к выделенной области. В общем случае для обеспечения доступа к выделенным ячейкам можно воспользоваться оператором
Range:=Е.Selection;
который присваивает переменной Range значение ссылки на область выделенных ячеек. После этого программист может воздействовать на эту область.
Есть к другой способ обращения к выделенной области ——без использования промежуточных ссылочных переменных. Можно напрямую применять
к объекту Selection методы н использовать свойства объекта Range, но только когда выделена хотя бы одна ячейка. Следующие процедуры демонстрируют это.
А8СDEF@н[JкLРаЛота с обп^сттпнн ншкзк222企111"1111111111Область ячеек ° бласть в области | В ь«елв1«ый,依,222就2111111111111111111111111111111111111Ш13*wm область ■ области |А1 82111111111111111111111111111111111U111111111111111Абсоч0THM]叨 рео области11111111111111111111111111111111111111111111111111Псйготовмм текст для млнсн |2221Ш1111111111111111111111111111111丨 1111Ш11111111111111111111111П1111111Выремп» 1 Когмроодгь |1111111111111111111111111Вставить 1DK 1А8СDEF@н[JкLРаЛота с обп^сттпнн ншкзк222企111"1111111111Область ячеек ° бласть в области | В ь«елв1«ый,依,222就2111111111111111111111111111111111111Ш13*wm область ■ области |А1 82111111111111111111111111111111111U111111111111111Абсоч0THM]叨 рео области11111111111111111111111111111111111111111111111111Псйготовмм текст для млнсн |2221Ш1111111111111111111111111111111丨 1111Ш11111111111111111111111П1111111Выремп» 1 Когмроодгь |1111111111111111111111111Вставить 1DK 1Рис. 12.12. Работа с виртуальной областьюРис. 12.12. Работа с виртуальной областью1011121314151617219泣&“『1011121314151617219泣&“『
А
8
С
D
E
F
@н[Jк
L
РаЛота с обп^сттпнн ншкзк
222
企
111"
11111
11111
Область ячеек ° бласть в области | В ь«елв1«ый,依,
222
就2
11111
11111
11111
11111
11111
11111
11111
1Ш1
3*wm область ■ области |А1 82
11111
11111
11111
11111
11111
11111
111U
11111
11111
11111
Абсоч0THM]叨 рео области
11111
11111
11111
11111
11111
11111
11111
11111
11111
11111
Псйготовмм текст для млнсн |222
1Ш1
11111
11111
11111
11111
11111
11111
丨 1111
Ш11
11111
11111
11111
11111
1П11
11111
Выремп» 1 Когмроодгь |
11111
11111
11111
11111
11111
Вставить 1
DK 1
А
8
С
D
E
F
@н[Jк
L
РаЛота с обп^сттпнн ншкзк
222
企
111"
11111
11111
Область ячеек ° бласть в области | В ь«елв1«ый,依,
222
就2
11111
11111
11111
11111
11111
11111
11111
1Ш1
3*wm область ■ области |А1 82
11111
11111
11111
11111
11111
11111
111U
11111
11111
11111
Абсоч0THM]叨 рео области
11111
11111
11111
11111
11111
11111
11111
11111
11111
11111
Псйготовмм текст для млнсн |222
1Ш1
11111
11111
11111
11111
11111
11111
丨 1111
Ш11
11111
11111
11111
11111
1П11
11111
Выремп» 1 Когмроодгь |
11111
11111
11111
11111
11111
Вставить 1
DK 1
Рис. 12.12. Работа с виртуальной областью
Рис. 12.12. Работа с виртуальной областью
1011121314151617219泣&“『
1011121314151617219泣&“『
Определение адреса и заполнение выделенной области
procedure TOKBottamDlg3,ButtonllClick(Sender: TObject); begin
addresses.Text:=E.Selection«Address;
end;
procedure TOKBottoinDlg3.Buttonl2Click(Sender: TObject);
begin
E. Selection. Value: =text_s. Text;
end;
На рис. 12.13 представлена форма приложения Delphi, в которой используются представленные процедуры, определяющие адрес выделенной области и заполняющие все ее ячейки значением, выбранным пользователем этого приложения^
X Mmojoft IxceJ • Кянга1X Mmojoft IxceJ • Кянга1\治一史頑с 口收蹤小 Ем Встаем 中。РИ^ £арвис Дйькыа £кно ?:□田口昌及у7 电噴0 - 嘍П工舟4I аю •乃叱一阕А » C,r。1U ・ *附《整,更图®% ■温每(工求_•办-冬■—丄寸一 二\治一史頑с 口收蹤小 Ем Встаем 中。РИ^ £арвис Дйькыа £кно ?:□田口昌及у7 电噴0 - 嘍П工舟4I аю •乃叱一阕А » C,r。1U ・ *附《整,更图®% ■温每(工求_•办-冬■—丄寸一 二
X Mmojoft IxceJ • Кянга1
X Mmojoft IxceJ • Кянга1
\治一史頑с 口收蹤小 Ем Встаем 中。РИ^ £арвис Дйькыа £кно ?
:□田口昌及у7 电噴0 - 嘍П工舟4I аю •乃叱一阕
А » C,r。1U ・ *附《整,更图®% ■温每(工求_•办-冬■
—丄寸一 二
\治一史頑с 口收蹤小 Ем Встаем 中。РИ^ £арвис Дйькыа £кно ?
:□田口昌及у7 电噴0 - 嘍П工舟4I аю •乃叱一阕
А » C,r。1U ・ *附《整,更图®% ■温每(工求_•办-冬■
—丄寸一 二
Когда требуется программно выделить интервал ячеек листа Excel, используют метод Select объекта Range. После этого можно обращаться к ячейкам уже как к выделенной области, используя объект Selection,
Обычно к выделенной области применяют методы, позволяющие копировать ее содержимое в буфер обмена (метод Сору), млн, реже, методы, по- зволяютне переместить (метод Cut) содержимое в другую область или приложение или документ. Вьшеленную область ячеек можно также заменить информацией из буфера обмена (метод PasteSpecial). Все эти методы но пользуются, как правило, применительно к объекту Selection, но иногда бывает необходимо применить их непосредственно к ячейкам или областям ячеек, используя объект Range. Все зависит от конкретной постановки задачи и от стиля программирования.
Программное выделение и очистка области
procedure ТОКВо11omDlд3.ButtonlClick(Sender: TObject); begin
Range.Select;
end;
procedure TOI<BottomDlg3.Buttonl3Click(Sender: TObject); begin
E.Selection.Clear;
к другим объек* получена ссылка свойством Count свойством Countк другим объек* получена ссылка свойством Count свойством Countend;
к другим объек* получена ссылка свойством Count свойством Count
к другим объек* получена ссылка свойством Count свойством Count
От объектов, описывающих ячейки и области, перейдем там — столбцам и строкам. Если задана область ячеек и Range на нее, то количество столбцов будет определяться коллекции Columns объекта Range, а количество строк —
коллекции Rows объекта Range. Доступ ко всем строкам и столбцам листа рабочей книги предоставляют коллекции Rows и Columns объекта ActiveSheet — активного листа рабочей книги. Следующие процедуры позволяют, соответственно, определить количество строк и столбцов, очистить ячейки в выбранных столбцах и строках и заполнить их.
Очистка и заполнение ячеек строк и столбцов листа рабочей книгиОчистка и заполнение ячеек строк и столбцов листа рабочей книги
Очистка и заполнение ячеек строк и столбцов листа рабочей книги
Очистка и заполнение ячеек строк и столбцов листа рабочей книги
procedure T0KBottomDlg3.FonnCreate(Sender: TObject);
begin
row_ount. text: =inttostr (fcnnl. E. Application. ActiveSheet. Rows. Count);
col_ount.text:=inttostr(forml.E.Application.ActiveSheet.Columns.Count); end;
procedure TOKBottomDlg3.Button7Click(Sender: TObject);
begin
E. ActiveSheet.Rows [Row. Value] .Clear;
E, ActiveSheet.Rows[Row.Value].Value:= texture.Text; end;
procedure TOKBottomDlg3.ButtonBClick(Sender: TObject); begin
E.ActiveSheet.Columns [Col,Value].Clear;
E,ActiveSheet.Columns(Col.Value].Value:= text_rc.Text; end;
На рис. 12Л4 показан результат выполнения представленных процедур.
Вырезание, вставка и удаление ячейки
Мы рассмотрели только манипуляции с содержимым ячеек, при этом сами ячейки оставались неизменными, т. е. их другие характеристики не менялись. Если бы ячейка имела заливку и линии границы, то изменение или даже полная очистка ее содержимого не повлияла бы на ее другие визуаль-
为史《Йп 口раем Вид Всгдвка 中opj:)ar Сервис Ааммыо 口кмо 2
i:D更旦]■■ *学^ ^<t- 'iJj* *: E舟 小h他•书 心…[
FM3• ■ K 9,*11窗、而,羽窓 审年,一 . & .A
農,
111
111
111
111
111'
111
111
111
111
111
111
111
111
Е
1П
111
111
111
111
111
二;
111:
111
Рис. 12.14. Работа со
строками и столбцами ячеек
А
141S16171819冗2122Й24Я
ные характеристики ——они остались бы неизменными. Радикальный способ, позволяющий полностью изменить ячейку по определенному адресу,—— это удаление ячейки или вставка на ее место другой. При этой манипуляции происходит смещение остальных ячеек к началу или к концу в зависимости от выбранной операции над ячейками. Для удаления ячейки предназначен метод Delete объекта Range, а для вставки — метод Insert объекта Range. Оба метода могут быть вызваны с аргументом. При удалении аргумент метода Delete определяет, какая ячейка из столбца или строки будет замещать удаленную ячейку. При вставке новой ячейки аргумент метода Insert определяет, какие ячейки будут сдвинуты ——ячейки прилегающего столбца или строки. Методы Delete и Insert можно применять не только к отдельным ячейкам, но и к группе ячеек, а также к строкам и столбцам ячеек.
Рассмотрим, как используются эти методы в приложениях Delphi. На рис. 12.15 представлен фрагмент листа рабочей книги Ecxel, в ячейках которого записаны некоторые числовые константы. Требуется вставить новые четыре ячейки в область А1:В2. Используем метод Insert без аргументов. По умолчанию, при вставке ячеек сдвигаются ячейки, расположенные ниже вставляемой области. Используем следующую процедуру.
Рис. 12.15. Фрагмент листа рабочей книги
Вставка новых ячеек
procedure ТОКВо11amDlg4.ButtonlClick(Sender: TObject); begin
Forml.E»Application.Range [address.Text ]. Insert;
end;
Если задать адрес объекта Range в виде строки *А1:В2', то мы получим результат, показанный на рис. 12.16. Как видно из рис. 12.16, ячейки области А1:В2 были смещены вниз на две строки, а на их место вставлены новые, пустые. Если до вызова метода Insert был вызван метод Сору, или буфер обмена уже содержал скопированную ранее информацию (т. е* в буфере уже находились ячейки), то их содержимое будет вставлено в область А1:В2 на место смещенных ячеек.
Рис. 12.1& Вставка новых ячеек
Поиск и замена текста
Методы поиска и замены текста очень важны при использовании шаблонов документов. В прошлых главах мы рассмотрели, как с помощью поиска и замены в шаблонах документов для Word получить метод быстрой и гибкой подготовки документов. В рабочих книгах Excel также нет смысла отказываться от этой возможности, поэтому сейчас мы ее и рассмотрим.
Поиск текста выполняется путем вызова метода Find. В самом простом случае метод Find должен содержать один аргумент —— искомый текст. Если
требуется уточнить режим поиска, то используются дополнительные необязательные аргументы этого метода, которые позволяют определить направление поиска, область поиска и другие параметры. Метод Find возвращает ссылку на ячейку, если поиск прошел удачно, иначе возвращается ссылка на пустой объект. Рассмотрим, как можно реализовать поиск в приложениях Delphi.
Поиск текста на листе рабочей кннгн
二…“+“…:二 а—'…“》:』:..二】…二二 Му ….…………;:;.;..£;.“...二 :.:^...^.......^............^iwAJ..^,^
procedure TForml.Button6Click(Sender: TObject);
var eee_:string; FindRange:variant;
begin
eee_:=InputBox(*Поиск текста!',‘‘,■');
if eee_o*1 then begin
try
FindRange: =E, Cells. Find (What: Fee_);
eee_: = FindRange * text;
except
messagebox(handle, Искомый текст не найден!*,1Внимание!1,0);
end;
end;
end;
Используя представленную выше процедуру, зададим условия поиска (рис. 12.17).
Рис. 12.17. Задание условия поиска
Метод Find вернул ссылку на искомый объект. Если этот объект существует реально (в случае успешного поиска), то мы сможем прочитать содержимое ячейки, на которую указывает ссылка, и это не вызовет ошибку. Иначе возникнет исключительная ситуация, обработав которую мы выведем сообщение об отрицательном результате поиска (рис. 12Л8).
Рис. 12.18. Вывод результата поиска
Мы рассмотрели случай поиска на всем листе рабочей книги Excel Чтобы произвести поиск текста в ограниченной области ячеек, необходимо вн* звать метод Find объекта Range, где Range — область (интервал ячеек). Например:
FindRange:=RangefAl:Н50О1).Find('222');
В этом случае поиск будет выполнен только в области ячеек, ограниченной интервалом А1:Н500.
Полная спецификация вызова метода Find:
Find(What, After, Lookin, LookAt, Searchorder, SearchDirection, MatchCase, MatchByte);
Аргументы метода Find приведены в табл. 12丄
Таблица 12.1. Аргументы метода Find объекта Range
Аргумент
Тип
Значение
What
String
Строка поиска
After
Range
Ячейка или область, после которой производится поиск; позволяет задать адрес начала поиска
Lookln
Integer
Где ищем (в значениях ячейки, в формулах или в примечаниях)
LookAt
Integer
Поиск совпадения строки текста целиком или ее части
SearchOrder
Integer
Порядок поиска (перебираем строки или столбцы)
SearchDirection
Integer
Направление поиска (к началу, к концу)
MatchCase
Boolean
Учет регистра букв при поиске
MatchByte
Boolean
Предназначен для двухбайтовых символов (в версиях для Windows не используется)
После успешного поиска текста метод Find возвращает ссылку на объект- ячейку, используя который мы можем изменить содержание ячейки. Повторяя поиск н замену многократно, можно сформировать необходимый документ, но для этого есть более эффективный способ ——использование функции поиска и замены. Эта функция в Excel реализуется методом Replace, который имеет два обязательных аргумента —— искомый текст и текст для замены. В качестве примера использования этого метода рассмотрим еле* дующую процедуру.
:Поиск и замена текста
procedure TForml*Button7Click(Sender: TObject);
var eee__,uuu_: string;
begin
eee_: ^InputBox (1 Поиск текста!,,,,,,,);
uuu_:=InputBox (1 Замена на текст! 1, 1 ', 1 *);
if eee_<>"' then begin
try
range: =E.Cells.Replace (What: =eee_. Replacement: =nuu_);
except
messagebox (handle, ^скоьлый текст не на 必 ден!', ' Внимание! ', 0);
end;
end;
end;
В результате выполнения этой процедуры будет заменен текст, если условия поиска выполнены. Иначе будет сгенерирована исключительная ситуация, обработав которую мы выведем сообщение об ошибке и невозможности замены текста. Полная спецификация метода Replace:
Replace(What, Replacement, LookAt, SearchOrder, MatchCase, MatchByte);
Аргументы метода Replace приведены в табл. 122
Таблица 722 Аргументы метода Replace объекта Range
Аргумент
Тип
Значение
What
String
Строка поиска
Replacement
String
Строка замены
Look At
Integer
Поиск совпадения строки текста целиком или ее части
SearchOrder
Integer
Направление поиска (строки, столбцы)
MatchCase
Boolean
Учет регистра букв при поиске
MatchByte
Boolean
Предназначен для двухбайтовых символов (в версиях для Windows не используется)
Высота и ширина ячейки
От методов, позволяющих изменять значение ячеек листа рабочей книги Excel, переходим к изучению других свойств и методов основного объекта приложения Excel — ячейки. Начнем с простого —— с определения и изменения размеров самой ячейки» связанных с размерами строк н столбцов. Мы определились, что ячейка всегда определяется объектами Range или Cells. Используя свойства ColumnWidth и RowHeight этих объектов, мы имеем возможность изменить ширину и высоту ячейки. Очевидно, что эти изменения повлекут изменения ширины столбца и высоты строки. В качестве примера использования этих свойств рассмотрим процедуры, позволяющие определить и изменить размеры заданной ячейки.
;Определение и изменение размера ячейки
procedure TOKBottamDlgb,addresExit(Sender: TObject); begin
Range:=E.Activesheet.Range[addres.Text];
ColumnWidth * Text :=FloatToStr (Range. ColuinnWidtii);
RowHeight* Text:=FloatToStr(Range.RowHeight); end;
procedure TOKBottomDlg5.ColumnWidthChange(Sender: TObject); begin
Range.ColumnWidth:-StrToFloat(ColumnWidth.Text); end;
procedure TOKBottomDLg5.RowHeightChange {Sender; TObject); begin
Range.RowHeight:=StrToFloat(RowHeight.Text); end;
Результат выполнения этих процедур приведен на рис. 12.19.
Можно добавить, что если объект Range ассоциируется с областью ячеек, то действие данных процедур повлечет за собой изменение размеров всех ячеек этой области. Для изменения размеров строки (строк), столбца (столбцов) нужно записать новые значения в свойства RowHeight и ColumnWidth объектов Rows.Item(i:integer) и Columns.Item(i:integer) соответственно. Чтобы изменить высоту и ширину всех строк и столбцов ячеек, используйте свойства RowHeight н ColumnWidth коллекций строк и столбцов (Rows и Columns). С учетом этого несколько изменим единственный оператор в процедурах настройки высоты и ширины ячейки и получим следующий программный текст.
Рис. 12.19. Изменение размеров ячейки
;Изменение ширины и высоты ячейки
procedure TOKBottomDlg5.ColumnWidthChange(Sender: TObject); begin
Columns .Item (col) .Columnwidth: =St rToFloat (Columnwidth. Text); end;
procedure T0KBottomDlg5•RowHeightChange(Sender: TObject);
begin
Rows.Item(row).RowHeight:=StrToFloat(RowHeight・ Text); end;
Результаты выполнения этих и рассмотренных ранее процедур будут полностью идентичными (см. рис. 12.19). Различаются только исходные данные. В первом случае они определяются адресом ячейки, во втором ——номером строки и столбца.
Выравнивание текста в ячейке
Отображаемое значение можно разместить в ячейке Excel по-разному. Обычно способ размещения соответствует типу и величине значения ячейки. Для числовых данных текст смещен к правой границе» а для строковых —к левой границе ячейки, но бывают исключения. Исключения из правил определяются требованиями, предполагающими эффективное отображение информации для более полного ее восприятия. В таких случаях и используют свойства ячейки, позволяющие задать режимы горизонтального
и вертикального выравнивания, установить режимы переноса по словам и автоподбора ширины, а также выбрать угол поворота текста.
Рассмотрим эти свойства. Следующий программный код задает режимы горизонтального и вертикального выравнивания текста по центру.
tr........„..^.v.„,^^
;Выравнивание текста в ячейке
const
xlHAlignCenter = -4108;
xlVAlignCenter = -4108;
procedure TOKBottomDlg8.HorizontalAlignmentChange(Sender: TObject); begin
range.HorizontalAlignment:=xlHAlignCenter; end;
procedure TOKBott omDl g8. Ve rt i с a 1 Alignment Chang e (Sender: TObj ect}; begin
range .Vertica 1A1 ignment: ^x 1VA1 i gnCenter; end;
На рис. 12.20 представлен результат выравнивания текста по центру ячейки.
Рис. 12.20, Выравнивание текста в ячейке
Если длина текста превосходит ширину ячейки, то это может повлечь за собой искажения отображения значения ячейки (см. рис. 12.20). Для решения этой проблемы можно воспользоваться режимом переноса по словам или режимом автоматического подбора ширины текста по ширине ячейки.
Рассмотрим режим переноса по словам. Он включается, когда свойство ячейки WrapText установлено в значение True, и отключается, когда свойство WrapText установлено в значение False.
:Перенос по словам
procedure TOKBattomDlg8.WrapTextClick(Sender: TObject);
begin
Range.WrapText:=WrapText.Checked;
end;
Режим переноса по словам позволяет разместить текст, как показано на рис. 12.2L
Рис. 12.22. Использование автоподбора ширины текстаРис. 12.22. Использование автоподбора ширины текстаВ этом режиме высота ячейки автоматически изменяется в зависимости от размера текста. Если текст в ячейке выравнивается по ее левой границе, то можно задать величину отступа, определяемую свойством Indent Level объекта Range. Оператор Range.lndentLevel=2; задает отступ от левой границы ячейки в два пункта.
Рис. 12.22. Использование автоподбора ширины текста
Рис. 12.22. Использование автоподбора ширины текста
Расположение текста вячейке
Рис. 12.21. Перенос текстапо словам
Когда требуется, не изменяя размер ячейки» записать в нее текст, ширина которого может превысить ширину ячейки, необходимо воспользоваться свойством ShrinkToFit. Если установить это свойство в значение True, то размер шрифта текста будет автоматически устанавливаться так, чтобы текст по ширине всегда мог вписаться в ячейку (рис. 12.22).
Еще один способ изменения расположения текста в ячейке —— его поворот. Поворот текста, отображающего значение ячейки, определяется свойством Orientation и может быть задан величиной от —90 до +90 градусов.
Поворот текста в ячейке
procedure TOKBottomDlg8. Orient at ionChanga (Sender: TObj ect);
begin
Range. Orientation: =Orientation. Value; end;
Результат выполнения представленной выше процедуры Delphi может выглядеть, как показано на рпс* 12.23. При программировании поворота текста нужно учитывать, что шаг угла поворота составляет 1 градус в пределах от 一90 до +90 градусов.
Ряс. 12.23. Поворот текстаРяс. 12.23. Поворот текста
Ряс. 12.23. Поворот текста
Ряс. 12.23. Поворот текста
Если длина текста, размещаемого в ячейке, настолько велика, что он не может быть размещен там без существенных изменений размеров ячейки, а по конкретным условиям задачи размеры строк и столбцов изменять нельзя,
ааннЕЕРис. 12.24. Объединение ячеекРис. 12.24. Объединение ячеек
а
а
н
н
Е
Е
Рис. 12.24. Объединение ячеек
Рис. 12.24. Объединение ячеек
то следует использовать режим объединения ячеек. Объединение ячеек осуществляется установкой в значение True свойства MergeCells объекта Range, ассоциированного с областью ячеек.
Объединение ячеек:
,:Г.^,.^..^..^^"."… i
procedure TOKBottomDlg9.MergeCellsClick (Sender: TObject); begin
Range * MergeCells: =Me rgeCe 11 s. Checked; end;
На рис. 12.24 приведен пример объединения группы ячеек с использованием представленной процедуры. Адрес объединенной ячейки соответствует адресу левой верхней ячейки области, в которой выполнялось объединение.
Шрифт
Важным свойством текста в Excel является шрифт отображаемых значений ячеек и текста других объектов. Для ячеек шрифт является одним из свойств объекта Range, при этом в одной ячейке не может быть, например, два фрагмента текста с разным шрифтом. Шрифт определяется свойством Font ячейки или области ячеек. Шрифт по существу тоже является объектом со своими свойствами, определяющими те или иные характеристики отображения текста. Свойства объекта Font н их характеристика представ* лены в табл. 12.3.
Таблица 123 Свойства объекта Font
Свойство
Тип
Значение
Name
String
Имя
Background
Integer
Стиль прорисовки фона (используется только для диаграмм)
Fontstyle
String
Строковое описание стиля
Bold
Boolean
Полужирный
Italic
Boolean
Курсив
Size
Integer
Размер шрифта
Strikethrough
Boolean
Зачеркнутый
Superscript
Boolean
Верхний индекс
Subscript
Boolean
Нижний индекс
OutlineFont
Boolean
Не используется
Таблица 123 (окончание)
Свойство
Тип
Значение
Shadow
Boolean
He используется
Underline
Integer
Подчеркивание
Colorindex
Integer
Индекс цвета из палитры цветов
Color
Integer
Цвет
Программистов Delphi в первую очередь будет интересовать, каким образом шрифт стандартных объектов разрабатываемых приложений может соответствовать объекту Font, при надлежащему объекту Excel.Application и подчиненным объектам. Иными словами — как управлять шрифтом создаваемых документов в Excel из приложений. В Delphi свойства шрифта несколько отличаются от свойств шрифта в Excel, поэтому чтобы решить проблему согласования, достаточно написать небольшую процедуру, преобразующую свойства шрифта Delphi в свойства шрифта Excel. Вот пример такой процедуры.
Выбор шрифта для текста ячейки
function SetFontRange{range_:variant; fontrTfont):boolean; begin
Set Font Range: =True;
try
Range_. Font. Name: ^font. Name;
if fsBold in font.Style
then Range_. Font. Bold: =<Ггие
else Range_. Font.Bold:=False;
if fsltalic in font.Style
then Range_. Font.工 talic: =True
else Range_.Font. Italic:=False;
Range.. Font. Size: =font. Size;
if fsStrikeOut in font.Style
then Range_. Font.Strikethrough:=True
else R&nge_. Font.Strikethrough:=False;
if fsunderline in font-Style
then Range_. Font・ Underline: =xlUnderlineStyleSingle
else Range_. Font. Underline:=xlUnder! ineStyleNone;
Range_. Font・ Color:=font.Color;
except
SetFontRange:=false;
end;
end;
procedure TOKBottomDlg».ButtonlClick(Sender: TObject); begin
if not FontDialogl*Execute then exit;
SetFontRange(range,FontDialogl.Font);
end;
На рис. 12.25 видно изменение шрифта ячейки, полученное с помощью представленного программного кода.
_111|12|14ПБ|18割_111|12|14ПБ|18割Рис. 12.25. Настройка шрифтаРис. 12.25. Настройка шрифта
_111|12|14ПБ|18割
_111|12|14ПБ|18割
Рис. 12.25. Настройка шрифта
Рис. 12.25. Настройка шрифта
Границы ячейки
Перейдем к анализу графического оформления ячейки. Ячейка представляет собой прямоугольную область. Эта область, кроме отображаемого в ней значения, имеет такие свойства, как заливка и граница. Как заливка ячейки» так и граница имеют соответствующие свойства (цвет, толщину, тип, узор, цвет узора). Рассмотрим эти свойства подробней. Граница ячейки представляет собой линии, ограничивающие ее с четырех сторон. Линии объединены в коллекцию Borders, доступ к любой из них осуществляется через элементы этой коллекции. Каждый элемент коллекции предоставляет доступ к отрезку прямой, прилегающему к той или другой стороне ячейки. Диагонали ячейки тоже являются элементами этой коллекции. Каждый элемент коллекции Borders является объектом и имеет свои индивидуальные свойства, что позволяет задать тип линии н цвет отдельно для каждой линии границы ячейки. Рассмотрим процедуры, позволяющие обеспечить дос-
туп к любой линии границы (или ко всей Гранине сразу) выбранной ячейки, установить ее толщину, тип линии и цвет.
]Задаем свойства линии границы ячейки
procedure ТОКВ о11 cxnDlg 6»Во rde гsChang e(Sende г: TObject); begin
// Получаем доступ к выбранной линии границы или ко всей границе ячейки if CheckBoxl.Checked then Border:^Range.Borders.item[Borders.ItemIndex+5] else Border:=Range.Borders; end;
procedure TOKBottomDLg6 * Weightchange (Sender: TObj ect); begin
// Устанавливаем толщину линии границы ячейки
Border.Weight:=Weight.Itemindex; end;
procedure TOKBottomDlg6.Linestу1eChange(Sender: TObject);
begin
// Устанавливаем тип линии границы ячейки
Border.LineStyle:^xlDouble; end;
// Устанавливаем цвет линии границы ячейки
procedure TOKBottomDlg6.ButtonlClick{Sender: TCbject); begin
if not ColorDialogl.Execute then exit;
Border.Color:=ColorDialogl.Color; end;
Результат настройки линий границ ячеек с использованием приведенных процедур представлен на рис. 12.26. Полный текст этих процедур имеется на сопроводительном компакт-диске книги.
Заливка ячейки
Заливка ячейки определяется комбинацией следующих составляющих —— цвета, узора и цвета узора, заполняющего пространство ячейки. Программный доступ к параметрам заливки обеспечивает свойство Interior объекта Range, где Range — ссылка на ячейку или область. Свойство Interior представляет собой объект, свойства которого связаны с визуальными свойствами внутреннего пространства ячейки.
ввD _D _ЕЕFFGGННв 9 ^ п^^^^ ^ ^^^в 9 ^ п^^^^ ^ ^^^Параметрыграницы и заливкиячеекПараметрыграницы и заливкиячеекГранмцы ячеекГранмцы ячеек|7 Выбор границы jMsgBox xIEdgeTop 日|7 Выбор границы jMsgBox xIEdgeTop 日Заамм толдину границы ячеек рЗаамм толдину границы ячеек р33Зш^ем стиль ли№<н границы ячеек [xDodbleЗш^ем стиль ли№<н границы ячеек [xDodble< 11 и .•!?!-< 11 и .•!?!-[MLineS lykM 処戶[MLineS lykM 処戶三I三I
в
в
D _
D _
Е
Е
F
F
G
G
Н
Н
в 9 ^ п^^^^ ^ ^^^
в 9 ^ п^^^^ ^ ^^^
Параметрыграницы и заливкиячеек
Параметрыграницы и заливкиячеек
Гранмцы ячеек
Гранмцы ячеек
|7 Выбор границы jMsgBox xIEdgeTop 日
|7 Выбор границы jMsgBox xIEdgeTop 日
Заамм толдину границы ячеек р
Заамм толдину границы ячеек р
3
3
Зш^ем стиль ли№<н границы ячеек [xDodble
Зш^ем стиль ли№<н границы ячеек [xDodble
< 11 и .•!?!-
< 11 и .•!?!-
[MLineS lykM 処戶
[MLineS lykM 処戶
三I
三I
Рис. 12.26. Настройка параметров границы ячейки
Цвет заливки определяется свойством Color объекта Interior и задается как комбинация трех цветов:
Color:=RGB(R, G, В);«
где R, G, В ——числовые значения, соответствующие красному, зеленому и синему цветам. Цвет заливки можно также задать как выбранный на цветовой палитре — для этого используется свойство Colorindex объекта Interior.
Выберем цвет заливки, записав в свойство Color значение цветовой комбинации. Для этого используем следующую процедуру.
:• Задание цвета заливки ячейки
procedure TOPBottomDlg7.ButtonlClick(Sender: TObject); begin
if not ColorDialogl.Execute then exit;
Interior*Color:=ColorDialogl.Color;
end;
Результат выполнения этой процедуры представлен на рис. 12.27.
Узор заливки области ячейки определяется свойством Pattern, а его цвет — свойством PatternColor объекта Interior. Цвет также можно выбрать на цветовой палитре Excel путем записи в свойство PatternColorlndex индекса выбранного цвета.
产'廿:叫"4":",",**"*"T""""1"","?1,'",""…产…yW+F'W-Ti.TLErTFkft?*}-1'%'+?寧廿,'"口:飞"£"':"产.関"ry':::'11H"卄":‘""""空":‘f""'H""::W"?
Выбор узора заливки ячейки
procedure TOKBottomDlg7.Patternchange(Sender: TObject);
begin
case Pattern.Itemlndex of
。:Interior * Pattern:=xlPatternGrid;
1:Interior.Patte rn:=xlPatternNone;
2:Interior* Pattern:=xlPatternCrissCross;
end;
end;
procedure T0KBottomDlg7.Button2Click(Sender: TObject); begin
if not ColorDialogl.Execute then exit;
Interior.Patterncolor:^ColDrDialogl.Color;
end;.
Узор заливки определяется выбором одного из всех возможных вариантов и задается числовой константой, которая записывается в свойство Pattern. На рис. 12.28 представлен пример выбора узора ячейки и его цвета, осуществленного с помощью приведенных процедур.
Рис. 12.28. Выбор узора заливки ячейки
Пример программы — подготовка формы налоговой декларации НДС
Применим наши знания на практике. Пользователям часто приходится заполнять различные формы в Excel. Обычно эта работа монотонна и однообразна, но необходима и очень важна. Одним из видов такой работы является заполнение форм налоговых деклараций, которых на большом предприятии очень много, а заполнять их приходится в огромном количестве за очень небольшой промежуток времени. Конечно, эту проблему можно решить, используя в формах Excel функции и небольшие макросы. Но если вы программист Delphi и программа для расчета налога разработана в этой среде, то нет никакой необходимости полностью переквалифицироваться в программиста Visual Basic — достаточно получать и воплощать новые знания, используя для решения новых задач проверенные методы и стиль программирования.
Рассмотрим пример создания формы налоговой декларации НДС. Формы, которые требуется заполнять, можно взять в любой справочно-правовой системе, например "Консультант Плюс". Для заполнения формы достаточно использовать методы поиска и замены. Но сначала подготовим форму.
Суть подготовки заключается в расстановке некоторых строковых констант в определенные ячейки. В процессе работы программы эти константы будут
заменены реальными значениями из базы данных. На рис. 12.29 представлен шаблон документа для формы налоговой декларации, подготовленный для заполнения нз приложения Delphi.
Рис. 12.29. Подготовленный шаблон документа для формы налоговой декларацииРис. 12.29. Подготовленный шаблон документа для формы налоговой декларации
Рис. 12.29. Подготовленный шаблон документа для формы налоговой декларации
Рис. 12.29. Подготовленный шаблон документа для формы налоговой декларации
理聊版雑嬲1Ш即幽В!頤ШШ@Ш碑m同m理聊版雑嬲1Ш即幽В!頤ШШ@Ш碑m同mРис. 12.30. Фрагмент шаблона документа для формы налоговой декларацииРис. 12.30. Фрагмент шаблона документа для формы налоговой декларации
理聊版雑嬲1Ш即幽В!頤ШШ@Ш碑m同m
理聊版雑嬲1Ш即幽В!頤ШШ@Ш碑m同m
Рис. 12.30. Фрагмент шаблона документа для формы налоговой декларации
Рис. 12.30. Фрагмент шаблона документа для формы налоговой декларации
Как вы обратили внимание, некоторые ячейки шаблона документа содержат строки типа #ИНСПЕКЦИЯ& и #ОРГАНИЗАЦИЯ& или строки типа И1&, Н2&…И12& и К1&, К2& (рис. 12.30).
三I互"i&
Эти строки будут использоваться для поиска и подстановки на их место реальных данных при заполнении формы налоговой декларации. Рассмотрим представленный ниже программный код, предназначенный для формирования формы. Он основан на использовании метода Replace объекта Range, который производит замену текста в рабочей книге Excel. Метод Replace вызывает ошибку выполнения, если искомый фрагмент не найден. Мы использовали это обстоятельство в функции FindAndReplace, которая возвращает значение True или False в зависимости от результата поиска и замены. Обратите внимание на то, что объект Range указывает на область Al:EL230. Это позволяет осуществлять поиск не на всем листе, а на его части, что ускоряет работу. Использование MS Office ХР также существенно ускоряет поиск и замену фрагментов текста в рабочей книге Excel и подготовку формы налоговой декларации.
Заполнение формы налоговой декларации
function FindAndReplace (find_, rep_:string) :boolean;
var range:variant;
begin
FindAndReplace:=False;
if find^o11 then begin
try
range: =^E.Range [ ,A1:EL23O, ] .Replace (What :^find_, Replacement: =rep_);
F indAndRepl a ce: Erum;
except
FindAndReplace:=False;
end;
end;
end;
procedure TOKBottomDlgll.Button3Click(Sender: TObject);
var a_:integer;
begin
FindAndReplace (' #ИНСПЕКЦИЯ& I inspekcia.Text);
FindAndReplace (1 #0РГАЖЗАЦИЯ& *, organizacia. Text);
for a_: =1 to 12 do FindAndReplace ( ^^inttostr {a」+' &' • INN,Text [a_]};
for a_:=l to 9 do FindAndReplace(* К1+inttostr(a_) +'& 1r KPP.Text[a_]);
for a_;=l to 15 do FindAndReplace(rC* +inttostr(a_) + '&1,
(SU№A.Text+1I (a」);
for a_:=l to 2 do FindAndReplace (1Д* +inttostr (a_) +1 & *, DATA.Text [a_] }; for a_:=l to 2 do FindAndReplace (1M* -s-inttostr (a_} +' &', DATA.Text [a_+3]);
for a_:=l to 4 do FindAndReplace(*Г* +inttostr(a_)+*&1,DATA.Text[a_+6]);
end;
Результат выполнения представленных процедур, заполняющих шаблон документа для формы налоговой декларации, показан на рис. 12.31.
Рис, 12.31. Заполненная форма налоговой декларации
ГЛАВА 1 3
Работа с объектами в книге Excel
В этой главе рассмотрены следующие темы:
О коллекция объектов Shapes;
口 надпись;
О выноски;
口 линии;
口 произвольные фмгурн;
口 объекты WordArt.
Коллекция объектов Shapes
Как и в документах Word, в рабочих книгах Excel информацию мо*но размещать не только в ячейках, но и в объектах, которые могут располагаться произвольно в любом месте листа. Речь идет об объектах коллекции Shapes, объединяющей в себе различные виды таких объектов, как надписи, линии и другие геометрические фигуры, выноски, OLE-объекты, рисунки, объекты WordArt и др. Коллекция Shapes имеет несколько свойств и методов, которые описывают ее и позволяют манипулировать ее содержимым. Свойство Count содержит информацию о количестве элементов коллекции. Метод Item(i:variant) возвращает ссылку на объект коллекции, где i ——порядковый номер объекта в коллекции (начиная с I) нлн имя объекта. Метод SelectAll выделяет все элементы коллекции. Методы AddCallout, AddConnector, AddCurve, AddFormControl, AddLabel, AddLine, AddOLEObject, AddPicture, Add Polyline, AddShape, AddTextbox, AddTextEffect создают новые элементы коллекции различного типа. Наиболее распространенным и типичным из элементов коллекции Shapes является объект типа TextBox (надпись). Рассмотрим его подробнее.
Надпись
Надпись (объект TextBox) создается с помощью метода AddTextbox коллекции Shapes. При вызове этого метода необходимо указать параметры создаваемого объекта — направление текста объекта, его координаты и размеры. Еслн метод AddTextbox вызывается из приложений Delphi, то переменные, задающие координаты и размеры, должны иметь тип Extended, Следующий пример процедуры демонстрирует использование данного метода в приложениях.
Создание надписи
procedure TForml.Button3Click(Sender: TObject);
const msoTextOrientationHorizontal=l;
var left_, top_: Extended;
begin
left_:=100;
top_:=100;
TextBox:=E.ActiveWorkBook.ActiveSheet.Shapes.AddTaxtBox( msoTextOrientationHorizontal, left_,top^, 100, 100); end;
Результат выполнения представленной процедуры, если в нее внести незначительные изменения, может выглядеть примерно так, как показано на рис. 13.1. В данном примере создан объект с определенными координатами и размерами, заданными в управляющей программе. Задано горизонтальное направление текста, но при создании объекта можно выбрать любой из возможных типов ориентации (направления) текста (см. Приложение 7).
Даже если объект TextBox создан с определенными свойствами, это не значит, что свойства этого объекта нельзя из^feнить впоследствии. Для этого необходимо получить доступ к созданному объекту, а затем к свойствам самого объекта. Доступ к объекту коллекции Shapes можно получить, используя метод item(i) данной коллекции. Например, оператор
Shape:=Shap£B ・Item(i);
помещает в переменную Shape ссылку на элемент коллекции, после чего мы можем изменять свойства непосредственно самого объекта.
Рассмотрим основные свойства объекта TextBox. Поскольку этот объект предназначен в основном для отображения текста, параметры шрифта, а также направление и способ выравнивания текста являются одними из основных его свойств. Внутренние поля тоже определяют положение текста внутри надписи. С использованием свойств объекта Line, принадлежащего объекту TextBox, задаются тип, толщина и цвет линий, ограничивающих
253
объект. Заливка надписи (цветом, узором или рисунком) задается с помощью свойств н методов объекта FilL который тоже принадлежит объекту Text Box* Размер и положение надписи определяются ее свойствами Width, Height, Top, Left, которые в приложениях Delphi должны иметь тип Extended.
^^^^也 Riui 恥耿* 覓ИЛ Вт#* Фцтдлт Свае Дв*в-е Е<Н9 2近套0占值学X面:聲<*、•:■审工〃外久il ■ + g* ■■:;^§:二E: * * 4奪鼻注固姿义1%円 0母 _♦皋•△.・也 Riui 恥耿* 覓ИЛ Вт#* Фцтдлт Свае Дв*в-е Е<Н9 2近套0占值学X面:聲<*、•:■审工〃外久il ■ + g* ■■:;^§:二E: * * 4奪鼻注固姿义1%円 0母 _♦皋•△.・lZOM4№rt*MXLylZOM4№rt*MXLyСамзвм пнуСамзвм пнуСшиомткм«>то,уа Мж>$I3Сшиомткм«>то,уа Мж>$I3ОтбМ313"** ^*^« ■ Н«Г№ИОтбМ313"** ^*^« ■ Н«Г№ИПфамгтры пинаПфамгтры пинаПарвматры мп*м гмоткнПарвматры мп*м гмоткнСошен шгчс»Сошен шгчс»^s^^^s^^№ 4,叭f Z^t^^—二^Г.^Г7—一 IMл^й^т*® * 必 G Awowty^ • " ■• ч 口 О 圖《 %* 上 “А* 云舌它•■№ 4,叭f Z^t^^—二^Г.^Г7—一 IMл^й^т*® * 必 G Awowty^ • " ■• ч 口 О 圖《 %* 上 “А* 云舌它•■Pefrrw с «Ьлпчы WoiNPefrrw с «Ьлпчы WoiNРис. 13.1. Создание надписиРис. 13.1. Создание надписиНГНГ
^^
^^
也 Riui 恥耿* 覓ИЛ Вт#* Фцтдлт Свае Дв*в-е Е<Н9 2
近套0占值学X面:聲<*、•:■审工〃外久il ■ + g* ■■:
;^§:二E: * * 4奪鼻注固姿义1%円 0母 _♦皋•△.・
也 Riui 恥耿* 覓ИЛ Вт#* Фцтдлт Свае Дв*в-е Е<Н9 2
近套0占值学X面:聲<*、•:■审工〃外久il ■ + g* ■■:
;^§:二E: * * 4奪鼻注固姿义1%円 0母 _♦皋•△.・
lZOM4№rt*MXLy
lZOM4№rt*MXLy
Самзвм пну
Самзвм пну
Сшиомткм«>то,уа Мж>$
I3
Сшиомткм«>то,уа Мж>$
I3
ОтбМ313"** ^*^« ■ Н«Г№И
ОтбМ313"** ^*^« ■ Н«Г№И
Пфамгтры пина
Пфамгтры пина
Парвматры мп*м гмоткн
Парвматры мп*м гмоткн
Сошен шгчс»
Сошен шгчс»
^s^^
^s^^
№ 4,叭f Z^t^^—二^Г.^Г7—一 IM
л^й^т*® * 必 G Awowty^ • " ■• ч 口 О 圖《 %* 上 “А* 云舌它•■
№ 4,叭f Z^t^^—二^Г.^Г7—一 IM
л^й^т*® * 必 G Awowty^ • " ■• ч 口 О 圖《 %* 上 “А* 云舌它•■
Pefrrw с «Ьлпчы WoiN
Pefrrw с «Ьлпчы WoiN
Рис. 13.1. Создание надписи
Рис. 13.1. Создание надписи
НГ
НГ
Надпись можно защитить и скрыть текст, но защита действует только тогда, когда включена зашита листа.
Уже понятно, что объект TextBox представляет собой систему взаимосвязанных объектов, имеющую древовидную структуру. Для упрощения разберем только ее основные составляющие (рис. 13.2).
Из рис. 13.2 ясно, что доступ к основным визуальным свойствам надписи осуществляется через промежуточные звенья. Например, все свойства текста н сам текст содержатся в свойствах и объектах, принадлежащих объекту TextFrame. Попробуем изменить некоторые его характеристики. Очевидно, чтобы отследить изменения текста, необходимо записать сам текст. Для этого используем свойство Text, в которое можно записать или из которого можно прочитать текст надписи. Обращаем внимание на то, что свойство Text принадлежит объекту Characters, а не объекту TextFrame.
Рис. 13.2. Объектная модель объекта TextBox
;Запись текста надписи
procedure TOKBottomDlg2<Memo1Change(Sender: TObject);
begin
TextBox.TextFrame.Characters.Text:=Memol.Text;
end;
После того как текст записан, изменяем его направление (ориентацию), используя свойство Orientation объекта TextFrame.
;Изменение направления текста
procedure TOKBottomDlg2.OrientationChange(Sender: TObject); begin
TextBox.TextFrame.Orientation:=Orientation.Itemlndex+l; end;
Дополнительно, для изменения положения текста можно воспользоваться свойствами, задающими выравнивание текста и его поля (исходный текст приложения представлен на сопроводительном компакт-диске книги). Результат применения различных вариантов ориентации и выравнивания текста представлен на рис. 13.3.
Установка необходимого шрифта осуществляется настройкой определенных свойств объекта Font. В предыдущей главе мы рассматривали, как он выби-
рается применительно к тексту ячейки. Для других объектов процедура аналогична.
:' lW_F JU"''']':…’'’__:' lW_F JU"''']':…’'’__,:口 лал* прем 3« 配45 0响*二*33: д****e 虫2 二:0今Ы ■@ 廿£事耍。「*< < 1 A 14 II ".川雲士.算,躍,史,二5 ' "KU奪**雷® X,源眾学年上・ 6・A・,:口 лал* прем 3« 配45 0响*二*33: д****e 虫2 二:0今Ы ■@ 廿£事耍。「*< < 1 A 14 II ".川雲士.算,躍,史,二5 ' "KU奪**雷® X,源眾学年上・ 6・A・Вс10№л *®ЙЧ*И С**^- н***« йч 三Вс10№л *®ЙЧ*И С**^- н***« йч 三一纟♦M Л Н隆・31雷 ®* . :樓芋軍 一一纟♦M Л Н隆・31雷 ®* . :樓芋軍 一ОбъектTextBoxОбъектTextBoxт e X t в о б ъ 0 кт e X t в о б ъ 0 к9W11U131415161718192Q212223M 芯壬〃2829Х31329W11U131415161718192Q212223M 芯壬〃2829Х3132oas-a, TextBoxoas-a, TextBox\、口 0 国 4 *\、口 0 国 4 *■ w为■ w为|горИМгЯ*ЛЫЧйв|горИМгЯ*ЛЫЧйвОбъектT ext&oxОбъектT ext&oxHanputwiie чкстзHanputwiie чкстз,胃磊,胃磊s^^s产g。s^^s产g。Па» 衿 XwgrgjПа» 衿 XwgrgjEep>rte 卜Ни*н»е pEep>rte 卜Ни*н»е pОбъе»стTextBoxОбъе»стTextBox
:' lW_F JU"''']':…’'’__
:' lW_F JU"''']':…’'’__
,:口 лал* прем 3« 配45 0响*二*33: д****e 虫2 二
:0今Ы ■@ 廿£事耍。「*< < 1 A 14 II ".川雲士.算,
躍,史,二5 ' "KU奪**雷® X,源眾学年上・ 6・A・
,:口 лал* прем 3« 配45 0响*二*33: д****e 虫2 二
:0今Ы ■@ 廿£事耍。「*< < 1 A 14 II ".川雲士.算,
躍,史,二5 ' "KU奪**雷® X,源眾学年上・ 6・A・
Вс10№л *®ЙЧ*И С**^- н***« йч 三
Вс10№л *®ЙЧ*И С**^- н***« йч 三
一纟♦M Л Н隆・31雷 ®* . :樓芋軍 一
一纟♦M Л Н隆・31雷 ®* . :樓芋軍 一
Объект
TextBox
Объект
TextBox
т e X t в о б ъ 0 к
т e X t в о б ъ 0 к
9W11U131415161718192Q212223M 芯壬〃2829Х3132
9W11U131415161718192Q212223M 芯壬〃2829Х3132
oas-a, TextBox
oas-a, TextBox
\、口 0 国 4 *
\、口 0 国 4 *
■ w为
■ w为
|горИМгЯ*ЛЫЧйв
|горИМгЯ*ЛЫЧйв
Объект
T ext&ox
Объект
T ext&ox
Hanputwiie чкстз
Hanputwiie чкстз
,胃磊
,胃磊
s^^
s产g。
s^^
s产g。
Па» 衿 Xwgrgj
Па» 衿 Xwgrgj
Eep>rte 卜Ни*н»е p
Eep>rte 卜Ни*н»е p
Объе»ст
TextBox
Объе»ст
TextBox
Рис. 13.3. Варианты ориентации и выравнивания текста в TextBox
Линии границы
Параметры линии границы объекта определяются свойствами объекта Line, который сам является свойством и принадлежит объекту TextBox. При создании надписи она имеет видимые линии границы с определенными параметрами, но у нас есть возможность сделать эти линии вообще невидимыми, Для этого достаточно изменить состояние свойства Visible объекта Line — установить его в значение False.
[ание видимости линии границы
procedure T0KBottomDlg3.LineVisibleClick(Sender: TObject); begin
Line* Visible:^LineVisible.Cheeked;
end;
Задать толщиьгу линии можно с помощью свойства Weight объекта Line. В приложениях Delphi значение толщины линии должно задаваться дробным числом типа Extended. Следующий программный код отражает изменение толщины линии (рис, 13.4).
Задание толщины линии границы
procedure TOKBottomDlg3.WeightChange(Sender: TObject}; begin
Line * Weight :=Weight. Value* 0.25;
end;
УдалитьУдалитьР П«в»тЬ>с1фыгьР П«в»тЬ>с1фыгьТмплинйк|~ 眦блок IUsop iwhm^I—Тмплинйк|~ 眦блок IUsop iwhm^I—Цент <wihhЦент <wihhИвет ФОгН IИвет ФОгН I883^^3^^
Удалить
Удалить
Р П«в»тЬ>с1фыгь
Р П«в»тЬ>с1фыгь
Тмплинйк|~ 眦блок I
Usop iwhm^I—
Тмплинйк|~ 眦блок I
Usop iwhm^I—
Цент <wihh
Цент <wihh
Ивет ФОгН I
Ивет ФОгН I
8
8
3^^
3^^
Puc. 13.4. Задание толщины линии границы для надписи
Цвет линии границы задается выбором из палитры цветов Excel, при этом значение индекса цвета записывается в свойство ForeColor.SchemeColor. Например, оператор
Line.ForeColor.SchemeColor:=1;
определяет для линии цвет как значение, соответствующее выбранному в палитре цвету. Такой метод определения цвета зависит от палитры и ее изменений. Если требуется задать цвет как комбинацию трех цветов (красный, зеленый, синий), то используем запись значения цвета в формате RGB непосредственно в свойство ForeColor.RGB объекта Line.
Изменим для надписи цвет линии границы, используя формат RGB.
г Задание цвета линии границы
procedure ТОКВоttomD 1g3.ForeColorClick(Sender: TQDject);
begin
if not ColorDialogl.Execute then exit;
Line.ForeColor.RGB:=ColorDialogl.Color;
end;
Результат выполнения процедуры изменения цвета представлен на рис. 13.5.
■厂厂E■■■ 『厂厂匠-■■ ^■■■■я■厂厂E■■■ 『厂厂匠-■■ ^■■■■яОбъект TextBoxОбъект TextBox^■■■■г г^нннм ■ ■r■■■ г геи им^■■■■г г^нннм ■ ■r■■■ г геи имДооолмигельныв ив eraгггггггг ггггггггДооолмигельныв ив eraгггггггг ггггггггУдаАИТь IУдаАИТь I
■厂厂E■■■ 『厂厂匠-■■ ^■■■■я
■厂厂E■■■ 『厂厂匠-■■ ^■■■■я
Объект TextBox
Объект TextBox
^■■■■г г^нннм ■ ■r■■■ г геи им
^■■■■г г^нннм ■ ■r■■■ г геи им
Дооолмигельныв ив era
гггггггг гггггггг
Дооолмигельныв ив era
гггггггг гггггггг
УдаАИТь I
УдаАИТь I
Рис. 13.5. Изменяем цвет линии границы надписи
Следующее свойство линии границы, которое мы изменим, это ее тип (или стиль). Тип линии определяется значением, которое содержит свойство Style объекта Line. Свойство Style линии границы надписи может принимать целые числовые значения из списка определенных констант, значения которых находятся в диапазоне от 1 до 5. Их применение определяет, будет линия сплошной или сочетанием из двух-трех толстых и тонких линий.
Рассмотрим следующую процедуру, позволяющую изменять тип линии.
;Задание типа линии границы
procedure TOKBottomDlg3.LineStyleChange(Sender: TObject); begin
case LineStyle,Itemindex of
0:Line.Style: =msoLineSingle;
1:Line.Style:=msoLineThinThin;
9 Ззк. 723
2:Line.Style:=msoLineThinThick;
Line. Style: =msoLineThickThin;
Line, Style: ==msoLineThickBetweenThin; end;
end;
Результат выполнения этой процедуры и применения типа линии, заданно го константой msoLineThinThin=2, представлен на рис. 136
Рис. 13.6. Задаем тип линии границы для надписи
Если задать тип линий константами mso Li neThickBetwee nTh i n и msoLineThickThin, то получим другой результат (рис. 13*7).
Рнс. 13.7* Изменим тип линии объекта TextBox
Независимо от типа, линия границы может быть представлена в виде точек, пунктирной линии или сочетания того и другого. Шаблон (вид разрыва линии) определяется значением свойства DashStyle объекта Line. Рассмотрим пример.
Задание шаблона линии границы
procedure ТОЕСВо11omD1g3.LineDashStyleChange(Sender: TObject); begin
Line.DashStyle:=LineDashStyle,Itemlndex+l;
end;
В этом примере мы изменяем свойство DashStyle, присваивая ему значения констант нз заданного списка. Все эти константы являются целыми числами в диапазоне от 1 до 8. Этим объясняется простота исходного текста для процедуры выбора шаблона линии границы.
Установим шаблон линии с помощью этой процедуры, задав для свойства DashStyle значение константы msoLineSquareDot. Результат выполнения процедуры представлен на рис. 13.8.
■ ■ ■ ■■ ■ ■ ■O6beicrTextBoxO6beicrTextBox
■ ■ ■ ■
■ ■ ■ ■
O6beicrTextBox
O6beicrTextBox
Рис. 13.8. Задаем шаблон линии границы для надписи
Воспользовавшись той же процедурой, изменим шаблон, присваивая значения других констант свойству DashStyle объекта Line. Результаты этих преобразований представлены на рис. 13.9.
Если по каким-то причинам нас не устраивает вид линии границы, получаемый комбинированием значений свойств Style и DashStyle объекта Line, то дополнительно можно воспользоваться свойством Pattern объекта Line и
задать нужный рисунок узора. Сочетая различные значения этих трех свойств, можно получить множество вариантов и выбрать среди них подходящий.
Рис. 13.9. Изменим шаблон линии границы для надписи
При задании узора появляется дополнительная возможность манипуляции с цветом. Дополнительно к цвету линии (узора) можно задать цвет фона. Цвет фона определяется свойством BackColor объекта Line. Первая из приведенных далее процедур позволяет выбрать узор линии, а вторая ——задать цвет его фона (рис. 13Л0 и 13.11).
Задание узора линии границы
procedure TOKBottomDlg3.Patternchange(Sender: TObject); begin
Line. Pattern: s=msoPatternHori2ontalBrick;
end;
:Задание цвета фона узора
procedure TOKBottomDlg3.BackColorClick(Sender: TObject);
begin
Line.BackColor.RGB:^CalorDialogl* Color; end;
В процессе работы программы мы всегда можем изменить узор линии границы надписи. Для этого достаточно свойству Pattern присвоить новое значение из списка допустимых значений (более 40), которое является целым числом.
Рис. 13.10. Задаем узор линии границы для надписиРис. 13.10. Задаем узор линии границы для надписиliiBilliiBil
Рис. 13.10. Задаем узор линии границы для надписи
Рис. 13.10. Задаем узор линии границы для надписи
liiBil
liiBil
Рис. 13.11. Задаем цвет фона узора для линии границы
Следующая процедура позволяет изменить узор.
Изменение узора линии границы
procedure TOKBottomDlg3.PatternChange(Sender: TObject); begin
case Pattern.Itemindex of
0:Line.Pattern: ==mso₽atternDottedGrid;
1:Line.Pattern:=msoPatternHorizontalBrick;
2:Line.Pattern :=msoPatternLargeCheckerBoard;
Line. Pattern: ==msoPatteimLargeConfetti;
Line. Pattern: =^ о Pa11ernLa rgeGr id;
end;
end;
Результат выполнения процедуры представлен на рис. 13.12.
Рис. 13Л2* Изменяем узор линии границы для надписи
Заливка
Заливка области определяется свойствами объекта Fill, который принадлежит объекту TextBox и является его свойством. Манипулируя объектом Fill, мы можем настроить цвет и стиль заливки, фоновый рисунок и другие параметры области. Самый простой вариант заливки заключается в выборе цвета фона, который определяется свойством ForeColor объекта Fill. Для более сложного варианта заливки необходимо использование других свойств и методов объекта Fill, часть из которых представлены в табл. 13. L
Таблица ,3.1. Свойства и методы объекта Fili
Свойство или метод
Тип
Назначение
Туре
Integer
Определяет тип заливки — одноцветная или градиентная заливка, узор или рисунок
Visible
Boolean
True/False — показать/скрыть заливку
Transparency
Extended
0..1 — определяет прозрачность заливки
BackColor
Integer
Определяет цвет заливки
Таблица 13.1 (окончание)
Свойство или метод
Тип
Назначение
Solid
Метод
Сбрасывает пользовательские настройки заливки и задает однотонную заливку
Gradientstyle
Integer
Определяет направление градиента и тип штриховки
Gradientvariant
Integer
Выбор варианта градиента для данного типа штриховки
G radie ntColo rType
Integer
Определяет для выбранного типа штриховки градиента один или два цвета, или заготовку
GradientDegree
Extended
Определяет яркость двух цветов для градиентной заливки
PresetGradientType
Integer
Задает одну из доступных заготовок градиентов
OneColorGradjent
Метод
Создает одноцветную градиентную заливку
TwoColorGradient
Метод
Создает двухцветную градиентную заливку
PresetGradient
Метод
Создает один из вариантов выбранной заготовки градиентной заливки
Pattern
Integer
Определяет тип узора для заливки
ForeColor
Integer
Определяет цвет фона для заливки узором
Patterned
Метод
Задает тип узора для заливки
PresetTextured
Метод
Задает для текстурной заливки образец текстуры
UserTextured
Метод
Задает для текстурной заливки рисунок из гра- 中 мческопэ файла
UserPicture
Метод
Задает графический файл для заливки в виде рисунка
:Задание цвета заливки
procedure T0KBottomDlg4.ForeColorClick(Sender: TObject); begin
Fill.ForeColor.RGB:=ColorDialogl< Color; end;
Представленная процедура устанавливает для надписи одноцветную заливку (рис. ]ЗЛЗ).
Рис. 13.13. Устанавливаем цвет заливки для надписи
Изменим значение свойства Transparency объекта FilL Это придаст надписи эффект прозрачности по отношению к листу рабочей книги Excel. Значение свойства Transparency должно иметь тип Extended н находиться в пределах от 0,00 до 1,00. Следующая процедура и результат ее выполнения (рис. 13.14) демонстрируют этот эффект.
Задание прозрачности заливки
procedure TOKBottomDlg4,ТгansparencyChange(Sender: TObject); begin
Fill. Transparency: transparency. Value *0.01; end;
При градиентной заливке получается плавный переход между двумя и более тонами одного цвета или разными цветами. При этом дополнительно задаются тип штриховки градиента и варианты ее исполнения из числа возможных.
Для градиентной заливки с одним цветом используем метод OneColorGradient, первый аргумент которого задает тип, а второй — вариант штриховки* Последний аргумент имеет тип Extended и определяет яркость фона заливки. Двухцветная градиентная заливка области выполняется методом TwoColorGradient, первый аргумент которого определяет тип, а второй — вариант штриховки.
Использование методов OneColorGradient и TwoColorGradient представлено на следующем примере.
Рис. 13.14. Эффект прозрачности заливки для надписи
Задание одноцветной и двухцветной градиентной заливки
procedure TOKBottomDlg4.GradientStу1eChange(Sender: TObject); begin
Fill. OneColorGradient (msoGradientHorizontal, Variant * Itemlndex+l f Degree.Position*0.01);
end;
procedure TOKBottomD1g4.GradientStуleChange(Sender: TObject);
begin
Fill ♦ TwoColorGradient (msoGradientHorizontal, Variant.工temlndex+l); end;
На рис. 13.15 представлены два варианта запивки надписи, выполненные с применением описанных процедур. Левый объект имеет одноцветную, правый — двухцветную градиентную заливку*
Выбор градиента из списка заготовок осуществляется с помощью метода PresetGradient, первый и второй аргументы которого также определяют тип и вариант штриховки. Вариант штриховки определяется числом в диапазоне от 1 до 4. Последний аргумент определяет заготовку из списка MS Ofiice.
Используя метод PresetGradient в приложении Delphi, выберем заготовку градиента с помощью следующей процедуры. Полный исходный текст приложения представлен на сопроводительном компакт-диске книги.
266266Часть 〃厶 Разработка д口кументоб 些门рмлож&нн济 MS Excel в DelphiЧасть 〃厶 Разработка д口кументоб 些门рмлож&нн济 MS Excel в DelphiРис* 13.15. Использование одноцветной и двухцветной градиентной заливки для надписиРис* 13.15. Использование одноцветной и двухцветной градиентной заливки для надписи;Выбор заготовки градиентной заливки из списка
266
266
Часть 〃厶 Разработка д口кументоб 些门рмлож&нн济 MS Excel в Delphi
Часть 〃厶 Разработка д口кументоб 些门рмлож&нн济 MS Excel в Delphi
Рис* 13.15. Использование одноцветной и двухцветной градиентной заливки для надписи
Рис* 13.15. Использование одноцветной и двухцветной градиентной заливки для надписи
procedure TOKBottomDlg4.GradientStylechange(Sender: TObject); begin
Fill.PresetGradient(msoGradientHorizontal『Variant.Itemlndex+l, PresetGradientType_);
end;
Результат выбора варианта заготовки показан на рис. 13.16.
MBHMMMIRVI^^
Объект TextBox
Рис. 13.16. Выбран вариант заготовки градиентной заливки для надписи
Еще один способ заливки — использование текстуры. Этот способ основан на использовании рисунка, который, многократно повторяясь, заполняет всю область объекта TextBox. Если размеры рисунка превосходят размер объекта, то заливкой объекта служит часть этого рисунка. Рисунок выбирается из списка или загружается нз графического файла. Поэтому есть два метода задания текстуры:
метод PresetTextured основан на выборе текстуры из списка н его единственный аргумент — индекс текстуры в палитре текстур;
метод UserTextured основан на выборе и использовании в качестве текстуры рисунка из графического файла.
Рассмотрим две процедуры, применяющие эти методы.
;Задание текстурной заливки
procedure TOKBottomDlg4 . PresetTexturedChange (Sender: TObject); begin
case PresetTextured.Itemlndex of
0:Fill.PresetTextured(msoTextureBrownMarble);
1:Fill.PresetTextured(msoTextureCork);
2:Fill•PresetTextured(ms oTextureGranite);
3:Fill* PresetTextured(msoTextureGreenMa rble); end;
end;
procedure TOKBottomDlg4.Button4Click(Sender: TObject); begin
if not OpenPictureDialogl.Execute then exit;
Fill.UserTextured(OpenPictureDialogl* FileName) / end;
Первая процедура позволяет выбрать один из четырех вариантов текстуры. Вторая, используя диалог выбора графического файла, загружает текстуру из файла. Варианты текстурной заливки представлены на рис. 13.17.
Использование узора в качестве заливки реализуется с помощью метода Patterned объекта Fill, единственным аргументом которого является индекс, определяющий вид узора. Для заливки узором задаются цвет узора и цвет фона (свойства ForeColor и BackColor объекта Fill, используемые и для градиентной заливки).
Следующие процедуры позволяют выбрать один из четырех способов 山трн- ховки, цвет штриховки и фона для заливки надписи узором. Результат выполнения процедур показан на рис. 13.18*
Рис. 13.17. Текстурная заливка надписи
Рис. 13Л8. Выбор узора в качестве заливки для надписи
Задание заливки в виде узора
procedure TOKBottomDlg4.Patternchange(Sendeг: TObject); begin
case Pattern.Itemindex of
0:Fill.Patterned(msoPatternDottedGridl;
:Fill. Patterned (msoPattemHorizontalBrick);
2:Fill.Patterned(ms oPa11ernLa rgeCheckerBoard);
3: Fill. Patterned (nusoPatternLargeConfetti);
end;
end;
procedure TOKBottomDlg4.Button6Click(Sender: TObject);
begin
Fill.ForeColor* RGB:=ColorDialogl.Color; end;
procedure TOKBottomDlg4 . BackColorClick (Sender r TObj ect);
begin
Fill.BackColor.RGB:=ColorDialogl.Color; end;
Рассмотрим способ заливки, при котором фоном для надписи является рм~ сунок. Метод UserPictLire объекта Fill позволяет реализовать этот способ. Аргумент данного метода содержит путь и имя графического файла.
Рис. 13.19. Использование рисунка в качестве фона
Следующая процедура, применяющая метод UserPiciure, позволяет выбрать рисунок для заливки.
;Задание заливки в виде рисунка
procedure TOKBottoinDlg4 ・Button5Click(Sender: TObject); begin
if not OpenPictureDialogl.Execute then exit;
Fill.UserPicture(OpenPictureDialogl< FileName); end;
На рис. 13.19 представлен пример результата выполнения этой процедуры.
Выноски
По сути, выноска (объект Callout) является объектом, во многом сходным с надписью, поэтому многие их свойства идентичны. Выноска отличается от надписи дополнительной ломаной линией-указателем. У некоторых вариантов вь[носок нет линий, ограничивающих текстовую область. Во всех случаях выносок характеристики заливки, расположения текста и линий описываются такими же объектами и свойствами, как и для надписи (у выноски свойства линии применяются и к ломаной линии-указателю). У выноски есть дополнительный объект Adjustments для описания линии^указателя, содержащий описание параметров линии AcljustmentsJtem(i), где i изменяется от 1 до Adjustments.Count (общее количество точек перелома линии). Создается объект-выноска с помощью метода AddCallout(Type, Left» Top, Width, Height, Anchor), где Typerinteger — тип выноски. Left, Top, Width, Height — координаты и размеры (имеют тип Extended), Anchor — область, где создается выноска.
С помощью следующей процедуры мы создаем выноску с линией- указателем, описываемой тремя точками (msoCalloutThree=3), а затем изменяем горизонтальную и вертикальную координаты конца линии-указателя.
Создание выноски и изменение координат конца линии-указателя
procedure TForml.Button8Click(Sender: TObject);
var left」top_:extended;
begin
left」=40;
top__:^40;
Callout:=E.ActiveWorkBook.ActiveSheet. Shapes .AddCallout (msoCalloutTwo, left_,top_, 150, 100);
Callout.Adjustments♦Item(1):=-0.1;// Горизонтальное смещение
Callout.Adjustments. Item(2) : =2;// Вертикальное смещение
end;
На рис. 13.20 показано, как стала вьшт兄деть выноска, после того как она была создана, а затем были изменены ее координаты конца линии- указателя и заливка (при создании заливка имеет свойства "по умолчанию"), при этом использовались общие для объектов Shapes методы н свойства, описанные ранее*
Рис. 13.20* Использование рисунка в качестве фонаРис. 13.20* Использование рисунка в качестве фонаn・・・・L Ln・・・・ ■ ■L・・L 」■■■■ erF・・: MLL欣■■國 ^ггш^5 窗■■■■■n・・・・L Ln・・・・ ■ ■L・・L 」■■■■ erF・・: MLL欣■■國 ^ггш^5 窗■■■■■
Рис. 13.20* Использование рисунка в качестве фона
Рис. 13.20* Использование рисунка в качестве фона
n・・・・L Ln・・・・ ■ ■L・・L 」■■■■ erF・・: MLL欣■■國 ^ггш^5 窗■■■■■
n・・・・L Ln・・・・ ■ ■L・・L 」■■■■ erF・・: MLL欣■■國 ^ггш^5 窗■■■■■
Линии
Линия в рабочей книге Excel создается с использованием метода Add Line коллекции Shapes. Аргументами метода Add Line являются начальные и конечные координаты (BeginX, BeginY, EndX и EndY типа Extended). Толщина, цвет и другие характеристики линии задаются» в основном, так же, как для линии границы надписи (табл. 13.2).
Таблица 73.2 Свойства линии
Свойство
Тип
Назначение
Visible
Boolean
Отобраэить/скрыть линию
Weight
Integer
Толщина линии
ForeColor.RGB
TColor
Цвет линии
BackColor.RGB
TColor
Цвет фона (для узора)
Style
Integer
Тип линии
DashStyle
Integer
Шаблон линии
Pattern
Integer
Узор
BeginArrowheadStyle
Integer
Вид стрелки в начале линии
BeginArrowheadLength
Integer
Длина стрелки в начале линии
BeginArrowheadWidth
Integer
Ширина стрелки в начале линии
Таблица 73.2 (окончание)
Свойство
Тип
Назначение
EndArrowheadStyle
Integer
Вид стрелки в конце линии
EndArrowheadLength
Integer
Длина стрелки в конце линии
EndArrowheadWidth
Integer
Ширина стрелки в конце линии
Следующие процедуры Delphi позволяют создать и настроить параметры линии.
Создание линии и настройка ее параметров
procedure TFoiml.Button9Click{Sender: TObject); begin
Line: =Shapes. AddLine (10,10, 300, 250);
end;
procedure TForml*ForeColorClick(Sender: TObject);
begin
Line・ ForeColor•RGB:=ColorDialogl•Color;
Line.Weight:=2.5;
Line* DashStyle:= msoLineRoundDot;
end;
Результат выполнения процедур представлен на рис. 13.21.
Рис. 13.21. Настройка свойстгв линииРис. 13.21. Настройка свойстгв линии
Рис. 13.21. Настройка свойстгв линии
Рис. 13.21. Настройка свойстгв линии
Произвольные фигуры
Метод AddShape коллекции Shapes предназначен для создания произвольных объектов Shape, в том числе геометрических фигур. Прямые, ломаные и кривые линии создаются посредством специально предназначенных для этого методов, часть которых мы рассмотрели ранее. Синтаксис вызова метода AddShape:
AddShape:=AddShape(Type, Left, Top, Width, Height);
Первый аргумент представляет собой целое число и определяет тип создаваемого объекта, например Type :=msoShapeOvalCal lout; соответствует овальной выноске. Число всех возможных типов геометрических фигур составляет несколько десятков. Величины этих констант можно найти в редакторе Visual Basic. Значения аргументов Left, Top, Width, Height определяют положение и размеры создаваемого объекта и имеют тип Extended.
Создадим овальную выноску и запишем в нее текст с помощью следующих процедур.
Создание произвольного объекта Shape — выноски
procedure TForml.ShapeTypeChange(Sender: TObject);
const msоShapeOvaICa11out= 107;
var Shape:variant;
begin
Shape: =Shapes * AddShape (msoShapeOvalCallout, left__, gp_, 300, 200);
Shape»TextFrame.Characters.Text:=fВставляем текст в графический объект'; end;
Выноска, созданная с применением метода AddShape, представлена на рис. 13.22.
Рис. 13.22, Выноска, созданная как произвольная фигура
Текст в созданный объект добавляем с помощью тех же методов, что и при работе с объектом Callout, т. к. методы и свойства области текста (TextFrame) для двух этих объектов полностью идентичны (рис. 13.23).
Рис. 13.23. Запись текста а созданную выноску
Объекты WordArt
Элементами коллекции Shapes могут быть объекты WordArt, создаваемые с помощью метода AddTextEffect Синтаксис вызова метода:
WordArt:=Shapes.AddTextEffeet(PresetTextEffeet. Text, FontName, Fontsize, FontBold, Fontltalic, Left, Top);
где PresetTextEffect имеет тип Integer н может принимать значение константы из списка типов объекта. Аргумент Text имеет тип String м представляет собой текстовую строку. Наименование шрифта, которым должен быть ото* бражен текст, передается как строка (аргумент FontName, тип String). Размер шрифта задается аргументом FontSize, имеющим тип Integer. Посредством аргументов FontBoId и Fontltalic задается начертание шрифта как комбинация значений светлый/полужирный и прямой/курсив. Аргументы Left и Тор (тип Extended) определяют положение объекта относительно начала координат листа.
Метод AddTextEfTect возвращает ссылку на созданный объект, используя которую можно манипулировать свойствами объекта после его создания.
Следующий пример процедуры демонстрирует использование метода AddTextEffect в приложениях Delplii; результат ее выполнения показан на рис. 13.24.
Создание объекта WordArt
Var WordArt: variant;
procedure TOKBottomDlg5.Button2Click(Sender: TObject); var Left, Top:extended;
begin
Left:=10, Top:=100;
WordArt:=Shapes.AddTextEffect(PresetTextEffect:^soTextEffect1, Text :=' Объект WordArt I FontName :='Tahoma I Fontsize:=48, FontBold:«true, FontItalic:=false, Left:=Leftr Top:=Top); end;
Рис. 13.24. Создаем объект WordArt
Создав объект WordArt, мы получаем доступ к его свойствам и методам, определяемым его дочерним объектом TextEIYect (табл. 13.3).
Таблица 73.3. Свойства и методы объекта TextEffect
Свойство или метод
Тип
Назначение
Alignment
Integer
Выравнивание
FontBold
Boolean
True/False — полужирное/светлое начертание
Fontltalic
Boolean
Тrue/False — курсивное/прямое начертание
Таблица 13.3 (окончание)
Свойство или метод
Тип
Назначение
FontName
String
Наименование шрифта
FontSize
Integer
Размер шрифта
KernedPairs
Boolean
Керннн「пар символов1
Normalized Height
Boolean
True — выравнивание символов по высоте
PresetShape
Integer
Форма текста объекта WordArt
PresetTextEffect
Integer
Стиль объекта WordArt
RotatedChars
Boolean
Поворот символов на 90 градусов против часовой стрелки
Text
String
Содержание текста объекта WordArt
Tracking
Extended
Определяет межсимвольное расстояние; рекомендуемые значения — в диапазоне от 0,8 до 1,5
Togg leVerticalText
Метод
Переключает способ расположения символов текста от вертикального к горизонтальному и наоборот
Изменить цвет символов текста можно с помощью того же метода, что и при установке заливки надписи (объекта TextBox).
Изменим форму текста с помощью свойства PresetShape объекта TextEffect. Реализовать это позволяет следующая процедура.
;Изменение формы текста для объекта WordArt
procedure TOKBottomDlgb.PresetShapeChange(Sender: TObject);
begin
case PresetShape.Itenlndex of
0: WordArt * TextEffect. PresetShape: =msoTextEf fectShapeArchDownCurve;
WordArt * TextEffect * PresetShape: =msoTextEffectShapeZU:chDownPour;
WordArt. TextEffect. PresetShape: =msoTextEf feet ShapeArchUpCu rve;
3:WordArt .TextEffect. PresetShape: =msoTextEffectShapeArchUpPour;
: WordArt - TextEffect. PresetShape: ==msoTextEffectShapeBu11onCurve;
WordArt * TextEffect. PresetShape: ==ms oTextE f fect ShapeBut ton Pour;
6:WordArt.TextEffect.PresetShape: =^msoTextEffectShapeCanDown;
7:WordArt .TextEffect. PresetShape: =insoTextEffectShapeCanUp;
WordArt. TextEffect. PresetShape: s=siisoTextEffectShapeCascadeDown;
Кернинг регулирует интервалы между отдельными парами букв в зависимости от их формы.
WordArt. TextEf feet * PresetShape: i=smsoTextEf f ectShapeCascadeUp;
10:WordArt. TextEf feet. PresetShape: ^msoTextEffectShapeCircleCuuve;
end;
end;
Результаты изменения цвета текста и последующего применения этой про цедуры представлены на рис. 13.25.
Рис. 13.25. Изменение цвета и формы текста для объекта WordArt
Затем изменим способ расположения символов текста и интервал между символами (выполним трекинг).
;Изменение способа расположения символов и межсимвольного интервала
procedure TOKBottomDlg5.ToggleVerticalTextClick(Sender: TObject); begin
WordArt.TextEffeet.ToggleVerticalText;
end;
procedure TOKBottomDlg5.TrackingChange(Sender: TObject);
begin
WordArt. TextEf feet. Tracking: ^Tracking. Value *0.1;
end;
Результат выполнения этих процедур представлен на рис. 13.26.
Рис* 13.26. Изменяем способ расположения символов и интервал между символами для объекта WordArt
Коллекция Shapes позволяет создавать и работать с внешними объектами (OLE-объектами), свойства и методы работы с которыми применительно к документам Word были рассмотрены в предыдущих главах. За исключением незначительных особенностей для рабочих книг Excel все они аналогичны.
ГЛАВА 14
Диаграммы в рабочей книге Excel
В этой главе рассмотрены следующие темы:
口 программирование диаграмм Excel в Delphi;
口 коллекция Charts, размещение диаграммы и исходных данных;
□ тип диаграммы;
口 объектная модель диаграммы;
口 особенности некоторых типов диаграмм;
口 некоторые дополнительные элементы рядов диаграмм.
Программирование диаграмм Excel в Delphi
При решении задач отображения информации мы всегда сталкиваемся с проблемой нахождения наиболее эффективного способа, при котором значительный массив данных можно быстро представить пользователю для понимания и принятия правильного решения. Одним из способов решения этой проблемы является представление информации в графическом виде, особенно в объемном. Это связано с тем, что человек живет в трехмерном мире и взаимодействует с объемными объектами» отражая в своем сознании окружающий мир как связь пространства и времени.
Очевидно, что представление набора данных в объемном виде может донести до сознания больше информации за более короткий промежуток времени. Отсюда можно сделать простой вывод: если разрабатываемое приложение позволяет отображать данные в графическом виде, то за счет этого оно обладает существенными преимуществами по сравнению с приложениями, не предоставляющими пользователю такую возможность.
Приложение MS Excel обладает целым набором инструментов отображения информации в графическом виде, часть из которых мы рассмотрели ранее, В этой главе мы рассмотрим построение диаграмм. Диаграмма на рабочем листе Excel представляет собой объект. Как все объекты Excel, она имеет некоторые общие свойства, характеризующие и другие типы объектов (например, размеры м положение), а также свойства, которыми обладают только диаграммы*
Мы рассмотрим только особые свойства диаграмм.
Коллекция Charts, размещение диаграммы и исходных данных
Все диаграммы рабочей книги объединены в коллекцию Charts» свойства и методы которой позволяют добавлять новые диаграммы, хранить, удалять и обеспечивать доступ к любой диаграмме коллекции. Коллекция Charts имеет такие же свойства, как любая другая коллекция объектов Excel, но есть и некоторые отличия, обусловленные свойствами диаграммы, т. к. диаграмма может находиться на листе вместе с другими данными или занимать отдельный лист. Поэтому диаграмма и лист рабочей книги, а также коллекции, которым они принадлежат, могут иметь общие свойства и методы, которые придется учитывать при программировании приложений.
Для того чтобы создать новую диаграмму, а затем манипулировать общим списком диаграмм и получать доступ к отдельной диаграмме, достаточно воспользоваться одним свойством и двумя методами коллекции Charts. Свойство Count имеет тип Integer, его значение равно количеству диаграмм в рабочей книге. Метод Add создает новую диаграмму и возвращает ссылку на нее. Метод lteni() возвращает ссылку на созданную ранее диаграмму, принадлежащую коллекции Charts. Аргументом метода kem() является порядковый номер (индекс) или имя диаграммы в коллекции. Во втором случае аргументом метода Item является строка, содержащая имя диаграммы. Индексом может быть целое число со значением в диапазоне от 1 до Charts.Count.
Следующие две процедуры демонстрируют, как можно создать диаграмму, получив ссылку на нее, или получить доступ к существующей диаграмме с помощью индекса.
;Создание диаграммы и получение доступа к существующей диаграмме
procedure TForml.ButtonlClick(Sender: TObject);
begin
Chart: =E. Charts * Add;
Chart < ChartType: =xl ЗПСоТшкп;
Chart. SetSourceData (Source: =E. ActiveWorkbook. Sheets * Item[2] *
Range [ *A1: F5* ], PlotBy:^xlColumns);
end;
procedure TForml.ButtonlClick(Sender: TObject);
begin
Chart: ^E. Charts. Item [ 1 ];
end;
Результат выполнения первой процедуры, использующей метод Add, представлен на рис, 14.1.
Рис. 14.1. Диаграмма, созданная на отдельном листе
Первая процедура состоит из трех операторов: первый создает диаграмму и возвращает ссылку нее, два других, используя полученную ссылку, опреде-
ляют область значений для построения диаграммы и ее тип. Без этих двух операторов мы получили бы только пустую область диаграммы. Тип диа* граммы определяется значением свойства ChartType объекта Chart, имеющим целый тип и выбираемым из нескольких десятков констант. Метод SetSourceData определяет диапазон данных (область ячеек) листа рабочей книги, по которым будет строиться диаграмма. Первый аргумент этого метода определяет адрес области, второй — порядок использования ячеек в заданной области.
Важной характеристикой диаграммы также является место, где расположена сама диаграмма, определяемое с помощью метода Location объекта Chart. У этого метода два аргумента. Первый аргумент (типа Integer) определяет, будет диаграмма находиться на отдельном листе или на обычном листе с данным и > Если выбран второй вариант, то второй аргумент метода Location определяет имя листа, на котором будет располагаться диаграмма.
В нашем случае диаграмма создана на отдельном листе. С помощью следующих процедур переместим ее на первый лист рабочей книги ——туда, где располагаются данные для построения диаграммы, затем переместим обратно на отдельный лист (полный пример исходного текста приложения пред* ставлен на сопроводительном компакт-диске книги).
;Перемещение диаграммы на лист с данными
const
xlLocat ionAsNewSh.eet=l;
xl Locat i onAs Ob j ect=2;
procedure TForml.Button2Click(Sender: TObject);
begin
Chart * Location (Where: =x 1 LocationAsObject, Name:=1JlMCTl');
Chart:=E.ActiveChart;
end;
procedure TForml.Button3Click{Sender: TObject);
begin
Chart. Location (Where: =xlLocationAsNewSheet);
Chart:=E.ActiveChart;
end;
Обратите внимание на то, что после вызова метода Location необходимо снова получать ссылку на объект ActiveChart, т. к. переменная Chart после переноса диаграммы на новый лист уже не содержит ссылку на диаграмму,
В имеющемся на сопроводительном компакт-диске книги примере приложения эти процедуры будут правильно работать, если создана только одна диаграмма. Если их будет больше, то вам придется изменить исходный текст приложения.
На рис. 14.2 представлена диаграмма, которая была перенесена с отдельного листа. Обратите внимание на область ячеек в верхнем левом углу листа — она определена как область исходных данных.
,гw4,гw4
,гw4
,гw4
Рис. 14.2. Диаграмма, перемещенная на листе данными
Заполним первую строку области исходных данных диаграммы (т. е. область подписей делений) определенными значениями, а ячейки, определяющие значения точек данных, — случайными числами. Для этого можно использовать следующие процедуры.
function SetValueRange (sheet:variant; range: string; value_: var iant):boolean;
begin
SetValueRange:=True;
try
E.ActiveWorkbook.Sheets.Item{sheet]* Range[range]:=value_; except
Рис. 14.3. Заполняем диаграмму исходными данными
SetValueRange:=False;
end;
end;
procedure TForml.Button4Click(Sender: TObject); var a_:integer;
begin
randomize;
SetValueRange (*Лист11, *A1', *AAAA*);
SetValueRange('Лист!1,*B11,1BBBB');
SetValueRange('Лист!'J Cl','CCCb);
SetValueRange(^ист!*,1Dlf z1AAAA1);
SetValueRange('Лист】I 'EJ 3 BBBB');
SetValueRange ( 'JImsI ', ' Fl' J CCCC');
for a_:=2 to 5 do begin
SetValueRange (*Лист11 f fAf +inttostr (a_) ,a_-N);
SetValueRange(тЛист11,*BT+inttostr(a_),random(1000));
SetValueRange('Лист1','C'+int±ost工(a_),randco (1000));Se tValueRange{1Лист!1r 1D1+inttostr(a_),random(1000));
SetValueRange(^Лист!1,1Е'+inttostr(а_),random(1000));
SetValueRa^nge (* Лист11, 1F* +inttostr (а_), random (1000)); end;
end;
Результат выполнения данных процедур представлен на рнс. 14.3.
Тип диаграммы
Обычно тип диаграммы задается сразу после ее создания, но в процессе работы приложения иногда требуется изменить внешний вид диаграммы. Для этого используем свойство ChartType объекта Chart, позволяющее изменять тип диаграммы путем записи в него значения константы из заданного списка возможных значений.
Следующая процедура демонстрирует способ применения свойства ChartType. На рис. 14.4 и 14.5 показаны два из возможных типов диаграмм.
Рис. 14.4. Обычная гистограмма
Рис. 14.5* Объемный вариант круговой разрезанной диаграммы
;Изменение типа диаграммы
procedure TForml.ChartTypeClick(Sender: TObject); begin
Chart.ChartType:«ChartType.Itemlndex+51;
end;
Объектная модель диаграммы
Итак, мы создали диаграмму на основе некоторого массива значений и попытались изменить ее внешний вид. Но диаграмма, возможно, является одним из самых сложных объектов Excel. Поэтому, чтобы далее рассматривать ее свойства, необходимо получить представление о ее структуре, соответствующей объектной модели диаграммы.
Рассмотрим составляющие объекта Chart. Поскольку этот объект состоит из графических элементов, очевидно, что ббльшая часть свойств объекта Chart предназначена для их описания. На рис. 14.6 представлен состав объемного варианта обычной гистограммы.
I СГшНТШе 卜I СГшНТШе 卜13агстовок/аграммы |13агстовок/аграммы |ChartAreg ]ChartAreg ]I飞мДЙёз 卜I飞мДЙёз 卜I PloiArea]I PloiArea][значения[значенияAxis^tleAxis^tleI Comers }I Comers }[Legend [[Legend [Wag Ll_2] ^T^F^eW 吋Wag Ll_2] ^T^F^eW 吋$387,00$387,00$0300;$0200 $0100:$0000$0300;$0200 $0100:$0000$1000$0900|$888л00$0800$0700$0600$0500$0400$1000$0900|$888л00$0800$0700$0600$0500$0400egendEntryegendEntrySeriesSeries□ cm □ AAAA oBBBB ■ CCCC□ cm □ AAAA oBBBB ■ CCCCCCCCAAAA CCCC(, bbbb"1—^^^^]CCCCAAAA CCCC(, bbbb"1—^^^^]
I СГшНТШе 卜
I СГшНТШе 卜
13агстовок/аграммы |
13агстовок/аграммы |
ChartAreg ]
ChartAreg ]
I飞мДЙёз 卜
I飞мДЙёз 卜
I PloiArea]
I PloiArea]
[значения
[значения
Axis^tle
Axis^tle
I Comers }
I Comers }
[Legend [
[Legend [
Wag Ll_2] ^T^F^eW 吋
Wag Ll_2] ^T^F^eW 吋
$387,00
$387,00
$0300;
$0200 $0100:
$0000
$0300;
$0200 $0100:
$0000
$1000
$0900|$888л00
$0800
$0700
$0600
$0500
$0400
$1000
$0900|$888л00
$0800
$0700
$0600
$0500
$0400
egendEntry
egendEntry
Series
Series
□ cm □ AAAA oBBBB ■ CCCC
□ cm □ AAAA oBBBB ■ CCCC
CCCC
AAAA CCCC(, bbbb"1—^^^^]
CCCC
AAAA CCCC(, bbbb"1—^^^^]
Рис. 14.6. Состав диаграммы
Диаграмма состоит из области диаграммы, на которой расположены заголовок диаграммы, область построения диаграммы, сама диаграмма, легенда, заголовки (названия) осей диаграммы, подписи данных и др. Диаграмма, показанная на рис, 14.6, содержит основание, стены, оси и ряды значений. Чтобы представить, как эти объекты взаимодействуют между собой, рассмотрим краткое описание объектной модели диаграммы.
Chart Area — область диаграммы; представляет собой объект, описывающий поверхность, на которой находятся все элементы диаграммы.
ChartTitle — заголовок диаграммы; его основные свойства связаны с текстом и прямоугольной областью, в которой расположен этот текст.
PlotArea ——область построения диаграммы, которая представляет собой геометрическую фигуру с присущими ей свойствами.
Сама диаграмма ограничена тремя прямоугольниками: Floor — основание и Walls — две стены, которые также имеют свойства обычных геометрических фигур.
Corners ——углы, представляют собой точки по краям диаграммы.
Axes (коллекция, Axis — элемент коллекции)—— оси диаграммы; представляют собой линии, которые имеют заголовок оси (AxisTitle), могут иметь метки делений (TickLabels) и линии сетки (MajorGridLines — основные, MinorGridLines — промежуточные). Заголовок (или название) оси AxisTitle представляет собой объект, имеющий свойства обычной геометрической фигуры и свойства отображения текста. Линии сетки и осей имеют такие свойства, как цвет, тип и толщина.
Legend ——легенда; представляет собой прямоугольную область, включающую в себя элементы легенды (коллекцию LegendEntries, элемент коллекции ——
LegendEntry), которые в свою очередь содержат ключ легенды — Legend Key. Очевидно^ что легенда, как и ее составные элементы, описывается свойствами, аналогичными свойствам надписи (объекта TextBox).
Рассмотрим объекты, описывающие содержание диаграммы.
SeriesCollection ——ряды, включают в себя следующие объекты: коллек* цию Data Labels (элемент коллекции — DataLabel) — подписи данных, LeaderLines —— линии выноски, ErrorBars — линии (планки) погрешностей, коллекцию TrendLines (элемент коллекции ——TrendLine) — линии тренда (сглаживания и аппроксимации) и коллекцию Points (элемент коллекции — Point) — точки.
Точка (объект Point) может содержать объект DataLabel — подпись данных.
Рис. 14.7. Объектная модель диаграммы
В некоторых диаграммах, например в двухмерных, ряды данных можно группировать по некоторым признакам. Для этого используется коллекция ChartGroups (элемент коллекции ——ChartGroup). Дополнительную информацию могут нести элементы этой коллекции, которые в свою очередь содержат следующие объекты: SeriesLines — линии серий (рядов), Drop Lines — линии проекций, HiLoLines —— коридор колебания, UpBars —— полосы повышения, DownBars ——полосы понижения.
Диаграмма обладает еще и свойствами, знакомыми вам по предыдущим главам: Shapes ——коллекция графических объектов, которые можно разместить непосредственно на области диаграммы; OLEObjects ——коллекция внешних объектов (OLE-объектов), также размещаемых на области диаграммы; PageSetup — параметры страницы, это свойство предназначено для подготовки вывода диафаммы на печать.
Данное описание диаграммы лучше представить в графическом виде. На рис, 14.7 представлена объектная модель объекта Chart.
Данное представление является общмм м статичным. Для более детального изучения объектной модели диаграммы нужно ознакомиться с тем, как взаимодействуют ее элементы в динамике, как используются свойства и методы элементов диаграммы, и установить взаимосвязь между изменениями свойств объектов и визуальным отображением происходящих изменений. Для этого продолжим изучение модели на основе конкретных программных примеров. Поскольку мы рассматриваем применение среды визуального программирования Delphi, все исходные тексты приведены на языке Pascal. Полные исходные тексты приложений представлены на сопроводительном компакт-диске книги.
Область диаграммы
Визуальными параметрами области диаграммы являются заливка, линия границы, шрифт, наличие тени. Чтобы манипулировать этими свойствами, достаточно получить к ним доступ. Поскольку они принадлежат области диаграммы, а значит, объекту ChartArea, изменение заливки обеспечивается изменением свойства Fill или Interior объекта, изменение толщины, цвета и типа линии границы ——изменением свойства Border объекта, а изменение шрифта для текста диаграммы —— настройкой свойств объекта Font. Свойство Shadow:Boolean определяет наличие тени. Рассмотрим примеры процедур.
:Настройка свойств заливки области диаграммы
var Variant:integer; Degree:real;
procedure TOKBottomDlg3•ForeColorlChange(Sender: TObject);
10 Зак. 723
begin
ChartArea. Fill * ForeColor. SchemeColor: =ForeColorl • Value; end;
procedure TOKBottomDlg3.GradientStу1eChange{Sender: TObject)? begin
ChartArea.Fill.OneColorGradient(msoGradientHorizontal,Variant,Degree); end;
На рис. 14.8 приведен результат выполнения этих процедур.
Гваиивнгная |t(h,ctvh| У»ф | Рнсм|Гваиивнгная |t(h,ctvh| У»ф | Рнсм|Ц1СМ9ГЦ1СМ9ГОвлвсть bni««t|Овлвсть bni««t|О&мотъ 时О&мотъ 时ДАДАДАДА34r50VKJ34r50VKJ08898■СССС □ ММ 0ЭВ6В ■сссс08898■СССС □ ММ 0ЭВ6В ■ссссСтяг грэдим^] riHoG,》(S«r«Hc№Wtf * 七Стяг грэдим^] riHoG,》(S«r«Hc№Wtf * 七ЗоЛМ1№» otin4ctMЗоЛМ1№» otin4ctMРис. 14.8* Изменение свойств заливки области диаграммыРис. 14.8* Изменение свойств заливки области диаграммы
Гваиивнгная |t(h,ctvh| У»ф | Рнсм|
Гваиивнгная |t(h,ctvh| У»ф | Рнсм|
Ц1СМ9Г
Ц1СМ9Г
Овлвсть bni««t|
Овлвсть bni««t|
О&мотъ 时
О&мотъ 时
ДАДА
ДАДА
34r50VKJ
34r50VKJ
08898
■СССС □ ММ 0ЭВ6В ■сссс
08898
■СССС □ ММ 0ЭВ6В ■сссс
Стяг грэдим^] riHoG,》(S«r«Hc№Wtf * 七
Стяг грэдим^] riHoG,》(S«r«Hc№Wtf * 七
ЗоЛМ1№» otin4ctM
ЗоЛМ1№» otin4ctM
Рис. 14.8* Изменение свойств заливки области диаграммы
Рис. 14.8* Изменение свойств заливки области диаграммы
Заголовок диаграммы
Чтение и изменение свойств заголовка диаграммы производятся с помощью объекта ChartTitle, но для доступа к этому объекту необходимо активизировать заголовок, иначе объект ChartTitle и сам заголовок будут недоступны. Это делается путем установки свойства Chart.HasTitle в значение True (для скрытия заголовка этому свойству присваивается значение False). Получив доступ к заголовку, мы можем изменить и его содержание и параметры области, в которой он разметен. Для этого используем свойства Font
(шрифт), Border (линия границы). Interior и Fill (свойства заливки), Shadow (наличие тени). Left и Тор (координаты расположения заголовка) объекта ChartTitle.
i Изменение свойств заголовка диаграммы
procedure TOKBottomDlg2.HasTitleClick(Sender: TObject); begin
Chart * HasTitle: Wrue;
Chart * ChartTitle * Text: =' Заголовок диах^шлы*;
end;
procedure T0KBottcmDlg2.ShadowClick(Sender: TObject); begin
Chart. ChartTitle. Shadow: =Shadow. Checked;
end;
На рмс, 14.9 представлен заголовок диаграммы, измененный при выполнении приведенных процедур.
Рис< 14.9. Настройка заголовка диаграммы
Область построения диаграммы, основание и стены диаграммы
Область построения диаграммы, основание и стены диаграммы представляют собой поверхности, ограниченные линией. Следовательно, свойствами этих объектов являются параметры линии и заливки. В дополнение у области построения диаграммы имеются свойства» позволяющие задать ее координаты и размеры. Свойство Border определяет толщину, цвет и тип линии границы, свойства Interior н Fill —— цвет и способ заливки внутренней области.
Заголовок диаграммыЗаголовок диаграммы囚 вввв■ 88□ ААДА□ ВВВВ■ СССС囚 вввв■ 88□ ААДА□ ВВВВ■ ССССРис. 14.10. Настройка области построения диаграммы, стен и основания диаграммыРис. 14.10. Настройка области построения диаграммы, стен и основания диаграммы
Заголовок диаграммы
Заголовок диаграммы
囚 вввв
■ 88
□ ААДА
□ ВВВВ
■ СССС
囚 вввв
■ 88
□ ААДА
□ ВВВВ
■ СССС
Рис. 14.10. Настройка области построения диаграммы, стен и основания диаграммы
Рис. 14.10. Настройка области построения диаграммы, стен и основания диаграммы
Нзменнм с помощью этих свойств характеристики области построения диаграммы, а также стен и основания диаграммы, например, выполнив следующую процедуру.
Изменение свойств области построения диаграммы, основания и стен диаграммы
const XlDots-4118;
begin
Chart. PlotArea. Border. Weight: =1;
Chart.PlotArea•Border.Linestyle:=xlDot;
Chart.Floor.Border.Color:^RGB(0,200,0);
Chart.Floor * Border.Weight:=4;
Chart.Walls,Border.Color:=RGB(0,0,200);
Chart.Walls.Border.Weight:=4;
Chart.Walls.Interior,Color:=RGB(255,255,255); end;
Результат выполнения этой процедуры может быть примерно таким, как показано на рмс* 14.10*
Легенда
Доступ к свойствам легенды диаграммы осуществляется посредством объекта Legend, являющегося свойством диаграммы Chart. Для открытия доступа к объекту Legend необходимо присвоить свойству HasLegend объекта Chart значение True, после чего легенда диаграммы отобразится в области диаграммы и будет доступна для изменений.
Легенда представляет собой прямоугольную область, для которой можно изменить визуальные свойства заливки и линии границы. Оператор
Legend:=Chaгt* Legend;
возвращает в переменную Legend:variant ссылку на объект илегенда". После этого можно непосредственно обращаться к этой легенде. Доступ к линии границы легенды обеспечивает свойство Border, к заливке ——свойство Interior или Fill. Используя эти свойства, изменим внешний вид легенды,
J Настройка заливки и линии границы легенды
const msoPatternHorizontalBrick=35;
var Legend:variant;
procedure TForm.WeightChange(Sender: TObject);
begin
Legend.Border,Weight:=Weight.Value; end;
procedure TForm*Patternchange(Sender: TObject);
begin
Legend.Fill.Patterned(Pattern: =TnsoPatternHorizontalBrick);
end;
procedure TForm.ForeColor3Change(Sender: TObject};
begin
Legend.Fill* ForeColor.Sch^neColor:=ForeColor3.Value;
end;
procedure TForm.BackColor3Change(Sender: TObject); begin Fill.BackColor.SchemeColor:=BackColor3.Value;
end;
Результат использования представленных процедур показан на рис. 14.1 L
図 вввв図 вввв11□ ДАДД□ ДАДД□ вввв■ DLU□ вввв■ DLU
図 вввв
図 вввв
1
1
□ ДАДД
□ ДАДД
□ вввв
■ DLU
□ вввв
■ DLU
Рис. 14.11. Изменены заливка и линия границы легенды
Легенда включает в себя дополнительные объекты, объединенные в коллекцию Legend Entries. Это элементы легенды, их количество совпадает с количеством рядов диаграммы. У элемента легенды есть свойство Font для настройки шрифта текста м единственный дополнительный объект — ключ легенды. Ключ имеет свойства линии границы и заливки.
Доступ к элементам легенды осуществляется посредством коллекции Legend Entries с помощью индекса элемента (целого числа из диапазона от 1 до LegendEntries.Count, где Count — количество элементов легенды).
Настроим свойства легенды, выполнив следующие процедуры.
;Изменение свойств элемента легенды
procedure TForml. FormShow (Sender: TObj ect);
var a_:integer;
begin
// Загружаем список элементов легенда в ListBox ListBoxl. Items. Clear;
for a_:=l to Legend.LegendEntries * Count do begin
ListBoxl, Items, Add (inttostr (a_)); end;
end;
procedure TForml.ButtonlClick(Sender; TObject);
begin
// Получаем ссылку на элемент легенды
1:«2;
LegendEntry;=Legend* LegendEntries.item[i];
// Получаем ссылку на клюй легенда
LegendKey:= LegendEntry.LegendKey;
// Изменяем толШну линии.
LegendKey•Border.Weight:=4;
/ / Изменяем цвет запивки
LegendKey* Interior.Color:=RGB(200,50,0);
// Получаем доступ к шрифту надписи и изменяем его.
LegendEntгу•Font.Size:=16;
end;
Результат выполнения этих процедур представлен на рис. 14.12 и 14.13.
( Примечание )
При программировании объектов, изменяющих визуальные свойства ключа легенды, необходимо учитывать тот факт, что это приводит к соответствующим изменениям свойств рядов диаграммы
Ав D DD D йи DDE5D
□ ААДА
n RRQR II ODuD
■ cccc
Рис. 14.12. Изменена линия и заливка ключа легенды
口 1Mp шрифГа口 1Mp шрифГа^&^"Tines New Romen VerdaM^&^"Tines New Romen VerdaMГ* Пощ,еркнугь|А 口卄 {бЙ^^Ё^й^3 ' ^4бор символов.Г* Пощ,еркнугь|А 口卄 {бЙ^^Ё^й^3 ' ^4бор символов.Полу)м<»ый лслужиргшй курсь*Полу)м<»ый лслужиргшй курсь*ОфмвцОфмвц口日1口日1"1 巨二值11tlм|2б|2е"1 巨二值11tlм|2б|2еАаВЬАаОо '11IАаВЬАаОо '11I
口 1Mp шрифГа
口 1Mp шрифГа
^&^"
Tines New Romen VerdaM
^&^"
Tines New Romen VerdaM
Г* Пощ,еркнугь|А 口卄 {бЙ^^Ё^й^3 ' ^4бор символов.
Г* Пощ,еркнугь|А 口卄 {бЙ^^Ё^й^3 ' ^4бор символов.
Полу)м<»ый лслужиргшй курсь*
Полу)м<»ый лслужиргшй курсь*
Офмвц
Офмвц
口日1
口日1
"1 巨二值11tlм|2б|2е
"1 巨二值11tlм|2б|2е
АаВЬАаОо '
11I
АаВЬАаОо '
11I
Рис. 14.13. Изменен шрифт текста элемента легенды
Оси
Оси диаграмма представляют собой линии с метками. Двухмерные диаграммы имеют ось значений и ось категорий, а трехмерные ——еще и ось ряда данных. Оси предназначены для более наглядного отражения содержимого диаграммы. Вся информация об осях содержится в коллекции Axes объекта Chart. Понятно, что эта коллекция может содержать не более трех элементов-осей. Элемент коллекции Axes представляет собой объект Axis, объединяющий в себе все свойства выбранной оси. Для выбора объекта Axis из коллекции осей используется метод ltem(i). Аргумент i метода представляет собой числовую константу, выбранную из трех возможных (xlCategoiy=l, xlValue=2, xlSeriesAxis~3). Соответственно мы можем получить ссылку на один из объектов: ось категорий, ось значений или ось ряда данных.
Рассмотрим свойства выбранной осн. Каждая ось может содержать заголовок (название), метки оси, основные и промежуточные линии сеткн* Все эти элементы имеют такие свойства, как цвет, тип и толщина линий, заливка, ширина меток и шрифт текста. Кроме того,- можно удалить или отобразить выбранную ось. Для этого используется свойство HasAxis(i) объекта Chart. Например, оператор
Chart.HasAxis(xlValue):=True;
отобразит^ а оператор
Chart.HasAxis (xlValue) :=Ealsg;
скроет ось значений. Сама ось значений имеет такие же свойства, как обычная линия, их можно настраивать; доступ к ее свойствам осуществляется посредством объекта Axis. Border.
Доступ к заголовку оси осуществляется посредством объекта Axis.AxisTitle. Заголовок оси состоит из линии границы, заливки и текста. Поэтому у объекта AxisTitle есть свойства Border, Interior, Fill, Caption и Font, связанные с соответствующими визуальными элементами заголовка.
Метки оси представляют собой текст, отображающий соответствующее значение. Доступ к свойствам меток осуществляется посредством объекта Tick Labels, принадлежащего объекту Axis. Свойства Number Format, Orientation, Font объекта TickLabels позволяют задавать формат, направление и шрифт текста меток.
Ось имеет основные и промежуточные линии сетки, доступ к которым осуществляется посредством свойств MajorGndlines и MinorGridlines объекта Axis. Эти свойства сами представляют собой объекты, обладающие свойством линии (Border). Показать/скрыть линии сетки позволяют свойства HasMajorGridlines и HasMinorGridlines объекта Axis.
Линия оси также может содержать линии основных и промежуточных меток, Тип этих линий определяется путем записи числовых констант в свойства MajorTickMark и MinorTickMark объекта Axis.
Выберем ось значений и настроим ее свойства с помощью следующих про* цедур.
Задание свойств оси значений
procedure TForml. BorderAxesClick (Sender: TObject);
var Axis, Border:variant;
begin
Axis:=CharteAxes.Item(xlValue); // Получаем доступ к оси значений
Border:=Axis.Border;// Получаем доступ к линии оси значений
Border.Color:=RGB(200,0,0); // и настраиваем ее свойства
Border.Weight:=4;
end;
// Показываем заголовок оси значении, получаем доступ
// к нему и настраиваем его свойства
procedure TForml.НаsTitieClick(Sender: TObject);
var AxisTitle:variant;
begin
Axis.HasTitle:=True;
AxisTitle:=Axis>AxisTitle;
AxisTitle.Border.Color:=RGB(0,200,200);
AxisTitle*Interior.Color:«RGB(200,200, 0);
AxisTitle.Caption:=1Значения';
AxisTitle.Font.Size:^24;
end;
// Получаем доступ к меткам делений оси и настраиваем их свойства
// (шрифт, формат числовых меток и направление текста (угол)) procedure TForml*ButtonlClick(Sender: TObject);
var TickLabels:variant;
begin
TickLabels:=Axig.TickLabels;
TickLabels.Font,Size:=20;
TickLabels. NumberForniat: = * $00001;
TickLabels. Orientation: =0;
end;
// Получаем доступ к меткам делений оси и настраиваем их свойства
// (толщину и цвет основных линий меток)
procedure Tfoml.HasMajorGridlinesClick(Sender: TObject);
var MajorGridlines:variant;
begin
Axis.Ha sMaj orGridlines:=True;
Axis.HasMinorGridlines:=False;
Maj orGridl ines: «Axis. Ma joxXSridl ines;
MajorGridlines .Border * Weigh t:=2;
Ma j orGridlines. Border. Color: =GRB (0,0,0); end;
// Показываем линии основных и прсалежуточных меток.
procedure TForml*Button?(Sender: TObj ect);
const
xLTickMarkCross=4;
xlTickMarkInside=2;
begin
Axis. Maj QrTickMark: =xlTickMarkCross;
Axis ・ MinorTickMark: =xlTicJdMarkInside; end;
Результат всех этих преобразований может иметь вид, показанный на рис. 14.14.
ПЙ1:"},“• .: ;:,. ■ —■ — . 一—— —КС电ПЙ1:"},“• .: ;:,. ■ —■ — . 一—— —КС电厂占田兩орл*I珈3 ■_ 中呷Е冲产騒,喘*小22. /51用
ПЙ1:"},“• .: ;:,. ■ —■ — . 一—— —КС电
ПЙ1:"},“• .: ;:,. ■ —■ — . 一—— —КС电
炉田口@口炉.; ' В f…,学•" ••••. 3中/ - t:l
$387,00$387,00П*чоснсиуток на4»Л>|didMaJCoM-4. ・|I Г Прамвжу«л№в лил ит> н **нвмий 仙*』 |Пцпреижи им», ндн*4ле1КДПА1:ТДЧМ1тП*чоснсиуток на4»Л>|didMaJCoM-4. ・|I Г Прамвжу«л№в лил ит> н **нвмий 仙*』 |Пцпреижи им», ндн*4ле1КДПА1:ТДЧМ1танигцмммг*анигцмммг*■»$№№* I二応二-?「iАиашж v3».」—± —: .В Плюй#» иптжк■»$№№* I二応二-?「iАиашж v3».」—± —: .В Плюй#» иптжкМепшкиМепшки中 t/vrJtOOOQL中 t/vrJtOOOQLЗаголовок диаграммыЗаголовок диаграммы$971,00$971,00* Осно1иы* гмжн сатнм чнпеинА* Осно1иы* гмжн сатнм чнпеинА0°99。0°99。Г|*£Г4««»м[5№№*®"Г|*£Г4««»м[5№№*®"WpwWpwй«« I MtRu 脏・岡 I DaiMerx IHIй«« I MtRu 脏・岡 I DaiMerx IHI摩鼻丄 ・工? ж < ы ^;®31 i;:h?;»-', . • •- _,f
$387,00
$387,00
П*чоснсиуток на4»Л>|didMaJCoM-4. ・|
I Г Прамвжу«л№в лил ит> н **нвмий 仙*』 |
Пцпреижи им», ндн*4ле1КДПА1:ТДЧМ1т
П*чоснсиуток на4»Л>|didMaJCoM-4. ・|
I Г Прамвжу«л№в лил ит> н **нвмий 仙*』 |
Пцпреижи им», ндн*4ле1КДПА1:ТДЧМ1т
анигцмммг*
анигцмммг*
■»$№№* I二応二-?「i
Аиашж v3».」—± —: .В Плюй#» иптжк
■»$№№* I二応二-?「i
Аиашж v3».」—± —: .В Плюй#» иптжк
Мепшки
Мепшки
中 t/vrJtOOOQ
L
中 t/vrJtOOOQ
L
Заголовок диаграммы
Заголовок диаграммы
$971,00
$971,00
* Осно1иы* гмжн сатнм чнпеинА
* Осно1иы* гмжн сатнм чнпеинА
0°99。
0°99。
Г|*£Г4««»м[5№№*®"
Г|*£Г4««»м[5№№*®"
Wpw
Wpw
й«« I MtRu 脏・岡 I DaiMerx IHI
й«« I MtRu 脏・岡 I DaiMerx IHI
|Ц 1 г «|\Дивгрвм»«1/^Г/А^2/Лйп5 / ГОТОЮ
Рис. 14.14. Настройка оси значений диаграммы
Ряды и точки
Мы подошли к самому главному — отображению значений диаграммы. Известно, что диаграмма может содержать не одну последовательность значений. Каждая такая поеледовательность представляет собой ряд, состоящий из точек.
Точка отражает одно значение из последовательности значений определенного ряда. Точки одного ряда могут быть соединены между собой линиями или представлять собой отдельные плоские или объемные фигуры, это зависит от выбора типа диаграммы. В любом случае точки имеют между собой логическую связь и образуют ряды значений. Таким образом, при программировании значений диаграммы мы имеем дело как минимум с двумя типами объектов: это объекты, объединенные в коллекцию рядов SeriesCollection, и объекты, объединенные в коллекцию точек Points. Коллекция точек принадлежит ряду.
Как и любая коллекция, коллекция SeriesCollection обладает свойствами, позволяющими определить количество элементов этой коллекции, и мето-
дами, обеспечивающими доступ к любому объекту этой коллекции. Метод ltem(i) коллекции SeriesCollection возвращает доступ к элементу Series коллекции. Получив доступ к элементу коллекции, т. е. к ряду диаграммы, мы имеем возможность настроить его внешний вид. Для этого, как и для аналогичных объемных или плоских элементов, используем объекты Border, Interior и Fill, связанные с параметрами границ и внутренней области объектов, отображающих точки ряда диаграммы.
Доступ к ряду и его свойствам
var i:integer;
i:=l;
//
Ссыпка
на
//
Ссылка
на
//
Ссылка
на
//
Ссыпка
на
первый ряд диаграммы линию гранииы внутреннюю область заливкупервый ряд диаграммы линию гранииы внутреннюю область заливкуSeries:=SeriesCollection(i);
первый ряд диаграммы линию гранииы внутреннюю область заливку
первый ряд диаграммы линию гранииы внутреннюю область заливку
Borde r:=Series ・ Border;
Interior:=Series.Interior;
Fill:=Series* Fill;
Используя эти свойства, мы можем изменить параметры линии границы элементов, а также их заливку (рис. 14.15).
Рис. 14.15. Настройка элементов диаграммыРис. 14.15. Настройка элементов диаграммы
Рис. 14.15. Настройка элементов диаграммы
Рис. 14.15. Настройка элементов диаграммы
Подписи данных для точек ряда диаграммы также представляют собой геометрические фигуры, содержащие текст. Доступ к ним обеспечивается посредством объекта DataLabels, который принадлежит объекту Series из коллекции SeriesCollection. Их внешний вид определяется свойствами линии и заливки, а также свойствами текста. Свойства текста определяются его тн・ пом, шрифтом, способом выравнивания в рамках прямоугольной области объекта Data Labe Is, форматом отображения значений и углом поворота (направлением).
:Настройка свойств подписей данных для точек ряда диаграммы
DataLabels:variant;
// Выбор типа подписи
procedure TOKBottomDlg8.LabelsTypeChange(Sender: TObject); begin
case LabelsType.Itemindex of
0: XIDataLabelsType:^xlDataLabelsShowNone;
XlDataLabelsType:=xlDataLabelsShowValue;
XlDataLabelsType:=xlDataLabelsShowPercent;
XlDataLabelsType:=xlDataLabeIsShowLabel;
XIDataLabe 1 sType: ^xlDataLabelsShowLabelAndPercent;
end;
Series -ApplyDa taLabels (Type :=X1 Da taLabe Is Type); end;
// Выбор числового формата для отображения значений
procedure TOKBottomDlgB. s Number Format Change (Sender: TObject);
begin
DataLabels:=Series* DataLabeIs;
Dat a Labels, Number Format: =sNumber Format * Text; end;
// Горизонтальное выравнивание текста
procedure TOKBottomDlg8.sHorizontalAlignmentChange(Sender: TObject); begin
case sHorizontalAlignment. Itemlndex of
0: DataLabels*HorizontalAlignment: =xlHAlignCenter;
DataLabels*HorizontalAlignment:=xlHAlignLeft;
DataLabels.HorizontalAlignment:=xlHAlignRight;
end;
end;
// Вертикальное выравнивание текста
procedure TOKBottomDlg8.sVertiсa1A1ignmentChange(Sender: TObject);
begin
case sHorizontalAlignment * Itemindex of
0: DataLabels.VerticalALignment:^xlVAlignBcttom;
DataLabels*VerticalAlignment:^xlVAlignCenter;
DataLabels. VerticalAlignment: ^xlVAlignTop;
end;
end;
// Угол (направление) текста
procedure TOKBottomDlgB.sOrientationChange《Sender: TObject); begin
DataLabels.Orientation:=sOrientation.Value;
end;
Настраивая эти свойства, можно существенно изменить внешний вид диа
граммы, а возможность сочетать варианты выбора позволяет представить
X Hitiokait t ясе! Кмм*о2НмВX Hitiokait t ясе! Кмм*о2НмВинформацию пользователю наиболее наглядно (рис. 14*16).
X Hitiokait t ясе! Кмм*о2НмВ
X Hitiokait t ясе! Кмм*о2НмВ
;艺 а«йл 0p・Q fix 8bA・,oow q< 3b*»« U*«J 2,A)三J
須居口产m*4sl0 R:H「, ■「' J.。■"•翅-
AAAAAAAA8BBB8BBB由 вввв □ rar □ AAAA □ BBBB ■ CCCC由 вввв □ rar □ AAAA □ BBBB ■ CCCC
AAAA
AAAA
8BBB
8BBB
由 вввв □ rar □ AAAA □ BBBB ■ CCCC
由 вввв □ rar □ AAAA □ BBBB ■ CCCC
■小倒仙*₽«:小以痴2 Kly二—
'匕"馬? e g睦® 』『叫5』1更。5mf 6pm-1」|羅Mg』EE. . :,留■*■五唸 痴
Рис. 14.16, Настройка подписей ряда диаграммы
Интересные возможности предоставляет применение формата, задаваемого строкой символов и позволяющего задать необходимый вид для числового
значения. Для задания формата чисел можно использовать символы 0, #, ?, $ и т. д, (их список ограничивается только вашей фантазией и требованиями пользователей). Формат чисел, показанных на рис. 14.16, задан следующим оператором:
DataLabeIs.NumberFormat: = * $000,00т;
В рамках выбранного типа диаграммы объект Series дает возможность изменять фигуру дяя точек ряда. Это осуществляется записью определенной константы в свойство BarShape объекта Series. Следующая процедура позволяет это сделать.
i Изменение вида фигуры для точек ряда диаграммы
procedure TOKBottomDlg8.sBaгShapeChange(Sender: TObject>;
const xlPyramidToPoint®!;
begin
Series.BarShape:^ xlPyramidToPoint; end;
В данном случае мы устанавливаем отображение точки ряда в виде пирамиды (рис. 14.17).
Если внимательно рассмотреть диаграммы на рис. 14.16 и 14.17, то мы обнаружим отклонение стиля второй точки от остальных точек этого ряда. Это достигается путем изменения свойств выбранной точки данного ряда. Точки ряда диаграммы объединены в коллекцию Points, свойства и методы которой обеспечивают доступ к любой точке ряда. Свойство Count этой коллекции содержит количество элементов коллекции, а метод ltem(i:integer) возвращает ссылку на элемент коллекции. Чтобы не повторяться, достаточно отметить, что свойства объекта Point в большей степени идентичны свойствам объекта Series. Программирование свойств этого объекта более детально представлено в исходном тексте приложения на сопроводительном компактдиске книги.
Рассмотрим еще одно свойство объекта Series, являющееся альтернативой задания области исходных данных для построения диаграммы. Это свойство имеет строковый тип н содержит формулу, по которой строится ряд диаграммы. Свойство Formula принадлежит непосредственно объекту Series.
Следующая процедура иллюстрирует его использование для получения выражения формулы (рис. 14.18).
Получение строки, содержащей формулу для заданного ряда
procedure TOKBottomDlg8.Buttonl6Click(Sender: TObject); var eee_:string;
Х№Е«уПЕЕКнмгд?—一■□&Х№Е«уПЕЕКнмгд?—一■□&"Ei 里и QpB♦营,П йс*ж# 屮ОСЧВ £«・С ДИЕИЛМЛ fliue ?'Т 原J2cl
Х№Е«уПЕЕКнмгд?—一■□&
Х№Е«уПЕЕКнмгд?—一■□&
'口* Q⑥值h 跄Ife, 一“*- a I • 0
!за「°лов°кпиа「раммы]…叩―
1000800600400200010008006004002000\S、99NS\S、99NS□ ВВВ0 □ сссс □ АААА □ вввв□ ВВВ0 □ сссс □ АААА □ вввв
1000
800
600
400
200
0
1000
800
600
400
200
0
\S、99NS
\S、99NS
□ ВВВ0 □ сссс □ АААА □ вввв
□ ВВВ0 □ сссс □ АААА □ вввв
Рис. 14.18. Формула для построения рядаРис. 14.18. Формула для построения ряда
Рис. 14.18. Формула для построения ряда
Рис. 14.18. Формула для построения ряда
begin
eee_:=Series.Formula;
MessageBox(handle,pchar(eee_), *',0); end;
Используя формулы для объекта Series, можно изменить область исходных данных для построения ряда.
Следующий оператор изменяет границы области исходных данных построен ния для выбранного ряда диаграммы:
Series. FormulaLocal - '^SERIES (一 Лист! • R5C 1:R5C7,2)1
Объемные диаграммы
Объемный вид анаграммы определяется горизонтальным и вертикальным углами поворота, изометрией и другими параметрами, влияющими на вид трехмерной проекции. Объект Chart обладает следующими свойствами, позволяющими изменить диаграмму объемного вида: Rotation — поворот (в горизонтальной плоскости), Elevation — возвышение (поворот в вертикальной плоскости), Perspective — перспектива, RightAngleAxes — нзомет- рия, AutoScaling — автомасштаб, Height Percent — высота в процентах от нормальной высоты. Все перечисленные свойства имеют числовой тип, за исключением свойства AutoScaling, имеющего логический тип. Значения этих свойств можно считывать и изменять.
Следующие операторы позволяют определить значения параметров объемной диаграммы.
:Задание свойств объемной диаграммы
j f田'…".“"“・“""Г»^^»^^-»^^^»^^^^^^^^^…"♦"“"・""屮伙:„./w":""""胃
:Изменение возвышения и поворота диаграммы
procedure TOKBottomDlglO.ElevationChange(Senderг TObject); begin
Chart. Elevation: =Elevat ion. value; end;
procedure TOKBottomDlglO.Rotationchange(Sender: TObject); begin
Chart.Rotation:=Rotation.Value;
end;
На рис. 14.20 видны результаты этих изменений.
Используя свойство RightAngleAxes объекта Chart, изменяем изометрию объемной диаграммы.
Рис. 14.20. Вращение диаграммы в двух плоскостях
Рис. 14.21. Изометрический вид диаграммы
Особенности некоторых типов диаграмм
Очень часто диаграммы предназначены для изучения сравнительных характеристик каких-либо процессов, которые они отражают. Обычно в этих случаях диаграмма должна содержать не менее двух рядов. Для сравнения ря-
дов на одной диаграмме можно использовать дополнительные графические элементы, причем для разных типов диаграмм можно использовать присущие только нм специфические элементы диаграмм. Очевидно, что создавать такие элементы и управлять ими можно, когда между основными рядами диаграммы есть логическая связь.
Коллекция ChaiiGroups объекта Chart позволяет создавать дополнительные элементы, отражающие взаимосвязь и сравнительные характеристики рядов диаграммы, и управлять ими. Коллекция ChartGroups имеет свойство Count (количество ее элементов) и метод Item(iiinteger) (ссылка на элемент коллекции). У нее нет методов, позволяющих создавать новые элементы — значение свойства Count определяется типом и составом диаграммы.
Линии серий (рядов)
Для плоских гистограмм с накоплением есть возможность отобразить линии серий (рядов). Они представляют собой прямые, соединяющие границы об* ластей значений соседних рядов. Если изменить тип диаграммы, приведя ее к объемному виду, то линии серий, отображавшиеся на плоской диаграмме, исчезнут. Для включения режима отображения линий серий используем свойство HasSeriesLines объекта ChartGroup, установив его в значение True* Цвет и другие свойства линий серий определяются свойством Border объекта Series Lines. Объект SeriesLines в свою очередь принадлежит объекту ChartGroup. Рассмотрим следующую процедуру.
;Отображение линий серий на диаграмме
const xlColumnStacked=52;
procedure TOKBottomDlgll.HasSeriesLinesClick(Sender: TObject);
var ChartGroup:variant;
begin
Chart. ChartType: =xl Columnst a c ked;
ChartGroup: =Chart. Chart Groups. Item (1);
ChartGroup. HasSeriesLines: =HasSeriesLines * Checked;
if HasSeriesLines.Checked then begin
ChartGroup.SeriesLines.Border.Colorindex:=32;
ChartGroup.SeriesLines.Border.Weight:=4;
end;
end;
Первый оператор представленной процедуры устанавливает нужный тип диаграммы, второй возвращает ссылку на элемент коллекции ChartGroups. Далее устанавливаем режим отображения линий серий и настраиваем их параметры. Результат показан на рис. 14.22.
Рис* 14.22. Линии серий на диаграмме
Линии проекции
Линиями проекции называются прямые линии, соединяющие точки данных с осью категорий. Для отображения линий проекции используются элементы коллекции ChartGroups объекта Chart. Чтобы отобразить проекцию, нужно присвоить значение Тше свойству HasDropLines объекта ChartGг。up, что дает возможность доступа к объекту DropLines элемента коллекции.
:Примечание )
Не все типы диаграмм поддерживают линии проекции, поэтому предварительно необходимо задать допустимый тип диаграммы (линейчатые диаграммы, диаграммы с накоплением).
Рассмотрим создание линий проекции на следующем примере.
”,m„,„у„..^..^^^“…♦”丁叱5."."2・….—""…""3……f ]
;Отображение линий проекции на диаграмме
const xlLine=4;
procedure TOKBottomDlgll.HasDropLinesClick(Sender: TObject);
var ChartGroup:variant; begin
Chart. Chart Type : =xlLine;
ChactGroup:=Chart.ChartGroups.Item(l);
ChartGroup,HasDropLines:=HasDropLines.Checked;
if HasDropLines.Checked then ChartGroup.DropLines.Border.Colorindex:=3; end;
Коридор колебания (изменения)
Коридор колебания (изменения) на плоских диаграммах отображается линиями, идущими от максимального до минимального значения в каждой категории.
Для отображения коридора колебания нужно установить свойство HasHiLoLines объекта ChartGroup в значение True. После этого настройка свойств линий коридора будет доступна через свойства объекта HiLoLines, принадлежащего элементу коллекции ChartGroup.
Рассмотрим построение линий коридора колебания на примере графиков. Следующая процедура позволяет отобразить и настроить цвет линий коридора колебания.
................... ^***^二曰.r"""2‘"""""丁:"""**"**""*"".** ;
:Отображение настройка цвета линий коридора колебания
procedure TOKBottomDlgll»HasHiLoLinesClick(Sender: TObject);
var ChartGroup:variant;
begin
Chaxt,ChartType:^xlLine;
ChartGroup:-Chart»ChartGroups.Item(1);
ChaгtGroup*HasHiLoLines:=HasHiLoLines.Checked;
if HasHiLoLines.Checked then
ChartGroup.HiLoLines.Border・ Colorindex:=5;
end;
Результат выполнения этой процедуры представлен на рис. 14.24.
Рис. 14.24* Коридор колебания для диаграммы из трех графиков
Полосы понижения и повышения
Полосы понижения и повышения отображают сравнительную характеристику двух (и более) рядов данных диаграммы в точках построения. Для настройки этих элементов предназначены объекты UpBars и Down Bars, принадлежащие элементу коллекции ChartGroups, а отображение этих элементов обеспечивается записью значения True в свойство HasUpDownBars объекта ChartGroup.
Следующая процедура позволяет отобразить полосы понижения н повышения на диаграмме в виде графиков, а также настроить цвет их линий границы.
(
^ym4V.,^»^.^^»^^»^...r-«r^rvr^''^"'r^-'»^^"^^^'"^"^^"^»^^^^'^^^
Отображение полос понижения и повышения и настройка цвета их линий границы
procedure TOKBottomDlgll.HasUpDownBarsClick(Sender: TObject);
var ChartGroup:variant;
begin
Chart.ChartType:=xlLine;
ChartGroup:^Chart.ChartGroups.Item(l);
ChartGroup.HasUpDownBars:=HasUpDownBars.Checked;
if HasUpDownBars.Checked then begin
ChartGroup・ UpBars.Border.Colorindex:=7;
ChartGroup.DownBars* Border.Colorindex:=12;
end;
end;
Результат представлен на рис. 14.25.
Рис. 14.25. Полосы повышения и понижения
Некоторые дополнительные элементы рядов
В предыдущих разделах мы рассмотрели элементы» отражающие сравнительные характеристики двух и более рядов данных диаграммы. Здесь мы рассмотрим некоторые дополнительные элементы, относящиеся к отдельным рядам данных диаграммы.
Линии выноски для подписей данных
Линии выноски для подписей данных являются элементом ряда данных диаграммы, поэтому их отображение определяется значением свойства
HasLeaderLines объекта Series, яапяюшегося элементом коллекции SeriesCollection. Если значение этого свойство равно True, то линии выноски подписей будут отображены, но только в случае, если будет выбран м соответствующий тип диаграммы, поскольку эти элементы можно отобразить не для всех типов диаграмм. Например, для круговой объемной диаграммы линии выноски подписей могут быть отображены и доступны.
Доступ к свойствам самих линий осуществляется посредством объекта LeaderLines, свойства и методы которого позволяют выделить эти элементы (Select), удалить их (Delete) или настроить свойства линии (тип, толщину и цвет), которые идентичны свойствам обычных линий и определяются объектом Border,
Следующий пример позволяет изменить тип диаграммы, отобразить линии выноски для подписей данных и настроить их свойства.
:Задание линий выноски подписей данных диаграммы
Const x!3DPieExploded=7Q;
procedure TOKBottomDlgll.HasLeaderLinesClick(Sender: TObject);
var Series:variant;
begin.
Chart. ChartType : =^xl3DPieExplodeci;
Series: =Chart. SeriesCollection (1);
Series.HasDataLabels:=HasLeaderLines.Checked;
if HasLeaderLines.Checked then begin
Series.Points(1).DataLabel.Left:=SeriesPoints(1).DataLabel.Left+20;
Series.HasLeaderLines:=HasLeaderLines.Checked;
Series.LeaderLines.Border.ColorIndex:=5;
end;
end;
Рис-14.26. Линии выноски для подписей данных на круговой объемной диаграмме
На рис. 14.26 отображен результат выполнения представленной процедуры ——круговая объемная диаграмма, подписи данных которой соединены линиями выноски с графическими элементами самой диаграммы.
Полоса погрешностей
Полоса погрешностей (планки погрешностей) представляет собой линии в точках построения, отображающие потенциальную ошибку (или степень недостоверности) каждой точки данных ряда данных. Полосы погрешностей строятся в точках ряда, могут иметь различные тип, толщину и цвет линий, а также величину отклонения» которая выражается как расстояние между точкой данных н конечными точками линии полосы погрешностей. Доступ к полосе погрешностей обеспечивает объект ErrorBars, принадлежащий элементу коллекции Series. Отображение полос погрешностей обеспечивается путем записи значения True в свойство HasErrorBars и последующе访 настройкой свойств объекта ErrorBars или использованием метода ErrorBar, принадлежащего элементу коллекции Series. Синтаксис вызова метода ErrorBar:
Series*ErrorBar(Direction, Include, Type, Amount, MinusValues);
где Direction integer — направление построения линий; Include: Integer — признак наличия только отрицательных, только положительных, обоих типов или отсутствие полос погрешностей; Type:Integer ——тип отклонения ——фиксированный, в процентах (%) от значения и т. д.; Amount, MinusValues:Extended — абсолютные или относительные величины положительного и отрицательного отклонений.
Рассмотрим следующие процедуры.
:Построение полосы погрешностей
procedure TOKBottomDlgll.Button3Click(Sender: TObject); begin
Chart. ChartType: =xlLine;
Chart * Seriescollection £1).ErrorBar(Direction:=xlY, Include:=xlErrorBarIncludeBoth, Type:=xlEггоrBa rTypeFixedValue, Amount:=200);
end;
procedure TOKBottomDlg 11.HasErrorBarsClick (Sender: TObject); begin
Chart.ChartType:=xlLine;
Chart.Seriescollection(1).HasErrorBars:=HasErrorBars.Checked;
if HasErrorBars.Checked then begin
Chart *SeriesCollection(1).ErrorBars・ Endstyle:^xLNoCap;
Chart.Seriescollection(1).ErrorBars.Border.Colorindex:=13;
Chart.SeriesCollection(1).ErrorBars.Border.Weight:=3;
end;
end;
Обе процедуры обеспечивают построение полос погрешностей, которые могут выглядеть так, как показано на рис. 14.27.
Рис. 14.27. Построение полосы погрешностей для графика
Линия тренда
Диаграмма строится по точкам, которые соединяются между собой прямыми или кривыми линиями, н дает нам представление о процессе, который она описывает. Но не всегда такое представление является наглядным и не всегда дает общую картину законов развития этого процесса. Известно, что точки любого графика, если он описывает реальный процесс, связаны между собой и поддаются математическому описанию. Например: мы хотим выяснить, какова общая тенденция описываемого процесса, как он будет изменяться, как наиболее точно определить промежуточные значения графика? Для этого используем методы аппроксимации и строим на этой основе дополнительный график, отвечающий на наши вопросы. Для диаграмм Excel такие дополнительные графики называются линиями тренда. Линию тренда, построенную на одном из методов аппроксимации, можно добавить к двухмерной диаграмме без накопления, например, к графику или гистограмме.
Линии тренда диаграммы объединены в коллекцию Trendlines. Метод Add этой коллекции позволяет добавить новую линию тренда. Используем этот
метод и добавим две линии тренда с помощью следующей процедуры. Результат ее выполнения показан на рис. 14.28.
:Добавление линии тренда
const xlLinear=-4132;
xlPolynomia1=3;
procedure TOKBottomDlgll.ButtonlClick(Sender: TObject);
begin
Cha rt. Chart Type: —xlLine;
Chart.SeriesCollection(1).Trendlines.Add(Type:«xlLinear, Forward:-!, Backward:=0.5, DisplayEquation:=False?
DisplayRSquared:=False);
Chart.Seriescollection(1),Trendlines.Add(Type:=xlPolynomial, Order:=2, Forward:=1, Backward:=0.5# DisplayEquation:=False, DisplayRSquared:=False);
Chart.Seriescollection(1).Trendlines(1^.Border.ColorIndex:=3; Chart.Seriescollection(1|.Trendlines(2).Border.Colorindex:^l1 end;
Можно добавить несколько пояснений. В нашем примере мы создали две линии тренда ——линейную н полиномиальную, при этом для задания типа аппроксимации использовали первый аргумент метода Add. Второй и третий аргументы определяют прогноз поведения описываемого процесса после последней и до первой точек ряда. Следующие два аргумента позволяют отобразить формулы, на основании которых строились линии тренда. Мы
имеем возможность создать несколько аппроксимаций одного и того же процесса (см. рис. 14.28). Для удаления любой линии тренда достаточно вызвать метод Delete для выбранного элемента коллекции Trendlines, как показано в следующей процедуре.
A^W•ч.вд«••мv•^v^^?Tf■■•.•■■VVЧ•^~■•■^■?Л^^^УЛ•Д^JVM^^.^!•^VЛ*™•J•?Л■^^■■^*■rtV-йГ^■■^Г••■■"♦tм^T•^t"^,■■^-•***^^■'■■■*'■■?^'^,T'■"'■'■'■',"^м^^',*■3^^'''■'''""^**'T""'"^'*"'~^4:*'''•^''"“”.*M*»fy "”"“"*” …TV,"”* j Удаление линии тренда
procedure TOKBottomDlgll.Button2Click(Sender: TObject); begin
Chart < Seriescollection (1) . Trendlines (1) . Delete;
end;
В этой главе мы постарались рассмотреть основные принципы построения диаграмм в Excel. Более детальную и полную информацию по этой теме можно получить только практическим путем —— применяя диаграммы в ва・ ших приложениях, создаваемых в Delphi.
м .0,1八“». •>*! •
ГЛАВА 15
Печать
В этой главе мы рассмотрим, как и какими методами осуществляются настройка, предварительный просмотр м печать документов в формате рабочих книг Excel* Особенностью печати рабочей книги Excel является необходимость согласования параметров страницы и свойств конкретного принтера, установленного в системе. Эти особенности учитываются и находят свое отражение в свойствах (параметрах) страницы, доступ к которым обеспечивается путем использования объекта PageSetup. Сам этот объект принадлежит объекту "лнст* в свою очередь принадлежащему объекту "рабочая книга". После настройки страницы можно просмотреть, как она будет выглядеть на бумаге, и приступить к печати, задав имя принтера и другие параметры печати.
Сначала рассмотрим формирование той информации, которая будет включена в печатную страницу. Информация для печатной страницы задается путем разделения листа рабочей книги. Для этого используется понятие "разрыв страницы**.
Разрыв страницы
Лист рабочей книги можно ^поделить" на печатные страницы с помощью линий разрыва страницы, обозначающих, каким образом информация листа будет перенесена на печатные страницы при печати документа. Для того чтобы отобразить эти линии, достаточно переключить "вмп" документа в режим *'разметка страннцн".
В приложениях Delphi это можно сделать путем изменения значения свойства View объекта ActiveWindow (см. следующую процедуру)Ф
:Переключение вида документа в режим "разметка страницы"
const
xlNormalViev^l;
xl PageBreakPreview=2;
procedure TOKBottomDlg3.Viewchange(Sender: TObject);
begin
case View.Itemindex of
0: Forml. E. Act iveW indow. View: =xlNormalView;
1: Forml .E. ActiveWindow. View: ^xl Pa geBreakPreview;
end;
end;
Используя константы xlNormalView и xl Page В reakPreview, изменяем вид документа и преобразуем его из обычного в тот вид, на котором отображена разметка страниц. На рис. 15.1 показан внешний вид листа рабочей книги в режиме "разметка страницы".
、MgowH EhccHi?5rH、MgowH EhccHi?5rH.巴里心 Пр»л Ена Ветдаы Желает £кинй Двины» 不2 3Q 帽 О &аУ “ *0「,・ <е s Л it :i.巴里心 Пр»л Ена Ветдаы Желает £кинй Двины» 不2 3Q 帽 О &аУ “ *0「,・ <е s Л it :i子車一 .点.A♦子車一 .点.A♦Рис. 15.1. Лист рабочей книги в режиме "разметка страницы"Рис. 15.1. Лист рабочей книги в режиме "разметка страницы"
、MgowH EhccHi?5rH
、MgowH EhccHi?5rH
.巴里心 Пр»л Ена Ветдаы Желает £кинй Двины» 不2 3
Q 帽 О &аУ “ *0「,・ <е s Л it :i
.巴里心 Пр»л Ена Ветдаы Желает £кинй Двины» 不2 3
Q 帽 О &аУ “ *0「,・ <е s Л it :i
子車一 .点.A♦
子車一 .点.A♦
Рис. 15.1. Лист рабочей книги в режиме "разметка страницы"
Рис. 15.1. Лист рабочей книги в режиме "разметка страницы"
Используя свойства и методы коллекций Н Page Breaks и V Page Breaks листа рабочей книги, мы получаем доступ и возможность манипулировать разметкой листа. Элементы этих коллекций содержат информацию о разрывах страниц и позволяют изменять или удалять их. Добавление новых элементов в коллекцию осуществляется с помощью метода Add, аргументом которого является ссылка на ячейку, до которой вставляется разрыв. Следующая
процедура позволяет добавить разрыв в точке расположения ячейки с координатами 10:30, после чего загрузить в компонент List Box 1 номера всех элементов коллекции, в том числе и вновь созданного.
审"К"","""””"."",;♦?**”,,",”.11,",g"吃””"',”****i”"*,,",rТ*"^""*,4”"”""*" ;Добавление разрыва страницы
procedure TOKBottomDlg3,Button2Click(Sender: TObject);
var a_: integer;
begin
HPageBreaks.Add(Before: =Forml.E.ActiveSheet.Cells [10,30]);
ListBoxl. Items ・ Clear;
for 占一:=1 to HPageBreaks.Count do ListBoxl.Items,Add(inttostr (a_)); ListBoxl.ItemIndex:=0;
end;
Для задания точки разрыва можно использовать не только ссылку на ячейку Celis, но и ссылку на область ячеек Range. Тогда первый оператор описанной выше процедуры будет выглядеть так:
HPageBreaks .Add (Beforet^Forml.Е. ActiveSheet.Range [Range.Text]);
Здесь объект Range.Text задает адрес области ячеек. Результат добавления новой точки разрыва страницы в обоих случаях будет одним и тем же (рис. 15.2).
Для создания н манипулирования вертикальными разрывами используются элементы коллекции VPageBreaks. Методы этой коллекции идентичны методам коллекции HpageBreaks. Рассмотрим еще одно свойство элементов коллекций VpageBreaks и HpageBreaks. Это свойство определяет положение линий разрыва и позволяет изменять его. Свойство Location является ссылкой на ячейку. Изменение ссылки с одной на другую ячейку приведет к изменению положения линии разрыва.
:Перенос линии разрыва страницы
procedure TOKBottomDlg3.ButtonLocationClick(Sender: TObject);
var a_:integer;
begin
HPageSreaks. Item [ 1] * Location: =Forml ” Е» Active Sheet. Range [Range. Text];
VPageBreaks * I tem [1] . Location: =Forml. E. ActiveSheet. Range [ Range. Text ]; end;
Использование этой процедуры позволит изменять границы листа, выводимого на печать. После того как мы определили области, которые будут размещаться на отдельных печатных страницах, перейдем к настройке свойств самой страницы.
11 Зак. 723
иснки|иснки|.,"亡…神"一………,,一一.,"亡…神"一………,,一一Л<6слам*-. U 白 A*rMH3lM r X、口 0圓《 小 "上♦А'■mЛ<6слам*-. U 白 A*rMH3lM r X、口 0圓《 小 "上♦А'■m陰丫縫£©*m 杀!呵!e11M中®e.匸严:g*»1、#w 2m明区『凿爾Й &区》3%適& 一,** e启外Ml価,书册",鯉陰丫縫£©*m 杀!呵!e11M中®e.匸严:g*»1、#w 2m明区『凿爾Й &区》3%適& 一,** e启外Ml価,书册",鯉Рис. 15.2. Добавляем горизонтальный разрывРис. 15.2. Добавляем горизонтальный разрыв二口一版 3*/..二口一版 3*/..
иснки|
иснки|
.,"亡…神"一………,,一一
.,"亡…神"一………,,一一
Л<6слам*-. U 白 A*rMH3lM r X、口 0圓《 小 "上♦А'■m
Л<6слам*-. U 白 A*rMH3lM r X、口 0圓《 小 "上♦А'■m
陰丫縫£©*m 杀!呵!e11M中®e.匸严:g*»1、#w 2m明区
『凿爾Й &区》3%適& 一,** e启外Ml価,书册",鯉
陰丫縫£©*m 杀!呵!e11M中®e.匸严:g*»1、#w 2m明区
『凿爾Й &区》3%適& 一,** e启外Ml価,书册",鯉
Рис. 15.2. Добавляем горизонтальный разрыв
Рис. 15.2. Добавляем горизонтальный разрыв
二口一版 3*/..
二口一版 3*/..
Объект PageSetup
Для настройки свойств страницы предназначен объект PageSetup.
Чтобы настроить страницу для печати, мы используем диалоговое окно Параметры страницы, позволяющее пользователю задать размер бумаги, полей и другие параметры, необходимые для согласования настроек документа с параметрами принтера, на котором он будет распечатан. Все эти свойства объединены в объекте PageSetup и могут быть заданы и изменены программным путем, в том числе и из приложений Delphi (табл. 15.1).
Таблица 15.1. Свойства объекта PageSetup
Свойство
Тип
Значение
PrintTitleRows
String
Сквозные строки
PrintTitteColumns
String
Сквозные столбцы
PrintArea
String
Область печати
Таблица 15.1 (окончание)
Свойство
Тип
Значение
LeftHeader
String
Верхний колонтитул (левая часть)
CenterHeader
String
Верхний колонтитул (центральная часть)
RightHeader
String
Верхний колонтитул (правая часть)
LeftFooter
String
Нижний колонтитул (левая часть)
CenterFooter
String
Нижний колонтитул (центральная часть)
RightFooter
String
Нижний колонтитул (правая часть)
LeftMargin
Extended
Левое поле
RightMargin
Extended
Правое поле
TopMargin
Extended
Верхнее поле
BottomMargin
Extended
Нижнее поле
HeaderMargin
Extended
Поле для верхнего колонтитула
FooterMargin
Extended
Поле для нижнего колонтитула
PrrntHeadings
Boolean
Печать заголовков
PrintGridlines
Boolean
Печать линий сетки
Printcomments
Integer
Печать примечаний
PrintQuality
Array{X, ¥)
Качество печати
CenterHorizontally
Boolean
Центрировать на странице горизонтально
CenterVertically
Boolean
Центрировать на странице вертикально
Orientation
Integer
Книжная/альбомная ориентация страницы
Draft
Boolean
True — черновая печать
PaperSize
Integer
Размер 6ума「/
FirstPageNumber
Integer
Номер первой страницы
Order
Integer
Последовательность вывода страниц
BlackAndWhite
Boolean
Черно-белый режим печати
Zoom
Boolean/lnteger
False — масштаб задается в количестве страниц; число обозначает масштаб в процентах от натуральной величины
FitToPagesWide
Integer
Масштаб печати — максимальное количество страниц в ширину
FitToPagesTall
Integer
Масштаб печати — максимальное количество страниц в высоту
В приложении на сопроводительном компакт-диске книги есть примеры использования всех представленных свойств объекта PageSetup. Здесь мы рассмотрим только те свойства, которые используются наиболее часто м дают четкое представление о настройках параметров страницы.
Задание области печати
Лист рабочей книги может содержать огромное количество информации и достаточно велик, К тому же не всегда нужно печатать всю информацию листа. Достаточно (а часто —— требуется) выводить на печать только определенную область ячеек. Значит, нужна возможность задавать эту область. Для этого предназначено свойство PrintArea объекта PageSetup, содержащее строку адреса прямоугольной области. Изменяя значение PrintArea, мы изменяем область печати.
;Задание области печати
procedure T0KBottomDlg2.PrintAreaExit(Sender: TObject); begin
PageSetup • PrintArea; ^PrintArea. Text; end;
Задание полей страницы
Используя свойства объекта PageSetup, ми можем задать величину полей печатной страницы, а также положение верхнего и нижнего колонтитулов. Это достигается записью значений этих полей в свойства Left Margin, RightMargin, TopMargin, BottomMargin, HeaderMargin, FooterMai^in. Следующие процедуры позволяют приложению Delphi задать левое и правое поля страницы.
Задание размеров полей страницы
procedure T0KBottomDlg2.LeftMarginChange(Sender: TObject); begin
PageSetup. LeftMargin: =LeftMargin. Value;
end;
procedure TOKBottomDlg2.RightMarginChange(Sender: TObject); begin
PageSetup. RightMargin.: =RightMargin. Value;
end;
В нашем примере величина полей задается в произвольных единицах, г. е. в пикселах. Чтобы привязать все размеры к реальным единицам измерения, нужно выполнить преобразование. В среде Visual Basic такие преобразования выполняют функции InchesToPoints и Се nt i metersT о Ро i nts, преобразующие величину, выраженную в дюймах и сантиметрах, в количество точек. Если эти функции недоступны из приложений Delphi, то используем следующие соотношения ——в одной точке 0,035 см или 1/72 дюйма.
Колонтитулы
Колонтитулы представляют собой надписи на печатной странице в ее верх* ней части и нижней части. Кроме номера страницы, они могут содержать произвольный текст, текст, связанный с документом и его свойствами, а также текущую дату и время. Колонтитулы могут также представлять собой комбинации этих данных. Печатная страница может содержать верхний и нижний колонтитулы. Доступ к их содержимому осуществляется через шесть свойств объекта PageSetup, т. к. каждый колонтитул может содержать до трех частей: Left Header — левая часть верхнего колонтитула, CenterHeader — центральная часть верхнего колонтитула, Right Header — правая часть верхнего колонтитула, LeftFooter ——левая часть нижнего колонтитула, CenterFooter — центральная часть нижнего колонтитула» Right Foote г — правая часть нижнего колонтитула. Просмотреть содержимое колонтитулов можно только на распечатанной странице или в режиме "предварительный просмотр'1, а запрограммировать их возможно в обычном режиме, используя соответствующие свойства объекта PageSetup.
:Добавление верхнего колонтитула
procedure TOKBottomDlg2.LeftHeadeгChange(Sender: TObject); begin
PageSetup.LeftHeader:=LeftHeader.Text;
end;
procedure TOKBot tomDlg2, Cente rHeader Change (Sender: TObj ect); begin
PageSetup.CenterHeader:=CenterHeader.Text;
end;
procedure TOKBottomDlg2.RightHeaderchange(Sender: TObject); begin
PageSetup.RightHeadet:=RightHeader,Text;
end;
На рис. 15.3 предстанлена форма, использующая приведенные процедуры, из состава приложения, находящегося иа сопроводительном компакт-диске книги. С помощью этой формы можно экспериментировать со шрифтами колонтитулов и их содержанием.
Рис. 15.3. Изменяем содержание колонтитулов для печатной страницы
Рис. 15*4. Изменяем размер шрифта верхнего колонтитула
Используя форму, представленную на рис. 15.3, попробуем изменить шрифт текста и тип содержимого колонтитулов. Например, можно записать в части колонтитулов следующие последовательности символов для отображения специальной информации в колонтитуле:
'&D' — дата;
'&Т 一 время;
口 '&F ——имя файла.
Комбинация из символа & н числа задает размер шрифта для текста в соответствующей части колонтитула. Напрнмер, оператор PageSetup,LeftHeader:= '&28'; установит размер шрифта в 28 пунктов для текста в левой части верхнего колонтитула.
Используя эти особенности, установим для верхнего колонтитула новый размер шрифта, равный 28 пунктов. Результат представлен на рис. 154
Ориентация и размер бумаги, номер первой страницы, масштаб
Ориентация страницы (книжная или альбомная) определяется значением свойства Orientation* Программно такой выбор осуществляется путем записи в свойство Orientation одного из значений ——xlPortrait=l или xlLandscape=2.
Размер бумаги задается свойством PaperSize объекта PageSetup. Список возможных значений этого свойства представляет собой набор из нескольких десятков констант, соответствующих различным типовым размерам бумаги. Полный список констант можно найти в приложении на сопроводительном компакт-диске книги или в справочной системе Visual Basic. В следующем примере представлена только часть этого списка.
Гi ”••••,”“:^..„„..„„^.„.„„.„.„..„^^„..„.^...^„.....„...„....^..„„^^„.^^^^”,“•.•“.””.“”¥„,.”"”屮口
;Выбор ориентации и размера бумаги
const
// Константы, определяющие ориентацию бумаги xlPortrait^l;
xl Landscaped;
// Константы, определяющие размер бумаги
//
Letter (8-1/2 in. x 11 in.)
//
Letter Small (8-1/2 in. x 11
in*
//
Tabloid (11 in. x 17 in.)
и
Ledger (17 in. x 11 in.)
//
Legal (8-1/2 in* к 14 in.)
〃
Statement (5-1/2 in. x 8-1/2
in.
xlPaperLetter'l;
xlPaperLetterSmall==2;
xlPaperTabloid=3;
xlPaperLedgers4;
xlPaperLega1=5;
xL PaperStatement=6;
x1PaperExecutive=7;xlPaperA3=8;xlPaperA4^9;xlPaperEnvelopeDLFs27;x1PaperExecutive=7;xlPaperA3=8;xlPaperA4^9;xlPaperEnvelopeDLFs27;// Executive (7-1/2 in. x 10-1/2 in.)
x1PaperExecutive=7;
xlPaperA3=8;
xlPaperA4^9;
xlPaperEnvelopeDLFs27;
x1PaperExecutive=7;
xlPaperA3=8;
xlPaperA4^9;
xlPaperEnvelopeDLFs27;
// A3 (297 mm к 420 mm)
〃 A4 (210 mm x 297 mn)
// Envelope DL (110 nin x 220 nim)
procedure TOKBottomDlg2.OrxentationChange(Sender: TObject); begin
case Orientation.Itemindex of
0:PageSetup.Orientation:=xlPortrait;
1:PageSetup * Orientat ion:= xlLandscape;
end;
end;
procedure TOKBottomDlg2.PapersizeChange(Senderr TObject); begin
case PaperSize * Itesmlndex of
0: PageSetup. PaperSize: =xlPaperLetter;
PageSet up. PaperSize ^xlPaperLet ter Small;
PageSetup. PaperSize: =xlPaperTabloid;
3:PageSetup.PaperSize:=xlPaperLedger;
4:PageSetup,PaperSize:= xIPaperEnvelopeDL;
end;
end;
Используя описанные процедуры, зададим альбомную ориентацию и размер бумаги uEnvelope DL (ПО mm х 220 mm)1* (xIPaperEnvelopeDL). Результат представлен на рис. 155
Номер первой страницы печати определяется свойством FirstPageNumber объекта PageSetup. Если оно имеет значение xlAutoniatic, то номер первой страницы определяется “по умолчанию”. Чтобы задать конкретный номер первой страницы, нужно в свойство FirstPageNumber записать его значение. Следующая процедура позволяет задать номер первой страницы в приложениях Delphi.
Задание номера первой страницы
procedure TOKBottomDlg2. AutcsnaticClick (Sender: TObj ect); begin
FirstPageNumber. Enabled: = not Automatic. Checked;
if Automatic * Checked
then PageSetup・ FirstPageNumber: =xlAutomatic
else PageSetup. FirstPageNumber:^FirstPageNumber.Value;
end;
Рис. 15.5. Зададим ориентацию и размер бумаги
Выбор нужного масштаба печати позволяет уменьшить количество страниц заданного размера, необходимых для печати документа. Есть два способа задания масштаба.
Первый основан на задании величины масштаба в процентах от натуральной величины. Свойство Zoom объекта PageSetup позволяет реализовать этот способ. Для этого достаточно записать в него величину масштаба. Обычно масштаб можно задать целым числом в диапазоне от Ю до 400 (%).
При Zoom=Fa!se используется второй способ, основанный на задании максимального количества страниц в ширину (свойство FitToPagesWide) и в высоту (свойство FitToPagesTall) для печатаемого документа.
Следующие процедуры позволяют реализовать оба способа в приложениях Delphi.
F”"…“v-w—
:Задание масштаба печати
procedure TOKBottomDlg2.ZoomChange(Sender: TObject); begin
if Zoom.ValueolOO
then PageSetup * Zoom:=Zoom.Value else PageSetup.Zoom:^False; end;
procedure TOKBottomDlg2.FitToPagesWideChange(Sender: TObject);
begin
PageSetup. FitTo Pages Wide: =FitToPagesWide. Value; end;
procedure TOKBottomDlg2.FitToPagesTa1IChange(Sender: TObject);
begin
PageSetup. FitToPagesTall: =FitToPagesTall. Value; end;
Печать заголовков строк и столбцов и линий сетки, черновая печать
Настройки страницы печати позволяют выбрать режим вывода, когда печатается не только содержимое ячеек, но и заголовки столбцов и строк, а также линии сетки. Установив свойство PrintHeadings в значение True, мы выбираем режим печати заголовков. Свойство PrintGridlines позволяет управлять режимом вывода на печать линий сетки. Рассмотрим пример использования этих свойств.
:Печать заголовков строк и столбцов и линий сетки
procedure TOKBottomDlg2.PrintHeadingsClick(Sender: TObject);
begin
PageSetup* PrintHeadings:=PrintHeadings.Checked; end;
procedure TOKBottomDlg2.PrintGridlinesC1ick{Sender: TObject);
begin
PageSetup. PrintGridlines: =PrintGridl ines. Checked; end;
На рис. )5.6 представлен пример использования представленных процедур.
В режиме "черновая печать" линии сетки, а также заголовки строк и столбцов выводиться на печать не будут. Этот режим определяется состоянием свойства Draft объекта PageSetup, имеющего логический тип. Черно-белая печать определяется свойством BlackAndWhite объекта PageSetup и позволяет осуществлять печать в оттенках серого цвета.
По ходу задания параметров печати страницы можно в любой момент перейти к предварительному просмотру печати. Режим предварительного про-
смотра связан с параметрами конкретного выбранного принтера и недоступен, если не выбран ни один принтер. Для перехода в режим предварительного просмотра используется метод PrintPreview. Этот метод есть не только у листа рабочей книги Excel, но и у других объектов, которые могут быть самостоятельно выведены на печать.
Рис. 15.6. Задан режим печати заголовков и линий сетки
Предварительный просмотр и печать объектов рабочей книги Excel
Excel позволяет вывести на печать или в окно предварительного просмотра объект, у которого есть метод Print Preview или Printout. Таким объектом, например, может быть диаграмма, активный лист рабочей книги или область ячеек листа рабочей книги.
Рассмотрим пример. Следующая процедура позволяет выбрать в качестве объекта диаграмму, а затем с помощью метода Object For Print вывести ее в окно предварительного просмотра.
;Выбор и предварительный просмотр диаграммы
procedure TForml.Button9Click(Sender: TObject);
begin
QbjectForPrint:=E• ActiveChart;
ObjectForPrint.PrintPreview;
end;
Результат выполнения данной процедуры представлен на рис. 15.7.
Рис. 15.7. Предварительный просмотр выбранной диаграммы
Печать документа
После настройки и просмотра документа можно перейти к его печати. Печать документа осуществляется методом Printout. Синтаксис вызова этого метода:
Printout(from, То, Copies, Preview, ActivePrinter, PrintToFile, Collate);
Аргументы метода, их тип и назначение представлены в табл. 15.2.
Таблица 752 Аргументы метода Printout
Аргумент
Тип
Назначение
From
Integer
Номер страницы, с которой начинается печать
To
Integer
Номер страницы, на которой заканчивается печать
Copies
Integer
Количество копий печати
Preview
Boolean
True — предварительный просмотр перед печатью
ActivePrinter
String
Имя принтера для печати
PrintToFile
Boolean
Тrue — печатать в файл
Collate
Boolean
True — разобрать по копиям
При использовании метода Printout без аргументов печать будет выполнена в режиме "по умолчанию*'. Этот метод можно использовать с любым набором аргументов. Если в системе установлен не один, а несколько принтеров, то, чтобы использовать один из них, нужно при вызове метода Printout задать в аргументе Active Printer его имя. Чтобы получить список установленных в системе принтеров, используем стандартный объект Delphi TPrinter (см. следующую процедуру).
;Получение списка принтеров, установленных в системе
procedure TForml.ButtonlClickfSender: TObject);
var a_:integer;
pr:TPrinter;
begin
ListBox1.Items.Clear;
pr:=TPrinter.Create;
for a_:=0 to pr.Printers.Count-1 do
ListBoxl. Items .Add (pr. Printers [a_]);
pr.Free;
end;
На рис. 15.8 представлен компонент ListBox (список) с загруженным перечнем установленных в системе принтеров.
Чтобы для печати документа использовать один из принтеров, имя которого находится в списке ListBox, достаточно выполнить следующую процедуру.
w“3"“, ",."“".「"","".r,..^„v....,,^^^.""干…"”—“屮中…?.,"" ・…"
;Выбор активного принтера и печать документа
procedure TForml.ButtonllClick(Sender: TObject);
begin
E»ActivePrinter:=ListBoxl. Items. Strings [ListBoxl.Itemindex];
E.ActIveWorkBook. Printout <ActivePrinters
ListBoxl. Items ・ Strings [ListBoxl * Itemindex]); end;
■对;叩空駒,二7!.
4 Hp De品験靑曲1; [Epson FX-1170 on LPT1
Рис. 15.8. Список установленных e системе принтеров
Важно! )
При выполнении этой процедуры возможны ошибки, связанные с отличием форматов представления имени принтера в объекте TPrinter и имени, используемого при вызове метода Printout. Например, если имя принтера для объекта TPrinter представляет собой строку:
"HP DeskJet 850С on LFTL",
то при вызове метода Printout необходимо использовать несколько видоизмененную строку:
"HP DeskJet 850c (LPT1:)".
ГЛАВА 1 6
Программирование свойств MS Excel
В этой главе рассматриваются следующие темы:
элементы управления приложения MS Excel;
элементы коллекции CommandBars;
создание пользовательской панели (меню); 口 элементы управления и их свойства;
главное меню;
создание элемента управления;
口 использование Visual Basic Editor;
口 коллекция диалогов;
口 пример программирования панели.
Элементы управления приложения MS Excel
В предыдущих главах были рассмотрены модели рабочей книги Excel и элементов, которые входят в состав рабочей книги и служат для отображения той или иной информации. Использование этих элементов позволяет не только отображать информацию, но и обмениваться информацией с внешними приложениями. В свою очередь» внешние приложения, используя эти объекты, имеют доступ к воздействию на них и изменению их формы н содержания. Таким образом, подводя итог вышесказанному, можно утверждать, что, используя свойства и объекты коллекции WorkBooks, мы можем из приложений Delphi создавать документы любой сложности, а приложение Excel использовать как генератор и редактор готовых документов, например, отчетов. Конечно, возможности MS Excel зтнм не исчерпываются.
Панели и элементы управления, различные диалоги также доступны для внешних приложений и могут управляться с их помощью. Внешним приложениям доступны также макросы, которые можно создавать, модифицировать и удалять, используя свойства и методы объекта Excel.Application.
Рассмотрим элементы управления главного окна приложения MS Excel. Все элементы управления организованы в иерархическую структуру, на вершине которой находится коллекция CommandBars. Элементами этой коллекции являются главное меню и панели с кнопками и другими элементами управления. В свою очередь, панели элементов управления содержат коллекции Controls этих элементов. На рис. 16.1 представлена структура объектной модели коллекции CommandBars.
Рис. 16.1, Объектная модель коллекции CommandBars
Элементы коллекции CommandBars
Рассмотрим свойства коллекции CommandBars. Как и любая коллекция, она содержит типичные свойства и методы. Свойство Count содержит количество элементов коллекции, метод Add позволяет добавить новый элемент коллекции (панель элементов управления), метод Item(i) возвращает ссылку на элемент коллекции. К специфическим свойствам относятся те, которые по-
зволяют задавать режим отображения элементов коллекции. В табл, 16.1 представлены свойства и методы коллекции панелей элементов управления.
Таблица 16.1. Свойства и методы коллекции CommandBars
Свойство или метод
Тип
Описание
ActionControl
Объект
Ссылка на активный в данный момент элемент управления
ActiveMenuBar
Объект
Ссылка на активный в данный момент элемент меню
Add
Метод
Добавление элемента коллекции
Count
Integer
Количество элементов коллекции
DisplayTooltips
Boolean
Тrue — включить подсказку для кнопок
DisplayKeysInTooltips
Boolean
True — включить в подсказку для кнопок сочетания "горячих'* клавиш
FindControl
Метод
Поиск элемента коллекции
ltem(i:integer)
Объект
Набор элементов коллекции
Large Buttons
Boolean
Переключение режима отображения боль- ших/маленьких кнопок
Menu Animationstyle
Integer
Эффект при выводе меню
ReleaseFocus
Метод
Обновление пользовательского интерфейса для всех элементов коллекции
Рассмотрим некоторые свойства коллекции CommandBars, например, свойства, определяющие общие визуальные характеристики панелей н элементов управления. Свойство Large Buttons коллекции позволяет устанавливать размеры кнопок на всех панелях (большие или маленькие). Для выбора большого размера кнопок установим значение этого свойства в True, для выбора малого размера — в False. По умолчанию это свойство имеет значение False. Следующая процедура позволяет задать большой размер для кнопок.
;Изменение размера кнопок
procedure TForml. LargeButtonsCl ick (Sender: TObject); begin
E. CorrananciBars. LargeBut tons: =LargeButtons. Checked; end;
Выполнив данную процедуру, мы получим результат, который не нуждается в комментариях и представлен на рис. 162
Рис. 16,2. Выбраны большие кнопки для панелей управления
Другими общими свойствами коллекции ComniandBars являются два свойства логического типа, управляющие режимом подсказок для кнопок панелей. Свойство DisplayTooltips определяет, включена или отключена всплывающая подсказка. Свойство Display Keys! nToolt ips определяет присутствие в подсказке сочетания "горячих1' клавиш (этот режим в Excel не используется).
Изменение отображения режима подсказок определяется установкой этих свойств в определенные состояния, что можно выполнить в приложении Delphi. Рассмотрим следующую процедуру.
Изменение режима подсказок для кнопок
procedure TForml.DisplayTooltipsClick(Sender: TObject); begin
E.CommandBars.DisplayTooltips:=DisplayTooltips.Checked; end;
На рис. 16.3 показана форма, использующая данную процедуру, а на рис, 16.4 — главное окно Excel, в котором видна подсказка для кнопки Открыть.
Рис. 16.3. Фрагмент формы приложения DelphiРис. 16.3. Фрагмент формы приложения DelphiN Microtofl ExcelN Microtofl Excel
Рис. 16.3. Фрагмент формы приложения Delphi
Рис. 16.3. Фрагмент формы приложения Delphi
N Microtofl Excel
N Microtofl Excel
I 史酬а Права Вид Вставке Фоямаг Сервис』ак
-• Ж К ч
Рис. 16.4. Отображение подсказкидля кнопки Открыть
Рассмотрим свойства коллекции, отображающие состояние элементов управления, — ActionControl и ActiveMenuBar. Они являются ссылками на объекты-элементы коллекции и позволяют определить, какой элемент панели активен (т. е. какая кнопка запустила на выполнение команду) и какая панель, содержащая меню, активна в настоящее время. Далее представлен исходный текст процедуры, которая возвращает и отображает имя панели, на которой размещено активное меню.
Получение названия активного меню
procedure TForml.Buttonl6Click(Sender: TObject);
var name_:string;
begin
name_: =E. CornmandBars • Act i veMenuBa r • Name;
messagebox(handle,pchar(name_), *1,0); end;
Коллекция CornmandBars также включает в себя список панелей управления, доступ к которым осуществляется с помощью метода Item(i), где i — индекс или имя панели. Этот метод возвращает ссылку на элемент коллекции.
Получим список всех элементов коллекции CornmandBars. Для этого, используя свойство Count коллекции и свойство Name элемента коллекции, загрузим список элементов в объект типа TCheckListBox (список с флажками). Свойство Name имеет строковый тип и представляет собой имя элемента. Его можно использовать для доступа к любому эле\«енту коллекции так же, как индекс» имеющий числовой тип. Рассмотрим следующую процедуру.
;Получение списка панелей
procedure TOKBottomDlg2.FormCreate(Sender: TObject);
var a_:integer;
eee :string;
begin
COMMANDBARS :=Forml. E. COMMANDBARS;
for a_:=L to COMMANDBARS.Count do begin
eee_: =COMMANDBARS. Item [ a_] .name+1 = 1 + COMMANDBARS. Item [ a_)・ NameLocal; CheckListBoxl.Items.Add(eee_);
CheckListBoxl.Checked[a__-1 ] :=ConimandBars. Item[a_] .Visible;
end; end;
Данная процедура, последовательно перебирая все элементы коллекции, загружает их имена в объект CheckListBoxl.
После этого можно загрузить значения двух свойств элемента коллекции: NameLocal — определяет имя, отображаемое в заголовке панели, которое соответствует национальной версии Excel (в данном случае ——русскоязычной версии); Visible — определяет режим отображения элемента в окне Excel. Далее, после загрузки, перемещаясь по списку имен загруженных в CheckListBoxl элементов, можно получить и изменить значения некоторых свойств выбранной панели. Можно использовать и другие свойства, например Position, Left, Top, Width, Heighclnteger (положение и размеры панели) и Rowindex integer (номер строки, которую занимает панель, когда панели собраны в какой-либо части главного окна). Если панель содержит кнопки или другие элементы управления, то свойство Builtln:Boolean находится в состоянии True, иначе — в состоянии False. Context:String — свой- ci'Bo панели, которое содержит строку со ссылкой на файл шаблона. Свойство Protection:Integer определяет режим защиты панели от изменений со стороны пользователя. Возможные значения этого сеойства, а также свойства Position описаны в Приложении 7.
Рассмотрим исходный текст процедуры, позволяющей скрывать/отображать выбранные панели с помощью свойства Visible панели.
Выбор панели элементов управления и задание ее отображения
procedure TOKBottomDlg2.CheckListBoxlClick(Sender: TObject);
begin
try
CornmandBars <Item(CheckListBoxl.Itemlndex+l].Visible:=
CheckListBoxl* Checked[CheckListBoxl.Itemindex];
except
CheckListBoxl.Checked[CheckListBoxl.Itemlndex]:=
not CheckListBoxl.Checked[CheckListBoxl.Itemindex]; messagebox(handle,1Ошибка изменения свойства Visible!1,1Внимание! I 0); end;
end;
Обработка исключительных ситуаций позволяет управлять значением свойства Checked в случаях возникновения ошибок. На рис. 16.5 представлена форма, которая отображает список элементов коллекции Command Bars главного окна приложения Excel и позволяет изменять положение панелей управления, выбранных в списке.
Рис. 16.5. Отображение списка панелей, изменение положения панели
Для управления положением панели предназначено свойство Position. Оно имеет тип Integer, может принимать одно из нескольких значений констант и определяет положение панели в главном окне редактора Excel. Панели могут располагаться вдоль верхней, нижней, левой или правой стороны этого окна, а также в центральной части окна. В табл> 16.2 представлены константы, соответствующее различным положениям панели в главном окне Excel.
Таблица 162 Возможные положения панели
Константа
Значение
Описание
msoBarFloating
4
Отдельная панель в центральной части главного окна
Таблица 76.2 (окончание)
Константа
Значение
Описание
msoBarBottom
3
Панель с кнопками, расположенная вдоль нижней стороны главного окна
msoBarLeft
0
Панель с кнопками, расположенная вдоль левой стороны главного окна
msoBarMenuBar
6
Меню
msoBarPopup
5
Всплывающее меню
msoBarRight
2
Панель с кнопками, расположенная вдоль правой стороны главного окна
msoBarTop
1
Панель с кнопками, расположенная вдоль верхней стороны главного окна
Для изменения положения панели достаточно в свойство Position записать то или иное значение, указанное в табл. 16.2, например, с помощью следующей процедуры.
ё Изменение положения панели
procedure TOKBottomDlg2.PositionClick(Sender: TObject); begin try
CammandBars.Item [ CheckListBox1.Itemlndex+l].Position:=Pos it ion•Itemindex; except
Position.Iteinlndex:=CommandBars.Item[CheckListBoxl.Itemlndex+l).Position; end; end;
Обратите внимание на то, что в этой процедуре используется обработка исключительной ситуации. Это необходимо в тех случаях, когда положение панели не может быть изменено. В таких случаях состояние объекта Position будет восстановлено в первоначальное состояние. Используя эту процедуру, изменим, положение панели Стандартная и поместим ее вдоль левой стороны главного окна (рис. 16*6).
Отметим некоторые особенности расположения панелей в главном окне приложения Excel. Не каждая панель может принимать все возможные положения, для некоторых панелей допустимы только определенные положения, а остальные являются недопустимыми. Для того чтобы выяснить, можно или нельзя изменить положение панели, достаточно проанализировать значение свойства Туре элемента коллекции CommandBars* Если значение этого свойства равно msoBarTypeNormal, то панель может быть расположе-
на в центральной части главного окна (как обычное окно) или пристыкована к одной нз сторон главного окна (кроме некоторых панелей, например. Цвет заливки). Если свойство Туре имеет другое значение, то расположить панель можно только определенным образом.
Рис. 16.6. Изменение положения панели СтандартнаяРис. 16.6. Изменение положения панели Стандартная
Рис. 16.6. Изменение положения панели Стандартная
Рис. 16.6. Изменение положения панели Стандартная
Панель Цвет заливки может находиться только в виде дочернего окна в главном окне приложения (ее нельзя пристыковать к одной из сторон главного окна). При попытке изменить положение этой панели мы получим ошибку выполнения, при этом панель останется на своем месте. В таких случаях желательно обрабатывать ошибку с выводом сообщения пользователю, используя программные скобки try …except, либо проверять свойство Туре и затем изменять позицию панели. В следующем примере используется второй способ.
Использование свойства Туре
CoinmandBar: =CoiumandBars. Item[CheckListBoxl. Itemlndex+l]; If CoiranandBar. Type=!insoBarTypeNonnal then
CommandBar.Розition:«Position.Itemindex;
На рис. 16.7 отображена панель Цвет заливки. Ее нельзя пристыковать к какой-либо стороне главного окна, несмотря на то, что для нее значение свойства Туре равно msoBarTypeNormal (т. е. 0).
Рис. 16.7. Отображаем панель Цвет заливки
В случае, когда панель не может быть размещена вдоль какой-либо стороны гдавного окна (представляет собой дочернее окно), положение панели определяется только ее координатами. Для изменения координат используем свойства Left и Тор.
;Изменение горизонтальной координаты панели
procedure TOKBottomDlg2.Button3Click(Sender: TObject); begin
CommandBar .Left: ^ConunandBar, Left-10;
end;
procedure TOKBottomDlg2.Button3Click(Sender: TObject); begin
CommandBar. Left: ^CoпwпanciBar»Left+10;
end;
Используя представленные процедуры» мы сможем перемещать панель в левую или в правую часть главного окна (рис. 16.8).
Положение панелей ^пр^вленыяПоложение панелей ^пр^вленыяЕ/? Wofksheet М enu 8аг ^ Строка меню листаЕ/? Wofksheet М enu 8аг ^ Строка меню листа二 Chart M吧 Bar = Строка".ЙЙВЖЁ ,二 Chart M吧 Bar = Строка".ЙЙВЖЁ ,меню диаграммыменю диаграммы咫 Formatoig * Форматирование□ PivotT able » Сващ^ые таблицыП Chait = Диаграммы「「Aeviewng ■ Рецеизиро&аниеForms =中Ормы「— Stop Recording ■ Остановка зелием О External Dag = Внешние данныеI 二 Auditing ■ Зависимости咫 Formatoig * Форматирование□ PivotT able » Сващ^ые таблицыП Chait = Диаграммы「「Aeviewng ■ Рецеизиро&аниеForms =中Ормы「— Stop Recording ■ Остановка зелием О External Dag = Внешние данныеI 二 Auditing ■ ЗависимостиAF ■ панели активны/неактив»е1AF ■ панели активны/неактив»е1"Ц&ет здлм&пим"Ц&ет здлм&пим'•Стандарт田“'•Стандарт田“РаспрложеничбImsoBdrFleatingРаспрложеничбImsoBdrFleating"3"3
Положение панелей ^пр^вленыя
Положение панелей ^пр^вленыя
Е/? Wofksheet М enu 8аг ^ Строка меню листа
Е/? Wofksheet М enu 8аг ^ Строка меню листа
二 Chart M吧 Bar = Строка
".ЙЙВЖЁ ,
二 Chart M吧 Bar = Строка
".ЙЙВЖЁ ,
меню диаграммы
меню диаграммы
咫 Formatoig * Форматирование
□ PivotT able » Сващ^ые таблицы
П Chait = Диаграммы
「「Aeviewng ■ Рецеизиро&ание
Forms =中Ормы
「— Stop Recording ■ Остановка зелием О External Dag = Внешние данные
I 二 Auditing ■ Зависимости
咫 Formatoig * Форматирование
□ PivotT able » Сващ^ые таблицы
П Chait = Диаграммы
「「Aeviewng ■ Рецеизиро&ание
Forms =中Ормы
「— Stop Recording ■ Остановка зелием О External Dag = Внешние данные
I 二 Auditing ■ Зависимости
AF ■ панели активны/неактив»е1
AF ■ панели активны/неактив»е1
"Ц&ет здлм&пим
"Ц&ет здлм&пим
'•Стандарт田“
'•Стандарт田“
Распрложеничб
ImsoBdrFleating
Распрложеничб
ImsoBdrFleating
"3
"3
Рис. 16.8. Перемещаем панель вправо
Иногда требуется запретить или ограничить доступ пользователя к той или иной панели. Ограничение доступа к панели может быть как полным, так и частичным. Например, нужно заблокировать для пользователя возможность перемещения панели. Для этих целей используем свойство Protection (тип Integer), при этом способ блокировки определяется значением этого свойства и задается определенными константами или их комбинациями.
Рассмотрим еще одно свойство панели, позволяющее активировать/деакти- вировать панель в главном окне приложения Excel. Свойство Enabled панелей имеет тип Boolean н определяет возможность доступа пользователя к ним. Когда свойство Enabled имеет значение False, пользователь не может пользоваться данной панелью (она вообще не отображается). Если изменить значение этого поля л установить его в True, то панель будет доступна и займет свое прежнее место в главном окне приложения Excel.
Этими свойствами удобно пользоваться, чтобы блокировать доступ пользователя к некоторым элементам управления. Рассмотрим следующую процедуру.
Отключение отображения панелей управления
procedure ТОКВо11omDlg2.CheckBoxlClick(Sender: TObject); var a_:integer;
begin
for a_:=l to CoramandBars. Count do
CommandBars * Item [ a_], Enabled: =CheckBox 1 * Checked;
end;
Данная процедура, перебирая все элементы коллекции Command Bars, устанавливает их свойства Enabled либо в значение True, либо в значение False. Воспользуемся ею и установим для всех панелей свойство Enabled в значение False. Результат представлен на рис. 16.9.
Рис. 169 Отключаем отображение панелей управления
Мы рассмотрели некоторые свойства встроенных панелей приложения MS Excel. Есть возможность программно создавать н удалять пользовательские панели н меню. Работа со встроенными панелями и меню имеет некоторые особенности, например их нельзя удалить.
Далее рассмотрим создание пользовательской панели (или меню).
Создание пользовательской панели (меню)
Для создания пользовательской (настраиваемой) панели используем метод Add коллекции CommandBars. У этого метода есть несколько аргументов. Синтаксис вызова метода Add:
Add{Name, Position, MenvBar, Temporary);
где NamerString —— название создаваемой панели, Position:Integer —— ее расположение (см. табл. 16.2), MenuBar:Boolean —— признак создания меню, Temporary:Boolean ——признак создания временной панели. Используя данные аргументы и их комбинации, мы можем создать как обычную панель с кнопками или всплывающее меню, так и заменить существующее главное меню приложения Excel. Любой из создаваемых компонентов коллекции Command Bars может быть создан как временный объект (на время одного сеанса работы приложения) или как постоянный объект. Рассмотрим создание пользовательской панели в приложениях Delphi на примере следующей процедуры.
Рис. 16.10. Создана пользовательская панель управления
Создание пользовательской панели i-—"…-二•二
procedure TForml.Button2Click(Sender: TObject);
const msoBarFloating=4;
var CommandBar_:variant;
begin
CommandBar_:=W.ConmandBars.Add('Пользовательская панель *, msoBarFloating, False, True);
CoiranandBa r_. Enabled: «True;
CommandBar_. Visible: =True; end;
По конкретным условиям, задаваемым аргументами в данной процедуре, создаваемая пользовательская панель отображается в центральной части главного окна. Результат выполнения процедуры представлен на рис. 16.10. Поскольку на новой панели нет ни одной кнопки, ее размер задан по умолчанию.
Мы исследовали общие свойства панели, присущие как панелям с кнопками, так и меню. Чтобы понять отличия, рассмотрим содержание самих панелей.
Элементы управления и их свойства
Как известно, панель может содержать кнопки млн другие элементы управления, например раскрывающиеся списки или подменю. Эти элементы в свою очередь принадлежат самой панели и объединены в коллекцию CommandBarControls. Посредством этой коллекции осуществляется доступ ко всем элементам управления выбранной панели. Коллекция Command BarControls имеет небольшое количество свойств и один метод. Мы будем использовать свойства Count (количество элементов коллекции) и Item (i:Integer) (набор элементов коллекции, где i — индекс кнопки), а также метод Add,позволяющий добавлять новые элементы на панель.
Рассмотрим некоторые свойства и методы объекта CommandBarControl (табл. 16.3)*
Таблица 76.3. Некоторые свойства и методы объекта CommandBarControl
Свойство или метод
Тип
Описание
DescriptionText
String
Назначение элемента управления
Caption
String
Надпись на элементе управления
Execute
Метод
Выполнить команду, ассоциированную с элементом управления (кнопкой)
Enabled
Boolean
Доступный/недоступный элемент управления
Visible
Boolean
1 Видимый/невидимый элемент управления
HelpFile
String
Файл помощи для элемента управления
HelpContextID
Integer
Индекс в файле помощи для элемента управления
ID
Integer
Идентификатор элемента управления
Таблица 16.3 (окончание)
Свойство или метод
Тип
Описание
Index
Integer
Индекс элемента управления на панели
OnAction
String
Имя макроса для элемента управления
Reset
Метод
Сбросить пользовательские настройки для элемента управления
SetFocus
Метод
Активировать элемент управления
TooltipText
String
Всплывающая подсказка для элемента управления
Width
Extended
Ширина элемента управления
Left
Extended
Отступ от левой границы панели
Height
Extended
Высота элемента управления
Top
Extended
Отступ от верхней границы панели
Исследуем содержание панели и некоторые свойства элементов управления. Если рассматривать меню, то его основное отличие от панели с кнопками состоит в том, что элементом управления в составе меню может быть как пункт меню, так и подменю со своими элементами управления и т. д.
Чтобы проанализировать свойства панели, используем свойства Count и Item() коллекции ConimandBarControls, а также свойства Caption и TooltipText. Загрузим весь список кнопок и других элементов панели в объект List Box с помощью следующей процедуры.
:Загрузка списка элементов управления панели
procedure TOKBottomDlgb • E^ormCreate (Sender: TObject);
var a_:integer;
eee_:string;
begin
CornmandBa rCont rols: ^OKBottomDlg 4 . ConmandBars. Item [ OKBottomDlg 4 .
ListBoxl. It^rnlndex+l] .Controls;
for a_:=l to CommandBarControls,Count do
begin
eee : =CoinmandBarControls. Item [ a_] .Caption+T = * +
CornmandBarControls* Item[a_] . TooltipText;
ListBoxl. I terns. Add (eee_);
end;
Ccrnma ndBa r Cont г о 1: ^CommandBa rCon t rol s * Item[l ];
end;
Затем, перемещаясь по списку элементов управления для выбранной панели, загруженному в компонент ListBoxl, считаем некоторые их свойства.
Получение ссылки на элемент управления
procedure TOKBottomDlgb.ListBoxlCLick(Sender: TObject); begin
CcmiandBa rCont г о 1: =ConroandBarCont rols. Item [ ListBoxl * Itemlndex+l]; b__visible.Checked:=CommandBarControl.Visible;
DescriptionText.Text:-CommandBarCont го1.DescriptionText;
HelpFile. Text: =CommanciBa rCont г о 1. HelpFile+' I * +
inttostr {CornmandBarControl. HelpContextID) + ■「; end;
Рис. 16,11. Состав панели Форматирование
На рис. 16.11 показан результат выполнения представленных процедур. Верхний список (компонент ListBoxl), расположенный в форме нашего приложения, заполнен названиями элементов управления панели Форматирование. При перемещении по этому списку в полях формы, расположен-
ных ниже списка, для выбранного элемента управления отображаются назначение и ссылка на файл помощи.
Как видно из рис. 16.10, переходя от одного элемента управления к другому, мы можем получать н изменять их свойства. Для этого достаточно загрузить в переменную типа Variant ссылку на элемент ltem(i:Integer), например, как это выполнено в следующем операторе:
CoramandBarControl: =CoimiandBarControls. Item [ Lis tBoxl. Itemlndex+l];
Далее, работая co ссылкой, мы получаем доступ к различным свойствам выбранного элемента управления. В качестве примера сделаем невидимой выбранную кнопку, изменим ее надпись (значение свойства Caption) и запустим на выполнение команду, связанную с данной кнопкой.
:Управление свойствами кнопки
procedure TOKBottomDlg5.b_visibleClick(Sender: TObject);
begin
CommandBa rCont г о 1 * Visible :=b_uisible. Checked; end;
procedure TOKBottomDlg5. B__CaptionChange (Sender : TObj ect);
begin
CcmmandBarCcmt rol. Caption: =B_Caption. Text; end;
procedure TOKBottomDlg5.ButtonlClick(Sender: TObject);
begin
CommandBa rContro 1. Execute;
end;
Используя последнюю процедуру, можно запускать макросы, связанные с кнопками. Для этого удобнее использовать пользовательские, временные панели и элементы управления, создание которых будет рассмотрено далее.
Главное меню
В отличие от панели инструментов, главное меню н его элементы имеют несколько иные свойства, основным отличием является возможность для каждого злемента меню содержать свою коллекцию элементов. Проще говоря, каждый элемент меню может содержать подменю, элементы которого также могут содержать свое подменю. Таким образом, меню имеет древовидную структуру, В этом случае доступ к любым элементам обеспечивается посредством элементов коллекций Controls, принадлежащих индивидуально
352 Часть 例:Разработка #окумзнтв м прмл0*ениМ MS Excel 日 Delphi каждому элементу меню. На рис. 16.12 представлен пример объектной модели меню.
Рис. 16»12. Объектная модель главного меню
Используя коллекции Controls и методы элементов этих коллекций Execute и Set Focus, можно развернуть главное меню примерно так, как показано на рис. 16.13. Исходный текст этого модуля программы н форму для среды разработки приложений Delphi можно посмотреть в приложении на сопроводительном компакт-диске книги.
Из рнс. 16.13 понятно, что мы раскрываем подменю (дочерний набор элементов меню)* используя свойства и методы родительских объектов, которым принадлежат коллекции Controls (раскрываемое подменю). Метод Execute запускает команду, связанную с данным элементом меню, а если с этим элементом связано подменю, то данная команда раскрывает его. Метод SetFocus устанавливает фокус на данный элемент меню.
Рис. 16.13. Анализ объекта ^главное меню"
От исследования существующих элементов меню и элементов упрааления на обычных панелях перейдем к созданию собственных элементов управления.
Создание
пользовательского элемента управления
Все элементы управления для любой панели собраны в коллекцию Controls. Данная коллекция не только объединяет элементы и их свойства» но и обладает методами, позволяющими создавать или удалять элементы управления. Рассмотрим два метода коллекции. Метод Add создает новый элемент, а метод Delete — удаляет выбранный элемент. Причем метод Delete принадлежит элементу коллекции, а не самой коллекции, как метод Add, и его нельзя применить к стандартным элементам коллекции, а только к вновь созданным.
Синтаксис вызова метода Add:
Add(Type, Id, Parameter, Before, Temporary);
12 Зак "23
где Type: Integer — тип объекта. Id Integer — идентификатор объекта. Parameter: String ——имя связанной с данным элементом команды, Before: Boolean — признак разделителя, TemporaryiBoolean — признак создания временного элемента. Возможные типы создаваемых объектов указаны в табл. 16.4.
Таблица 16.4. Возможные типы создаваемых объектов
Константа
Значение
Тип создаваемого объекта
msoControlButton
1
Кнопка
msoControlEdit
2
Поле ввода
msoControlDropdown
3
Раскрывающийся список
msoControlComboBox
4
Комбинированный список
msoControlPopup
10
Элемент меню
Создадим обычную кнопку на панели Стандартная. Используем метод Add, первый аргумент которого (Туре) равен msoControlButton, второй (ID)— единице. Установим знамение надписи, записав в Caption текст, выберем значок (свойство Faceld) и стиль кнопки (отображение и значка, и текста).
Создание кнопки
Var msButton:variant;
procedure TOKBottomDlgS, Button2Click (Sender: TObj ect);
begin
msButton: =CommandBars. Item [ CheckListBoxl. Itemlndex4-1 ].
Controls. Add (Type: =rosoControlButton, ID:=1);
msButton.Caption:-'Простая кнопка'; end;
procedure TOKBottomDlg8* FaceldChange(Sender: TObject); begin
msButton. Faceld: =FaceId .Value; end;
procedure TOKBottomDlgS.ButtonStyleChange(Sender: TObject); begin
msButton.Style:=ButtonStyle.Itemindex;
end;
Результат выполнения представленных процедур показан на рис. 16.14. На панели Стандартная создана кнопка, задан текст, выбран значок и установлен стиль, в соответствии с которым отображаются текст и значок.
355355
355
355
I Стандартная
日今",三「一一Гу
轉彎:
卢「,0,⑵也Простая кнопка
Рис. 16.14. Создаем новую кнопку на панели Стандартная
Изменим стиль кнопки, записав в свойство msButton.Style константу msoButtonlcon или msoButtonCaption. Соответственно получаем результат, представленный на рис. 16Л5 н 16.16.
;Выбор стиля кнопки "только значок'*
procedure ТОКВоttomDlgS.ButtonStyleChange(Sender: TObject); begin
msButton,Style:= msoButtonlcon;
Рис. 56,16. На кнопке только текстРис. 56,16. На кнопке только текстend;
Рис. 56,16. На кнопке только текст
Рис. 56,16. На кнопке только текст
■■卡
M更!残二②也
1Проггая кнопка
Рис. 16.15. На кнопке только значок
Константа msoButtonlcon представляет собой число и имеет значение 1. Записав в свойство Style кнопки константу msoButtonCaption (значение 2), получим кнопку, на которой расположен только текст.
「,—,「...
:Выбор стиля кнопки "только текст"
procedure TOKBottorrUDlg8. ButtonStyleChange (Sender: TObj ect); begin
msButton. Style: = ms oBut tonCapt ion;
end;
При создании обычного пользовательского элемента (кнопки) мы присваивали параметру ID значение, равное единице. Присвоив данному параметру другое значение, получим функциональную кнопку со своим значком и командой, выполняемой при обращении к данной кнопке. Для примера можем использовать значения от 2 до 9 или от 1850 до 1859.
j Создание кнопок с предопределенными свойствами
procedure TOKBottomDlgB.ButtonlClick(Sender: TObject);
var nisbootoni: variant;
a_: integer;
begin
for a_:=1850 to 1859 do begin
msbootom: =CoinmandBars. Item [ CheckListBoxl ・ Itemlndex+l ] . Controls.
Add(Type: s=msoControlButton, ID:^inttostr(a_));
msbootom,Caption:-1 工A1 +inttostr (a_);
end;
end;
Значение значка для кнопки определяется величиной числовой константы, записанной в свойство Faceld элемента управления. В качестве примера создадим кнопки со значками для значений этого свойства от 0 до 500.
01課z Q?❷4 口0 ?06圈7 mB Ils ^г0 I三н -е1г®1I律■事招桃鶏Ri? Die电拶*西区211gl22津23巨制
Q芯依遥]2, ®28明29 \ X 4 31 口33 @3曲羽零矣曲36 0打*第i弟■ *0 * 41好心蟲心圈M句"M463"比48 ?妙0 50 凹 31 C 與 3 卑—54=用m56』57 ■ 99 ©69 a Б0 £ 61 aS 屮 63 *闘用舫 ШgЬ @67 3 S8 口 Б3 0 7Gl 爾 2 7 2 3 73 4 74 5 75 6 76 7 77 8 7В9 79А8йВ9)С 62 D83 Е 04F 85 G 86 Н В?I 喲 J 89K 90 L坤 M92MS3Q 酶户第 0 9G
R 97 S ЭД Т 99 U 10G V 101 W WJ X 103 Y 1£M Z 105 曰IDS $1*。10? ® 侬犷110 炉111HJ Ж113 KT" U 115 Щ116 Ц fT7
U110 可 113 К 120 M 価■ U2 ■ У Ц?124 |®125O13£回切G12S г 1麗 \ 価口 131 * U?* 133♦ 1Н ♦ 1J5 ♦ 1籌* 137』係
圖 133『1 和 M Bl 羅】*3 ЁЙ14 3 唸 М4 —1心—1据 I U7"覗+143 Q150 , 1界О」52 >153М 1Б44 155 ♦ 16Б Н 15?**15в 肥 153 ,
畑 160 屮佝 澀険 紹 1® 0164 0165 马痛 咤⑶ ^W^ilSS 口1?0 —171 飲 17J 晦 1舟'U4 В0Ш Ш176 ffil77 Q173 伶 1越 口 1 圍 Etfttjl開曜啪.184 g 185 卜 13s &18 7 ^188 "預盘⑶動 191Hls2 Ali 虫(11 出國195 蕉 19E W 価 & 1SB 心 199 凸 200 哀如 国.202 田Я0 зЙh 营205 &206 %斓胃208 施209 制?也m扣版制2 唸213陣2140| 215 о0215嘟寧7图21Hatl219 F 220 施顕旨222
瀰223 0?24 5122S E 22s学何 .硒画N2S 口 230 Q剧已便于绯 日中白235后236穹尹/238/ 津电热 RMI仁"2、243
吟?" Zз5 噌" EP24 7 勉 248 相2*3 W融= 251 *Й2aЛ3 *25< AJK续擁吐痔 帥m&259/260*261 与凌 Ж^Э0婚
静居5 ■减 *1267 0Ж ©ЖS修加紀271丿初 dmp2M @6 ®275E27?b通我;79窗旗I电I2Q1n202圆2Ю Ц率做海
■僦国20?固痴 蝇2ад *?30 №*231整朗争Яз V0 融 您 学 法黑各?自夜国2э9;」Зоо陛аие1зи名зга野зи 期 銀如 а 307 Люо м"з(и*'31Q A 311 电箝卄 313 台 314 0 3150 5W 1羽7 嗯重8 0 3199320 崛 321Q 322津 3?3 售親 4 理逑加 326断期?
га2е脸窮»0330国知 Ззг аш 3за 珏 拨 级壮3а■’"z脈h陶 卩謳0заэu 9?М5歹翻号/*7煽飛
/ 349 * 350 Q351f 35г на 353 там 函355 9 356 曰 357 X 歯♦姻▼ 3GQ 0.361嶼 362 皿 363橘方@ 365 £| %6 励 3S7 %368動 363
圜370(пз?1 日筑"='373 *+'374 "」375 V37G >НЗЛ …陋 *(R3?Э *f 300 *:" 3S1 '/382X3S3 "睛384萩 388К38Б 紋387 口 388 n389~[ЭЭО
.Д ЗЭ1 J 39? 口 ИЗ ■ 3弘 軍395丸396 . 357喇搅舟幽 * 4W &物 里碗客血 /40* ; ВДВ X 406二佛汕4⑱% 409 О 410白4门 Q 412 О 413 > 414窿415信416 @4" ■4冉工始9"宿也側 0夜。■3 ■犯4=修4142s >42?*例 -必比&万431膚5 躍433■仙 宏435 Й^36自俯 曲《0回439庐神::«l Х*«十错 a府4e"5向■融$ 4"圈MG @ 乂3 <460噬得 a453乐《3 旳 4S4 % 455 肥]4弘罔幽 7» 456 t <53 物械唸 4Gl 吃 4Б2 <£>463 °=4W § 466 .466 白附 « 469 量 |4® 弓 47U 屈"1 ^m^iTJ TS *7* 國6 *4抬叭切X 4 78г4用口《0 ■好1 ♦ 432*483 • W 丁侬 0他0胸 口候屈巡Г7,90 Г7極Г;理17。I5期I!啮
4%薫旧ES侬等侬 m 500
Рис. 16.17. Несколько вариантов кнопок
;Создание кнопок с разными значками
procedure TForml.Button13Click(Sender: TObject); таг panel, buttom:variant;
a_: integer;
begin
panel: =W. CammandBars. Add (' Новая панель 1);
panel. Visible: ==7 rue;
for a」"0 to 500 do begin
button: =panel.Controls.Add(Type: =msoControlButton# ID:-!);
but tom. Style : =imsoButtonIconAndCapt ion;
buttom.Caption:=inttostr(a_);
buttom,Faceld:=a_;
end;
end;
Вид кнопок созданной панели показан на рис. 16.17.
Использование Visual Basic Editor
До этого мы рассматривали доступ к элементам рабочей книги н элементам управления из внешних приложений Delphi. Для полного представления о возможностях управления приложением Excel из внешних программ этого недостаточно. Объектная модель Excel позволяет управлять не только элементами создаваемых документов, но и элементами программ на встроенном языке. Для доступа к элементам программ используется объект VBE. Родительским объектом для VBE является Application (Application.VBE), а свойства и методы самого объекта VBE позволяют полностью управлять приложениями Visual Basic из внешних программ. На рис. 16.18 предстаапе- на часть общей объектной модели VBE, позволяющая понять, каким образом можно получить доступ непосредственно к текстам встроенных макросов.
Объект VBE включает в себя коллекции проектов, областей программ, элементов управления и коллекцию окон редактора. Очевидно, что, используя перечисленные ссылки, можно получить доступ к элементам этих коллекций н к их свойствам. Кроме этих коллекций объект VBE включает ссылки на активные элементы этих коллекций и собственные свойства. Собственным свойством является строка, содержащая номер версии редактора. В конечном итоге нам в целях разработки эффективных приложений достаточно будет получить доступ к текстам макросов. Для того чтобы создать новые или изменить уже существующие программные модули VB, используем свойства VBE, представленные в табл. 16.5.
Таблица 16.5. Свойства объекта VBE
Свойство
Тип
Назначение
Version
Строка
Версия
ActiveCodePane
Объект
Ссыпка на активный модуль
Таблица 76.5 (окончание)
Свойство
Тип
Назначение
ActiveVBProject
Объект
Ссылка на активный проект
ActiveWindow
Объект
Ссылка на активное окно
CodePanes
Объект
Ссылка на коллекцию модулей
Command Bars
Объект
Ссылка на коллекцию элементов управлеНИЯ
Events.CommandBarEvents
Объект
Ссылка на объект-источник события при воздействии на элемент управления
Events. ReferencesEvents
Объект
Ссылка на обьект-источник события при добавлении или удалении ссылок
MainWindow
Объект
Ссылка на главное окно
VBE.SelectedVBComponent
Объект
Ссылка на выделенный элемент
VBProjects
Объект
Ссылка на коллекцию проектов
Windows
Объект
Ссылка на коллекцию окон
Когда по условиям логики работы вашего приложения требуется знать версию Visual Basic Editor, можно воспользоваться свойством Version объекта VBE и получить номер версии редактора.
Получение номера версии VBE
procedure TForml,Buttonl7Click (Sender: TObject);
var Version:string;
begin
Version:=E.VBE.Version;
messagebox(handle,pchar(Version),*Номер версии Visual Basic1,0); end;
Для программирования приложений знать только номер версии часто бывает недостаточно, поэтому обратим внимание на коллекции VBProjects и Со- dePanes. Первая представляет собой список, как правило, совпадающий со списком открытых рабочих книг* Каждая рабочая книга может содержать программные модули, модули классов, формы и модули документов. Совокупность всех или части перечисленных элементов представляет собой проект. Далее мы будем рассматривать только программные модули, которые являются элементами коллекции VBComponents и могут быть добавлены или удалены с помощью методов этой коллекции. Коллекция Code Panes позволяет только обеспечить доступ к текстам программных модулей. На-
пример, доступ к программному модулю первого элемента Code Panes осуществляется с помощью следующего оператора:
CodeModule :=Е.VBE.CodePanes.Item(1)*CodeModule;
Рис. 16.18. Фрагмент объектной модели VBE
Программный модуль непосредственно содержит тексты макросов. Методы и свойства этого объекта (CodeModule) мы рассмотрим позже. Сейчас вер* немея к рассмотрению свойств элемента коллекции VBProjects, доступ к которому обеспечивает метод Item(i:lnteger), Его свойства перечислены в табл. 166
Таблица 16.6. Свойства элемента коллекции VBProjects
Свойство
Тип
Назначение
References
Объект
Ссылки на внешние объекты
Collection
Объект
Ссылка на родительский объект VBProjects
Таблица 16.6 (окончание)
Свойство
Тип
Назначение
Description
String
Текст, связанный с объектом
HelpContextID
Integer
Ссылка в файле помощи
HelpFile
String
Имя файла помощи
Mode
Integer
Режим, в котором находится проект
Name
String
Имя объекта
Protection
integer
Признак защиты проекта
Saved
Boolean
True — сохранен, False — не сохранен
VBE
Обьект
Ссылка на корневой объект VBE
VBComponents
Объект
Ссылка на коллекцию компонентов
В табл. 16,6 перечислены свойства любого проекта, созданного в среде рабочей кннгн Excel. Используем только коллекцию VBComponents, которая представляет собой набор элементов, входящих в проект (табл. 16.7).
Таблица 76.7. Свойства и методы коллекции VBComponents
Свойство или метод
Тип
Назначение
Add
Метод
Добавление нового компонента
Count
Integer
Количество элементов коллекции
Import
Метод
Импорт модуля из файла
Aemove
Метод
Удаление компонента
Hem
Метод
Элемент коллекции
Исследуем некоторые свойства и методы этой коллекции. Свойство Count представляет собой количество элементов коллекции, точнее, суммарное количество модулей классов, форм, стандартных модулей н модулей документа. Чтобы добавить новый элемент коллекции VBComponents, используем метод Add. Единственным аргументом этого метода является числовая константа, определяющая тип создаваемого элемента. Например, создадим форму Microsoft, для этого в качестве аргумента метода Add используем константу vbext_ct__M S Form=3. -
Создание формы Microsoft
procedure TFoml.Button22Click (Sender: TObject);
begin
E,VBE.VBProj ects.Item(1).VBComponents.Add (vbext_ct^MSForm)
end;
Рис. 16.19. В 叩мложенмм VB создана новая форма Microsoft
На рис. 16.19 представлен результат выполнения данной процедуры.
Для добавления других типов модулей используем метод Add с другой константой в качестве аргумента. На практике в приложениях Delphi часто требуется создавать стандартные модули, содержащие тексты макросов. С чем это связано? В предыдущих главах для работы с книгами Excel мы использовали методы, аргументы которых имеют совместимые типы данных для Excel и Delphi. При этом не возникало проблем при экспорте и импорте информации между приложением Delphi и рабочей книгой Excel. Совместимыми типами данных являются целые числа н числа с плавающей точкой, строка и дата. Данные, представляющие собой, например, массив точек, не могут передаваться из Delphi в Excel. В таких случаях мы используем возможность создания макроса средствами Delphi и передачи ему команды на выполнение. При этом макросы могут храниться в виде текстовых файлов и загружаться в проект VBE непосредственно перед выполнением и удаляться после окончания выполнения. Рассмотрим процедуру, кото
рая демонстрирует эту возможность.
:Загрузка текста модуля из текстового файла
procedure TFoml.Button23Click(Sender: TObject); begin
if not 0penDialog2.Execute then exit;
E. VBE. VBProj ects. I tem (1) »VBCcnponents. Irc^ort (OpenDialog2. Fi 1 eName); end;
Как быть, если текст макроса, который требуется загрузить в проект и выполнить, создается в приложении? Для этого мы должны создать новый стандартный модуль. Используем метод Add(vbext_ct_StdModule), который возвращает ссылку на созданный объект CodeModule. Объект CodeModule содержит тексты макросов и методы работы с этими текстами. Используя метод AddFromString объекта CodeModule, загружаем текст макроса.
;Загрузка текста макроса из строки
procedure TForml .Button24Click (Sender: TObject);
var text_macro:String;
begin
CodeModule: =E.VBE. VBProj ects * Item (1) * VBComponents.
Add (vbext_ct_st dModule). C od^dodul 白;
text^macro: =TSub Новый_макрос () r+Chr (10) +Chr {13) +
♦MsgSox "Новый макрос H T +Ctir (10) +Chr (13) +f End Sub 1;
CodeModule. AddFromString (text_rnacro);
E• Run(,Новый_макрос () *); end;
В результате выполнения данной процедуры будет создан, а затем н выполнен новый макрос. В представленном примере мы рассмотрели и использовали только одно свойство элемента коллекции VBComponents — объект CodeModule. Сам объект CodeModule содержит тексты макросов н набор методов и свойств, позволяющих манипулировать ими (табл. 16.8).
Таблица 16.8. Некоторые свойства и методы объекта CodeModule
Свойство или метод
Тип
Назначение
AddFromFile
Метод
Загрузка текста из файла
AddFromString
Метод
Загрузка текста из строки
CountOfLines
Integer
Количества строк текста в программном модуле
CountQfDeclarationLines
Integer
Количество строк текста в разделе описаний
InsertLines
Метод
Вставка текста из строки
Таблица 16.8 (окончание)
Свойство или метод
Тип
Назначение
DeleteLines
Метод
Удаление текста из модуля
Lines
Метод
Возвращение текста модуля
ProcBodyLine
Integer
Номер первой строки процедуры
ProcCountLines
Integer
Количество строк в процедуре
ProcOfLine
String
Имя процедуры, содержащей строку с заданным номером
ProcStartLine
Integer
Номер строки, с которой начинается заданная процедура
Используя свойство Lines, получим текст модуля проекта на языке Visual Basic. Для этого воспользуемся следующей процедурой.
;Получение текста модуля
var CodeModule:variant;
procedure TForml»Button21Click(Sender: TQbject);
var Text_modula:string;
begin
CodeModule: =E,VBE.VBProjects.Item(1) .VBCortponents. Item (1) . CodeModule;
Text^nodula: ^CodeModule. Lines [ 1, CodeModule. CountOfLines ];
messagebox(handle,pchar(Text_modula), '',0); end;
Перед тем как воспользоваться представленной процедурой, необходимо открыть рабочую книгу, которая должна содержать макросы. При этом результат выполнения процедуры будет выглядеть так, как показано на рис. 16.20.
В заключение рассмотрим пример с использованием программирования панелей, элементов управления н макросов. В этом примере мы из приложения Delphi создадим временные элементы управления и процедуру на Visual Basic, выполним ее и удалим созданные компоненты.
j Создание и использование макроса из приложений Delphi
procedure TForml.Button5Click(Sender: TObject>;
const vbext_ct_StdModule=l;
var CodeModule:variant;
CammandBar; variant;
msbootom:variant;
eee :string;
X MjcfaioH Cnc«< * Печать [Томно рм >п«тин|"!, ,':-[,••' ЩЗЕ
■EBflCTi • 4y АжгоФкда»!* \ %口。図*'今•金•&•言岡巨■. Гото»■EBflCTi • 4y АжгоФкда»!* \ %口。図*'今•金•&•言岡巨■. Гото»;+)里*Дп 口рат Вик Вот** Фисааг Сервис ан~е Qu«o ?.-函制D G^ В昌口廿*崎®中■营£右Н Н独*制妹,粤勘4"w.иr m 整奪з图学X .讶百;货串 -;+)里*Дп 口рат Вик Вот** Фисааг Сервис ан~е Qu«o ?.-函制D G^ В昌口廿*崎®中■营£右Н Н独*制妹,粤勘4"w.иr m 整奪з图学X .讶百;货串 -Рис. 16.20. Отображаем содержимое программного модуляРис. 16.20. Отображаем содержимое программного модуляA.:,*m.£:,b*A ■二f :vA.:,*m.£:,b*A ■二f :v
■EBflCTi • 4y АжгоФкда»!* \ %口。図*'今•金•&•言岡巨■. Гото»
■EBflCTi • 4y АжгоФкда»!* \ %口。図*'今•金•&•言岡巨■. Гото»
;+)里*Дп 口рат Вик Вот** Фисааг Сервис ан~е Qu«o ?.-函制
D G^ В昌口廿*崎®中■营£右Н Н独*制妹,粤
勘4"w.иr m 整奪з图学X .讶百;货串 -
;+)里*Дп 口рат Вик Вот** Фисааг Сервис ан~е Qu«o ?.-函制
D G^ В昌口廿*崎®中■营£右Н Н独*制妹,粤
勘4"w.иr m 整奪з图学X .讶百;货串 -
Рис. 16.20. Отображаем содержимое программного модуля
Рис. 16.20. Отображаем содержимое программного модуля
A.:,*m.£:,b*A ■二f :v
A.:,*m.£:,b*A ■二f :v
begin
CodeModule: =E. VBE. VBProj ect s .1 tem (1) . VBComponents.
Add (vbex t_ct_StdModule) .CodeModule;
eejlSub Макрос! () *+Chr (10)+Chr (13)+
'MsgBox * +Chr(34)+'Выполняется процедура нажатия кнопки * + Chr(34)+Chr(10)+Chr{13)+
'set document=Application.WorkBooks.Add '+Ch工(10)+Chr(13) +
Pim pts(l To 7f 1 To 2) As Single '+Chr(10)+Chr(13)+
rptS(lr 'pts(l, 'pts (2, *pts ⑵ *pts(3, rpts(3, 'pts (4, ,pts(4, ,pts(5, 『pts(5, 'pts (6,rptS(lr 'pts(l, 'pts (2, *pts ⑵ *pts(3, rpts(3, 'pts (4, ,pts(4, ,pts(5, 『pts(5, 'pts (6,= 0 ♦+Chr(10)+Chr(13)+= 0 #+СНг(10)+СЬг(13)+= 0 ♦+Chr(10)+Chr(13)+= 0 #+СНг(10)+СЬг(13)+1)2)1)2)1)2)1)2)1)1)2)1)2)1)2)1)2)1)72 ,+Chr(10)+Chr(13)+72 *+Chr(10)+Chr(13)+100 f+Chr(10)+Chr(13)+72 ,+Chr(10)+Chr(13)+72 *+Chr(10)+Chr(13)+100 f+Chr(10)+Chr(13)+4020509040205090'+Chr(10)+Cht(13)+ 7ch r(10)+Chr (13) + '+Chr(10)+Chr(13)+ *+Chr(10)+Chr(13)+'+Chr(10)+Cht(13)+ 7ch r(10)+Chr (13) + '+Chr(10)+Chr(13)+ *+Chr(10)+Chr(13)+120 »+Chr(10)+Chr(13)+60 ,+Chr(lQ)+Chr(13)+120 »+Chr(10)+Chr(13)+60 ,+Chr(lQ)+Chr(13)+
rptS(lr 'pts(l, 'pts (2, *pts ⑵ *pts(3, rpts(3, 'pts (4, ,pts(4, ,pts(5, 『pts(5, 'pts (6,
rptS(lr 'pts(l, 'pts (2, *pts ⑵ *pts(3, rpts(3, 'pts (4, ,pts(4, ,pts(5, 『pts(5, 'pts (6,
= 0 ♦+Chr(10)+Chr(13)+
= 0 #+СНг(10)+СЬг(13)+
= 0 ♦+Chr(10)+Chr(13)+
= 0 #+СНг(10)+СЬг(13)+
1)
2)
1)
2)
1)
2)
1)
2)
1)
1)
2)
1)
2)
1)
2)
1)
2)
1)
72 ,+Chr(10)+Chr(13)+
72 *+Chr(10)+Chr(13)+
100 f+Chr(10)+Chr(13)+
72 ,+Chr(10)+Chr(13)+
72 *+Chr(10)+Chr(13)+
100 f+Chr(10)+Chr(13)+
40
20
50
90
40
20
50
90
'+Chr(10)+Cht(13)+ 7ch r(10)+Chr (13) + '+Chr(10)+Chr(13)+ *+Chr(10)+Chr(13)+
'+Chr(10)+Cht(13)+ 7ch r(10)+Chr (13) + '+Chr(10)+Chr(13)+ *+Chr(10)+Chr(13)+
120 »+Chr(10)+Chr(13)+
60 ,+Chr(lQ)+Chr(13)+
120 »+Chr(10)+Chr(13)+
60 ,+Chr(lQ)+Chr(13)+
'pts(6, 2) = 30 t+Chr(10)+Chr{13)+
Tpts(7, L) = 150『+Chr(:L0)+Chi:{13) +
'pts (7, 2) = 90 ,+Chr(10)+Chr(13) +
fActiveSheet・Shapes・MdPolyline (pts) '+Chr(10)+Chr(13) +
1End Sub*;
CodeModule. AddFromString (eee_);
eee_: =CodeModule. name;
messagebox(handle,pchar(fМакрос "Макрос]" создан в модуле "г+е@巳_+,"'), 'I。);
CormiandBar: =Е * СсилгпапбВа rs * Add (Naine: =' Временная панель *, Position:=!iiisoBarFloating);
ConmandBar. Enabled: -true;
CommandBar .Visible: =true;
messagebox (handle, pchar (rСоздана временная панель0);
MSBootom: =E ・ CommandBars. Item[1 Временная панель ' ] . Controls.
Add (Type: ^msoControlButton, ID:=1);
MSBootom. Caption: =1 Временная кнопка';
MSBootom* OnAction: =CodeModule. name+ *. Макрос 11;
messagebox(handle,pchar(1Создана временная кнопка1),'1,0);
msbootom. Execute;
MSBootom.Delete;
messagebox(handle/pchar('Удалена временная кнопка1),'*,0);
CommandBar * Delete;
messagebox (handlef pchar (' Удалена временная панель > ,0);
E. Application. VEE * VBProj ects, Item (1) . VBCon^onentg.
Remove^CodeModule.parent);
messagebox (handle,pchar (1 Модуле "' +eee_+1 п и "Макрос]" удалены*), L 0); end;
」重出
Sub Я»про<71 ()
Паевое •Выпелиле'Кж #рон«лур«
з・& tfcicuMnt • Appl lent ton. Ooe
Mm #c«ti TO 3 1 Ta 對 JW В
pg 口.幫•• Q
PC*t2, 1) - П
II.H &旨/个6
|,其里■* 3*-» ЯИ 冉国吆L 嚇* Ормом 3aMi<*#!© 迦е 工 ха・а:: :св:/,#.
三履而或Qt*(ne”;Tb^『 T ! 'j Mooeoft Еям* Обхжти ❷!hw^wfcbe* 切 МтМЗЬнС"
I 喊 MMCheeU)
Q] niTTCS掠叫
Mmm»7 Д Мадупь!
pts<2, JJ - П
ptao, u ■ im
=Й*Л ,
Рис. 16.21. Создан модуль и записан текст макроса
F
n ・H Mtff%*®
Xn・Q
71
3
ЯчЬ Миыфое! (I
Ки(»Всж *Вмиолидетс« npdueaw*
ПН pt# 11 TC 力 1 Те 2} H 51»
pt=(l, Ik - 0
■工龄 Qp«** Bhi Scniwa 中ffta" "Плам ^*^.,^^..^ Ag 旧寓
Set dgcuaM-ut • Appticsclon.Var*'
町叵一.
^1 M)r>a*ol< Vuual UjHig Пйчв1ь ih |»смпг.Л1Ч1чын | |Мо*4<*»П |Про>'Г>йМм4|]|
「电之2 Пмм М』■•* 早《и*г £,•£».< Л*»«* Qv® J ■
・pG»ST・®b X ®аь …•. ••工•財 X *•刁」•• • £ '<10二■ -■■■中X ,m内0単.,(*・入村
一 -
Рис. 16.22. Макрос запущен на выполнение
白 MKrocoft Erati об wth ,电 tttf#ort*/k
ЧЙГМпМЭ«ёП
1 ipn<TZ(5>«E?) С^Х9*<з> 三-SMmi
离 Ммуя»| 風 zymiu 負葬管
Далее выполняются метод Execute кнопки, с которой связан макрос, и программа на Visual Basic, записанная в программном модуле (рис. 16.22).
После выполнения удаляются созданные элементы управления и программный модуль с текстом подпрограммы на Visual Basic (рис. 16.23).
* 里《1л []{м"^> Вм 旧4».* ^овд# Utw<« Janut». Cafvc Q««j ?* 里《1л []{м"^> Вм 旧4».* ^овд# Utw<« Janut». Cafvc Q««j ?U .岷朗曲超广田U .岷朗曲超广田耳尸5耳尸5白 不宣白 不宣Sub BM30BjMe№! |Sub BM30BjMe№! |1 Wv^vx Арр 丄丄 mt гаи. v&r. vxp#Qj[1 Wv^vx Арр 丄丄 mt гаи. v&r. vxp#Qj[步皿步皿ie<r i^u. 1к;*т4Лме Влахгч jie<r i^u. 1к;*т4Лме Влахгч j暴 им»н>Ш1ичтыА;Г 吞占 NkrtMOft Excfll Обмпа 治 ftWWqHto*暴 им»н>Ш1ичтыА;Г 吞占 NkrtMOft Excfll Обмпа 治 ftWWqHto*I I 4)rt«T2(ShMtt) i)ft<r3(»w<3) 日力м«ум Tthtugi i «CriugioI I 4)rt«T2(ShMtt) i)ft<r3(»w<3) 日力м«ум Tthtugi i «Criugio.A・跑项已■■.A・跑项已■■44Рис. 16.23. Макрос выполнен, элементы управления и программный модуль удаленыРис. 16.23. Макрос выполнен, элементы управления и программный модуль удалены^ Htcrninft Vituol D^vx; Пч<*л>ь.нй - |Мшч«ьЮ |Пр<и)1лммл||IWRlK!^ Htcrninft Vituol D^vx; Пч<*л>ь.нй - |Мшч«ьЮ |Пр<и)1лммл||IWRlK!I暦3通融 flp«« а* Я<?1«», *«W* Сил'Джта〔恥в 工口百区才X曝公。- *宵К又H :i О ■爲函"切I暦3通融 flp«« а* Я<?1«», *«W* Сил'Джта〔恥в 工口百区才X曝公。- *宵К又H :i О ■爲函"切
* 里《1л []{м"^> Вм 旧4».* ^овд# Utw<« Janut». Cafvc Q««j ?
* 里《1л []{м"^> Вм 旧4».* ^овд# Utw<« Janut». Cafvc Q««j ?
U .岷朗曲超广田
U .岷朗曲超广田
耳尸5
耳尸5
白 不宣
白 不宣
Sub BM30BjMe№! |
Sub BM30BjMe№! |
1 Wv^vx Арр 丄丄 mt гаи. v&r. vxp#Qj[
1 Wv^vx Арр 丄丄 mt гаи. v&r. vxp#Qj[
步皿
步皿
ie<r i^u. 1к;*т4Лме Влахгч j
ie<r i^u. 1к;*т4Лме Влахгч j
暴 им»н>Ш1ичтыА;Г 吞占 NkrtMOft Excfll Обмпа 治 ftWWqHto*
暴 им»н>Ш1ичтыА;Г 吞占 NkrtMOft Excfll Обмпа 治 ftWWqHto*
I I 4)rt«T2(ShMtt) i)ft<r3(»w<3) 日力м«ум Tthtugi i «Criugio
I I 4)rt«T2(ShMtt) i)ft<r3(»w<3) 日力м«ум Tthtugi i «Criugio
.A・跑项已■■
.A・跑项已■■
4
4
Рис. 16.23. Макрос выполнен, элементы управления и программный модуль удалены
Рис. 16.23. Макрос выполнен, элементы управления и программный модуль удалены
^ Htcrninft Vituol D^vx; Пч<*л>ь.нй - |Мшч«ьЮ |Пр<и)1лммл||IWRlK!
^ Htcrninft Vituol D^vx; Пч<*л>ь.нй - |Мшч«ьЮ |Пр<и)1лммл||IWRlK!
I暦3通融 flp«« а* Я<?1«», *«W* Сил'Джта〔恥в 工
口百区才X曝公。- *宵К又H :i О ■爲函"切
I暦3通融 flp«« а* Я<?1«», *«W* Сил'Джта〔恥в 工
口百区才X曝公。- *宵К又H :i О ■爲函"切
Коллекция диалогов
Рассмотрим еще один тип элементов управления приложения Excel ——элементы коллекции Dialogs. Коллекция Dialogs имеет небольшой список свойств, два из которых это количество элементов коллекции (свойство Count) и ссылка на элементы коллекции (свойство Item(i:Integer), где i — индекс диалога в коллекции). Чтобы ознакомиться со всем списком и значениями индексов и аргументов диалогов, достаточно открыть справочную систему MS Excel на нужной странице. Здесь мы рассмотрим только общие принципы вызова диалогов из приложений, разработанных в среде Delphi, и несколько примеров их использования.
Каждый элемент диалога имеет метод и свойства. Свойства элементов коллекции диалогов можно не рассматривать. Для каждого диалога мы распо-
лагаем одним методом — Show. Его можно вызывать с аргументами, которые определяются типом самого диалога. Метод Show возвращает значение True, если диалог завершен выбором (например, нажатием кнопки ОК), или False, если пользователь отменил выбор и диалог закрыт. Следующая процедура позволяет получить количество различных диалогов, используемых в Excel.
Определение количества диалогов в Excel
procedure TForml*Button7Click(Sender: TObject); var count_:integer;
begin
count_:=E. Dialogs. count;
messagebox (handle,pchar (inttostr (count_)),
* Количество элементов коллекции диалогов' t0); end;
На рис. 16.24 представлен результат выполнения данной процедуры.
Рис.16.24. Количество диалогов в Excel составляет несколько сотен
Рассмотрим вызов метода Show элемента коллекции диалогов. Этот метод можно вызывать как без аргументов, так и с аргументами. Если для конкретного диалога при вызове заданы аргументы, то обычно они служат для настройки некоторых его полей и свойств.
[ Примечание )
Список аргументов можно получить в спрааочной системе MS Excel.
При вызове метода обычно не используются реальные имена аргументов, указанные в справочной системе. Наименование аргумента представляет собой сочетание символьной строки arg и номера аргумента, например:
argl:=2;
В табл. 16.9 представлены списки аргументов для двух диалогов. Этот список является частью списка справочной системы.
Воспользуемся этой информацией, чтобы при вызове диалога открытия документа подставить в поле Имя файла нужное нам значение.
Таблица 16.9. Аргументы метода Show для диалогов
Константа для вызова диалога
Список аргументов
xlDialogOpen
file_text, update_linksf read_onlyf format, prot_pwd, write_res_pwd, ignore_rorec, file_originr custoin_de 1 imit, add_logical, editable, file_access, notify_logical, converter
xlDialogSaveAs
document_text# type_num, prot^pwd, backup, write_res_pwdr read_only_rec
Задание имени файла в диалоге открытия документа
procedure TForml.ButtonllClick(Sender: TObject); begin
E.Dialogs.Item[xlDialogOpen]*Show(argl:=фМоя рабочая книгаr); end;
Результат выполнения данного диалога представлен на рис. 16.25.
Рис. 16.25. Подставляем имя файла е диалог открытия документа
Далее вызовем диалог сохранения документа в файле» при этом зададим имя файла непосредственно во время вызова диалога.
Задание имени файла в диалоге сохранения рабочей книги
procedure TForml.Buttonl5Click £Sender: TObject); begin
E. Dialogs. Item [xlDialogSaveAs ].
Show(argl:='Подставляем собственное имя файла'); end/
Вид диалога показан на рнс. 16.26.
Рис. 16.26. Подставляем имя файла в диалог сохранения документа
Пример программирования панели
В качестве примера возьмем формирование налоговой декларации, рассмотренное ранее. В данном примере дополнительно отключаем все стандартные панели Excel, блокируем доступ пользователя к изменению содержания документа и создаем пользовательскую панель, на которую поместим кнопки печати и сохранения документа.
j""m^!**^:*"”",!"”",,,"”""y^**"""*^*^1*I^^У*^«"■f^,♦2,・**""""”",^#","・4"""£:”"・,“*"2,”““,*2m*4*:}*»^(^1尸****«r*:寸8«|41”,h""""”,"1"”,!"
:Процедура формирования документа "Налоговая декларация"
function FindAndReplace(find_,rep_: string):boolean; var range:variant;
begin
FindAndReplace ^False;
if find_o*1 then begin
try
range:=Forml.E.Range[ *Al:EL230f ] .Replace (What:-find__f Replacement:^rep__);
FindAndReplace: =True;
except
FindAndRepla ce:=False;
end;
end;
end;
procedure TForml.Buttonl4Click(Sender: TObject);
var a__: integer;
ConmandBar_: variant;
nsbootom_: variant;
begin
for a_:=l to E * CommandBars. Count do
E. CommandBars. Item [a_] . Enabled :=False;
// Создаем новый документ по шаблону
Е.WorkBooks.Add(ExtractFileDir(Application.ExeName)+
'\Декларация ВДС*х1з1);
messagebox(handle,1Шаблон создан! Переходим к заполнению.1, 1Внимание! \ 0);
// Подставляем текст
FindAndReplace (1 #ИНСПЕК1]ИЯ& *, 1 Инспекция №1,);
FindAndReplace (• #ОРРАНИЗАЦИЯ&',『ЗАО "Сокол"');
for а_:=1 to 12 do FindAndReplace ('M^inttostr (а_)+ 1 &f f INN.Text [a_]};
for a__:=l to 9 do FindAndReplace ( ^^inttostr (a_) + * & 1 ,KPP.Text [a_]);
for a_:=l to 15 do FindAndReplace(1C * +inttostr(a_) +1 &1,
(SUMMA.Text+f4 [a_]);
for a_:=l to 2 do FindAndReplace(* Д1+inttostr(a_) +1 & *,DATA.Text[a_]); for a_:=l to 2 do
FindAndReplace ( ^^inttostr (a」+,& \ DATA.Text [a_+3 j); for a :=1 to 4 do
FindAndReplace (1Г +inttostr (a_) + * & * r IDATA.Text [a_+6]);
E.ActiveSheet•Protect( DrawingObj ects;=True, Contents:=True,
Scenarios: =True, Passwords1 *);
CommandBar_: =E. CommandBars. Add (* Печать документа',msoBarTop, False,
True);
CowmandBar_. Enabled: =True;
CommandBa^.Visiblei^rue;
CommandBar_. Protection: =^ oBarNoMove;
for a_:=3 to 4 do begin
try
msbootom_: =CorrmandBar__. Controls »Add (Type: =чпзoControlButtonf ID:=inttostr(a ));
msbootom_ • Caption: = * 工A' +inttostr (a_J ;
except
end;
end;
Messagebox (handle# 'Возвращаем панели в исходное состояние!',
*Внимание!1,0);
for а_:=1 to Е. CommandBars. Count do
Е. CommandBars ・ Item[a__] . Enabled: ^True;
end;
Результат выполнения процедуры представлен на рис. 16.27.
X МюгаН Excel • Декпйрации НДС1X МюгаН Excel • Декпйрации НДС1aaaa*噂 ■n*内511*1001*噂 ■n*内511*1001ГИЗГИЗE^ejKTUJMrtt* аE^ejKTUJMrtt* аtOFPKj I 1 I 2 13|4В1«|7ИИ1о111213|tOFPKj I 1 I 2 13|4В1«|7ИИ1о111213|1 1 ■'t lit П r-.-f,1 1 ■'t lit П r-.-f,4 < Лн\^Ь?ЗР«д.1ЛгМ/ Готово4 < Лн\^Ь?ЗР«д.1ЛгМ/ ГотовоД4МЫЛ ■» лакцам BirzaiMi мД4МЫЛ ■» лакцам BirzaiMi мП»м*ч*1м № I ■ ПуявН, МКС ]*ОССВИ от 30 n加03腸肝,乂山644П»м*ч*1м № I ■ ПуявН, МКС ]*ОССВИ от 30 n加03腸肝,乂山644Налог овал деклар шот пи налогу на добиленну>а ctqhmqcti»Налог овал деклар шот пи налогу на добиленну>а ctqhmqcti»нНннм"h議н騎、;,"〃,",",川"“",",川曲и中1由泪1位兩1而77就市/"(М川《(1山川电也雨网[h也俯出1口]耐『нНннм"h議н騎、;,"〃,",",川"“",",川曲и中1由泪1位兩1而77就市/"(М川《(1山川电也雨网[h也俯出1口]耐『ннн・Г5ТЫо1。丨。1о1%Т61»1万I I Iннн・Г5ТЫо1。丨。1о1%Т61»1万I I I■гш■гшРис. 16.27. Пользовательская настройка приложения Excel для печати документаРис. 16.27. Пользовательская настройка приложения Excel для печати документа11иии1ь1*?т181»ээ21222э34Л^t11иии1ь1*?т181»ээ21222э34Л^tI~I 一 I *и>ш»н*Стран,СЩН1I~I 一 I *и>ш»н*Стран,СЩН1
X МюгаН Excel • Декпйрации НДС1
X МюгаН Excel • Декпйрации НДС1
aa
aa
*噂 ■n*内511*1001
*噂 ■n*内511*1001
ГИЗ
ГИЗ
E^ejKTUJMrtt* а
E^ejKTUJMrtt* а
tOFPKj I 1 I 2 13|4В1«|7ИИ1о111213|
tOFPKj I 1 I 2 13|4В1«|7ИИ1о111213|
1 1 ■'t lit П r-.-f,
1 1 ■'t lit П r-.-f,
4 < Лн\^Ь?ЗР«д.1ЛгМ/ Готово
4 < Лн\^Ь?ЗР«д.1ЛгМ/ Готово
Д4МЫЛ ■» лакцам BirzaiMi м
Д4МЫЛ ■» лакцам BirzaiMi м
П»м*ч*1м № I ■ ПуявН, МКС ]*ОССВИ от 30 n加03腸肝,乂山644
П»м*ч*1м № I ■ ПуявН, МКС ]*ОССВИ от 30 n加03腸肝,乂山644
Налог овал деклар шот пи налогу на добиленну>а ctqhmqcti»
Налог овал деклар шот пи налогу на добиленну>а ctqhmqcti»
нНннм"h議н騎、;,"〃,",",川"“",",川曲и中1由泪1位兩1而77就市/"(М川《(1山川电也雨网[h也俯出1口]耐『
нНннм"h議н騎、;,"〃,",",川"“",",川曲и中1由泪1位兩1而77就市/"(М川《(1山川电也雨网[h也俯出1口]耐『
ннн・Г5ТЫо1。丨。1о1%Т61»1万I I I
ннн・Г5ТЫо1。丨。1о1%Т61»1万I I I
■гш
■гш
Рис. 16.27. Пользовательская настройка приложения Excel для печати документа
Рис. 16.27. Пользовательская настройка приложения Excel для печати документа
11иии1ь1*?т181»ээ21222э34Л^t
11иии1ь1*?т181»ээ21222э34Л^t
I~I 一 I *и>ш»н*
Стран,СЩН1
I~I 一 I *и>ш»н*
Стран,СЩН1
В предыдущих главах мы рассмотрели, как объект ExceLApplication используется для создания документов и управления ими, далее рассмотрим создание и использование динамических библиотек для приложений, формирующих документы в приложениях Word и Excel, а также для их применения в проектах Visual Basic.
ЧАСТЬ IV
Разработка в Delphiи использованиединамических библиотекдля работы с MS Office
Глава 17. Создание пользовательской библиотеки DLL Глава 18. Использование DLL в макросах MS Office
ГЛАВА 17
Создание пользовательской библиотеки DLL
В этой главе рассмотрены следующие темы:
口 создание пользовательской библиотеки;
口 создание пользовательской динамической библиотеки;
О неявная загрузка модуля DLL;
口 явная загрузка модуля DLL.
Создание пользовательской библиотеки
В предыдущих главах мы рассмотрели свойства и методы объектов Application приложений Word и Excel. На основе этих методов были рассмотрены фрагменты приложений, позволяющих создавать и работать с документами Word и Excel, но в больших приложениях работать с обьектамн Application непосредственно в модулях форм не всегда удобно. Как правило, это связано с тем, что в приложении приходится вставлять и использовать код обработки ошибок или использовать несколько операторов обращения к объектам. Все это приводит к увеличению исходного текста модуля формы, что затрудняет написание сложных приложений. Решать эту проблему можно несколькими способами. Одним из таких способов является разработка и использование пользовательской библиотеки. Рассмотрим создание и использование такой библиотеки дл# работы приложений с документами Word.
Для создания модуля используем команду File > New главного меню Delphi, в результате выполнения которой откроется диалоговое окно выбора типа создаваемого объекта (рис. 17.1).
В этом окне выбираем тип создаваемого объекта Unit, в результате чего будет создан файл с расширением PAS, представля ющий собой пользователь-
с кий модуль. В зтом модуле пока нет ни одной функции и процедуры (рис. 17.2). Модуль состоит из заголовка и секций interlace и implementation.
Рис. 17.1. Диалоговое окно выбора типа создаваемого объекта
Рис. 17»2. Структура пользовательского модуля
Секция interface должна содержать описания заголовков процедур и функций модуля, а также переменные» которые будут доступны из других модулей. Секция implementation содержит переменные, которые не будут доступны для других модулей, и полные тексты процедур и функций.
Создадим модуль, который будет содержать необходимые функции для работы с документами Word. Заголовок этого модуля представляет собой комбинацию слов “unit MSWORD", где первое является зарезервированном словом, обозначающим заголовок, а второе соответствует имени блока, которое должно совпадать с именем файла. После зарезервированного слова interface перечисляются определения типов, констант н переменных, которые могут быть доступны для других модулей, там же перечисляются и заголовки функций. Следующий исходный текст является фрагментом модуля, в который входят заголовок и секция interface. Создадим в модуле несколько функций для работы с MS Word и опишем заголовки этих функций в секции interfoce создаваемого модуля.
Заголовок и секция interface создаваемого модуля
unit MSWORD;
interface
var Crea tedWord:boolean;
Function CreateWord:boolean;
Function VisibleWord{visible:boolean):boolean;
Function AddDac(file_:string):variant;
Function CloseDoc {document: va r iant) : boolean.;
Function CloseDocEx {document: variant; saved_: boolean) : boolean ;
Function CloseWord: boolean;
Function OpenDoc(file_:string):variant;
Function CopyTextDoaToClipboard(doc_:variant):boolean;
Function ImportTextFromDoc(doc_:variant):string;
Из имен функций понятно, что они предназначены для создания объекта Word.Application, визуализации окна приложения Word, создания, открытия и закрытия документа, а также для работы с текстовыми модулями.
Рассмотрим секцию implementation к функции, представленные в ней. В начале секции перечисляются библиотеки функций и процедур, используемых в создаваемом модуле, затем следует описание типов, констант и переменных, после которых идет описание процедур и функций модуля.
Секция implementation модуля
impl ement ation
uses Windows, Sysutils, COTiObj;
var W:variant;
Особо следует отметить ссылку на библиотеку ComObj и переменную Wrvariant. Мы используем функцию CreaieOleObject из этой библиотекиt создающую ссылку на объект Application и сохраняющую его в переменной W. Это реализуется в функции CreateWord, которая в случае удачного выполнения возвращает значение True.
Получение ссылки на объект Application
Function CreateWord: boolean;
begin
CreateWord: =T rue;
CreatedWord:=True;
try
W:=CreateOleObj ect(Word.Application*);
except
CreateWord:=False;
Crза tedWord:=FaIse;
end;
End;
После удачного выполнения функции переменная CreatedWord будет содержать значение True, а переменная W ——ссылку на объект Application, после чего можно переходить к выполнению других функций.
Рассмотрим следующие функции для работы с MS Word, напрнмер функцию для визуализации окна Word.
Визуализация окна приложения Word
Для создания нового документа или открытия существующего документа, сохраненного в файле, используем функции, возвращающие ссылку на созданный или открытый документ.
j Создание документа
Function AddDoc(file_:string):variant;
Var Docs_:variant;
begin
AddDoc:=null;
try
Docs_: =W. Documents;
AddDoc:=Docs_.Add(file_);
except
AddDoc:=null;
end;
End;
В представленной функции переменная Docs_:variant используется для доступа к коллекции документов. После того как в нее была записана ссылка на коллекцию Documents, мы имеем возможность обращаться к свойствам коллекции через эту переменную.
Для открытия документа, созданного ранее н сохраненного в файле, используем следующую функцию.
г*'::•/:,г"“•" ™^-у-"…"丁干'”飞
;Открытие существующего документа
Function CpenDoc(file_:string):variant;
Var Docs_:variant;
begin
OpenDoc:=True;
try
Docs_:=W.Documents;
OpenDoc: =Docs_. беп (file__);
except
OpenDoc : =null;
end;
End;
Эта функция возвращает ссылку на элемент коллекции документов, т. е* на документ. Используя эту ссылку, мы получаем доступ к самому документу. Следующая функция, используя ссылку на документ, копирует его содержимое в буфер обмена.
Копирование содержимого документа в буфер обмена
Function CopyTextDoсТоС1ipboard(doc_:variant):boolean;
begin
CopyTextDocToClipboard:=True;
try
doc_. Range.Select;
W * Selection.Copy;
except
CopyTextDocToClipboard:=False;
end;
End;
Для того чтобы выполнить обратное действие и вставить текст из буфера обмена в документ, нужна другая функция, использующая метод Paste, который вставляет информацию из буфера обмена в документ. Примеры исходного текста, реализующего обмен информации с буфером обмена, Ntox- но найти в приложениях на сопроводительном компакт-диске книги.
Обмен информации непосредственно между документом и приложением Delphi можно организовать, воспользовавшись другим способом, реализованным в следующей функции (эта функция возвращает строку текста, импортированную из документа Word).
Импорт текста из документа Word
Function IrnportTextFromDoc (doc_:variant) : string; begin
ImportTextFromDoc:-1';
try
Impo r tT ext FromDoc:=doc_.Range.Text;
except
In^ortTextFrc^nDoc^11;
end;
End;
После окончания работы с документом необходимо его закрыть, а также закрыть приложение Word. Используем для этого следующие функции. Функцию закрытия документа можно реализовать двумя способами: закрыть документ, если он был до этого сохранен (первый вариант), или сохранить документ в момент его закрытия; закрыть документ без сохранения (второй вариант).
i Закрытие документа
Function CloseDoc(document:variant):boolean;
begin
CloseDoc:=True;
try
document.Close;
except
CloseDoc:=False;
end;
End;
Function CloseDocEx (document:variant; saved__:boolean) :boolean;
begin
CloseDocEx:=True;
try
document * Close (saved_);
except
CloseDocEx :== Fa Ise;
end;
End;
После закрытия документов закрываем приложение Word и освобождаем память компьютера. Для освобождения памяти компьютера используем оператор:
W:«UnAssigned;
:Закрытие приложения Word
Function CloseWord: boolean;
begin
CloseWord:=True;
try
W.Quit;
W: =^UnAs signed;
except
CloseWord: =False;
end;
End;
Используя перечисленные функции, которые собраны в модуле, сформируем простой документ на основе шаблона —— текст на почтовом конверте. Следующая процедура формирует этот документ.
Создание документа на основе шаблона
procedure TFonnl.ButtonlClick(Sender: TObject);
begin
// Создаем новый документ по шаблону
document: =AddDoc (Ext ract F i le Di r (^plication. ExeName) +
1\Шаблон конверта.dot,);
messagebox(handle,*Шаблон почтового конверта создан!1,1 Внимание!',0);
// Подставляем адрес,
FindAllAndPasteTextDoc(document, г ###индекс& *, *3500 4 9*);
FindAl lAndPa steTextDoc (document,1 ###адрес&1,
'Краснодарr ул. Севастопольская, д. 3, кв, 123*);
FindAlLAndPasteTextDoc(document,'# # #получатель &1,
1Иванов Иван Иванович *);
// Обратный адрес
ГindAllAndPasteTextDoc(document,'###обратный индекс&','198005 *);
FindAllAndPasteTextDoc(docxment,1###обратный адрес& I
Санкт-Петербург, Измайловский пр., д* 29, кв* 111»
Fi ndAl 1 And Pas t еТе х t Doc (document, ' # # # отпра витель & *,
'Петрова Светлана Ивановна'); end;
Мы создали, а затем н использовали в своем приложении библиотеку процедур и функций, позволяющую работать с документами Word. Аналогичным образом создается библиотека для работы с рабочими книгами Excel. Исходные тексты этих библиотек представлены в приложении на сопроводительном компакт-диске книги. Их можно легко модифицировать и использовать под свои задачи. Далее рассмотрим создание динамической библиотеки DLL на базе созданного модуля.
Создание пользовательской динамической библиотеки
Для создания динамической библиотеки DLL используем команду File > New главного меню Delphi, в результате выполнения которой откроется диалоговое окно выбора типа создаваемого объекта (рис. 17.3).
В этом окне на вкладке New выбираем вариант DLL, после чего будет создан новый проект. Созданный проект состоит из одного файла, в котором есть заголовок, секция подключаектых и используемых модулей, а также секция, содержащая операторы, выполняемые во время загрузки библиотеки (рис. 17.4).
Рис. 173 Выбираем тип создаваемого объекта
Рис. 17.4. Содержимое файла проекта динамической библиотеки
Очевидно, что созданный проект пока не содержит ни одной функции или процедуры. Преобразуем исходный текст и заголовок этого проекта и добавим в него наши функции для работы с MS Word, созданные ранее*
:Содержание файла проекта динамической библиотеки
library dserver;
|$D © Корняков B.H.} uses MSWORD; exports
CreateWord, visibleWord, AddDoc, CloseDoc, CloseDocEx, CloseWord# OpenDoc, CopyTextDocToClipboard, FindA1iAndPasteTextDoc, InportTextFromDoc; begin end.
Как видно из исходного текста, в секции используемых модуле?! uses указана ссылка на созданную ранее библиотеку MSWORD. В секции exports перечисляются процедуры и функции из этой библиотеки, которые будут доступны для приложений, использующих динамическую библиотеку.
Откомпилируем этот проект, в результате чего получим файл DSERVER.DLL. В данной библиотеке мы используем фрагмент библиотеки» представленной в приложении на сопроводительном компакт-диске книги.
После того как динамическая библиотека создана, переходим к ее использованию. Для использования функций и процедур динамического модуля его сначала нужно загрузить. Есть два способа загрузки модуля DLL — неявный и явный.
Неявная загрузка модуля DLL
Для того чтобы использовать неявную загрузку модуля, достаточно описать процедуры и функции этого модуля, которые вы будете задействовать в своем приложении (лучше сделать это в отдельном модуле unit). Такое описание состоит из имени функции (процедуры), под которым она будет использована в приложении, зарезервированного слова external, строки с именем файла библиотеки DLL, зарезервированного слова пате и строки, содержащей имя функции (процедуры) в динамическом модуле. Следующий программный код содержит такое описание.
Описание внешних процедур и функций модуля DLL в приложении
function CreateWord_DLL:boolean;
external 'dserver.dll' name rCreateWord'; function VisibleWord_DLL(kod_:boolean)[boolean;
external * ciserver *dll' name ,VisibleWordf;
function AddDoc__DLL (filenaine_:string} :variant;
external 'dserver.dll' name 'AddDoc';
function FindAllAndPasteTextDoc_DLL(document:variant;findtext__, pastetext__: string) :boolean;
external *dserver.dll1 name 1 FindAllAndPasteTextDoc1; function OpenDocDLL(file_:string):variant;
external 'dserver.dll' name 'OpenDoc *;
function CopyTex t DocT oClipboard_DLL(document:variant)iboolean;
external *dse2rver.dll* name * CopyTextDocToClipboard1;
function In^>ortTextFromDoc_DLL (document:variant):string;
external ^server.dllr name ilmportTextFcomDoc';
function CloseDqcEx_DLL (document:variant;saved_:boolean) :boolean; external 1dserver.dllT name 'CloseDocEx*;
function CloseWord_DLL:boolean; external 1dserver*dll* name ^loseWord*;
Если модуль DLL откомпилирован, разметен на диске компьютера м доступен приложению, а описание процедур и функций этого модуля в использующем его приложении не содержит ошибок, то приложение запустится без проблем. Тогда во время запуска приложения также будет загружен динамический модуль. Если файл DLL не доступен приложению, которое его использует и загружает неявно, то загрузка приложения вызовет ошибку. Если в модуле отсутствует функция, описываемая в приложении, то это также вызовет ошибку (рис. 17.5 и 17.6).
Рис. 17.5. Ошибка загрузки модуля DLL
Рис. 17.6. Ошибка при отсутствии в модуле DLL функции, описанной в приложении
Достоинство метода неявной загрузки модуля DLL заключается в простоте его использования. Недостаток метода проявляется во время загрузки приложения на выполнение, если описания функций (процедур) в приложении и модуле не совпадают. Для решения этой проблемы приходится или
13 ?ак 723
корректировать исходный текст приложения или исправлять ошибки в модуле DLL
Используем созданную библиотеку в приложении Delphi.
I^^,^У"М''','^т"'УУ;*^'^',,>,,^Ы-'"^^^^^^ .“,"""
;Создание документа на основе шаблона (неявная загрузка модуля)
procedure TFoml. Button8click {Sender: TObj ect);
begin
// Создаем новый документ по шаблону
document: =MdDoc_DLL (Extract File Di r (/^plication. ExeName) +
'\Шаблон конверта * dot,);
messagebox(handle,'Шаблон почтового конверта создан!r f1Внимание!*,0);
// Подставляем адрес
FindAllAndPasteTextDoc_DLL(document,'###индекс& I '35004 9,);
FindAl1AndPasteTextDoc_DLL(document, *###адрес&1,
Краснодар, ул. Севастопольская, д. 3, кв. 123');
FindAl LAndPas teText Doc^DLL (document, 1 ### получатель &1 z
Иванов Иван Иванович1);
〃 Обратный адрес
FindAllAndPasteTextDoc__DLL(document,1###обратный индекса1, 1198005');
FindAllAndPasteTextDoc_DLL (document,,###обратный адрес&1 r
* Санкт-Петербург, Измайловский пр., д. 29, кв. 1111);
FindAl lAndPasteTextDoc_DLL(document,*# # # отправитель &', 'Петрова Светлана Ивановна'); end;
В большинстве случаев более удобно использовать явную, или динамическую загрузку модуля DLL. Это связано с тем, что даже если будут изменены некоторые функции модуля, то на загрузке приложения это никак не отразится. Не будут выполняться только те функции и процедуры, которые были ошибочно изменены.
Явная загрузка модуля DLL
В отличие от неявной загрузки модуля DLL, когда имена функций импортируемых функций н процедур, а также библиотека должны быть определены на этапе формирования исходного текста приложения и его компиляции, использование явной загрузки позволяет задавать имя динамической библиотеки и имя функции непосредственно перед ее выполнением. Для явной загрузки модулей DLL необходимо загрузить модуль DLL в адресное пространство процесса, получить точку входа для нужной функции, выполнить внешнюю функцию и освободить память процесса от модуля. Для это-
го используются следующие процедуры и функции API Win32: LoadLibrary и LoadLibraryEx, GetProcAddress и FreeLibrary.
Для сравнения явной загрузки модуля с неявной загрузкой рассмотрим уже знакомый пример заполнения почтового конверта. Для использования импортируемых функций зададим их типы и на их основании определим переменные, которые будут использованы как точки входа в процессе выполнения приложения.
:Задание типов функций, импортируемых из модуля
type
TCreateWord=function: boolean;
TVisibleWord=function (kod_:boolean) :boolean;
TAddDoc=function (filenanie_:string) :variant;
T FindAl 1 And Past eTex t Doc = function (document: variant; findtext^, pastetext_:string):boolean;
TOpenDoc = function(file_:string):variant;
TCopyTextDocToC 1 ipboard ^ function (document:variant) :boolean;
TПфогtTextFromDoc = function (document: variant) : string;
TCloseDocEx = function(documentivariant;saved_:boolean):boolean;
TCIoseWord = funct ion:boolean;
Задав типы импортируемых из модуля DLL функций, переходим к определению переменных, которые будут служить точками входа. Необходимо также определить переменную, которую будем использовать для обращения к модулю.
:Задание переменных для точек входа в импортируемые функции
var hdll: thandle;
CreateWord_DLL2: TCreateWord;
VisibleWord_DLL2 :TVisibleWord;
AddDoc_DLL2:TAddDoc;
FindAllAndPasteText Doc_DLL2: TFindAllAndPasteTextDoc;
OpenDoc_DLL2:TOpenDoc;
CopyTextDocToClipboa rd_DLL2:TCopyTextDocToClipboard;
Impo rt Tex t Fr omDoc_DLL2: T Insert Tex t Fr omDoc;
CloseDocEx_DLL2: TCloseDocEx;
Clos eWor d_DLL2: TCI os eWord;
Загружаем модуль с помощью функции LoadLibrary, которая в случае успеха возврашает указатель на загруженный модуль.
;Загрузка модуля
procedure TFoml .Buttonl9Click(Sender: TObject); begin
hdll: =LoadLibrary (* Dserver .dll');
end;
Переходим непосредственно к выполнению функций модуля, которые создадут и заполнят конверт на основе заготовленного шаблона.
Сначала определим точки входа для используемых процедур с помощью функции GetProcAddress, аргументами которой являются указатель на загруженный модуль и строка с именем функции, импортируемой из модуля. После инициализации функций выполняем их (исходный текст в этой части программы не отличается от исходного текста при использовании неявной загрузки ^foдyля).
Создание документа на основе шаблона (явная загрузка модуля)
procedure TForml.Buttonl4Click(Sender: TObject);
begin
// Определяем точки входа функции
AddDoc__DLL2: =GetProcAddress (hdll, 'MdDoc1);
FindAllAndPasteTextDoc_DLL2 :=
Ge t ProcAddre s s (hdll, *FindAllAndPast eText Doc1);
// Создаем новый документ по шаблону
document: =AddDoc_DLL2 (ExtractFileDir (^plication. ExeName) +
* ХШаблон конверта.dot *);
messagebox(handle,*Шаблон почтового конверта создан!1,1 Внимание!* f 0);
// Подставляем адрес
FindAl1AndPasteTextDoc_DLL2(document,1###индекс& I '35004 9 *);
FindAl1AndPasteTextDoc_DLL2(document,1###адрес& I
11фаснодар, ул. Севастопольская, д» 3, кв. 1231);
FindAl!AndPasteTextDoc_DLL2 (document, ' ###получатель&',
1Иванов Иван Иванович1);
// Обратный адрес
FindAllAndPasteTextDoc_DLL2(document,'###обратный индекса','198005*);
FindAllAndPasteTextDoc_DLL2(document,*###обратный адрес& *,
Санкт-Петербург, Измайлов с кий пр., д. 29, кв. 111 *);
FindAllAndPastеТext Doc_DLL2(document,1###отправитель&1r
'Петрова Светлана Ивановна');
end;
Результат выполнения процедуры представлен на рис. 17.7. Этот результат ничем не отличался бы от результата использования неявной загрузки мо-
дуля или использования обычной библиотеки, подключаемой к создаваемому проекту.
Рис. 17.7. Сформированный документРис. 17.7. Сформированный документ
Рис. 17.7. Сформированный документ
Рис. 17.7. Сформированный документ
После выполнения функций можно освободить память процесса и выгру
зить динамический модуль, если в нем больше нет необходимости.
j Освобождение памяти
procedure TForml.Button20Click(Sender: TObject); begin
FreeLibrary(hdl1);
end;
В этой главе мы рассмотрели создание и использование динамически загружаемых модулей для работы с документами MS Word в приложениях Delphi. Справедливости ради стоит отметить, что и сами приложения MS Office могут работать с внешними динамическими модулями. Эта возможность очень заманчива и может дать большой положительный эффект при создании и использовании приложений на любом языке, позволяющем создавать динамические библиотеки. Следующая глава будет посвящена этому.
ГЛАВА 1 8
Использование DLL в макросах MS Office
Эта книга посвящена использованию объектов MS Office для создания документов Word и Excel и последующего изменения этих документов с помощью внешних приложений, разработанных в среде Delphi. Применение объекта Application н его свойств (в том числе объектов и коллекций объектов) позволяет управлять не только документами, но и свойствами самих приложений Word и Excel. Для программиста, решившего создавать документы (например, отчеты) на основе MS Office, это открывает широкие возможности.
Приложения MS Office могут использовать Visual Basic ——встроенный язык, обладающий достаточной функциональностью для создания документов любой сложности. Можно спросить: зачем тогда использовать Delphi, может быть лучше сразу писать приложение на Visual Basic? У тех, кто профессионально работает в среде Delphi, такой вопрос не возникнет* Среда Delphi является инструментом создания приложений, которым доступны все возможности операционных систем Windows и поддерживаемых ими баз данных, Visual Basic для MS Ofllce как инструмент больше ориентирован на создание и управление документами. Из этого следует, что наиболее эффективным решением будет не противопоставление, а объединение возможностей этих инструментов.
Рассмотрим еще один способ совместного использования Visual Basic и приложений Delphi. Только теперь управляющей программой будет приложение документа MS Office, а управляемой —— приложение, разработанное в среде Delphi. Речь пойдет о частном случае применения созданных динамических библиотек (файлов DLL) в макросах рабочей книги Excel, позволяющих использовать дополнительные функции для формирования документа.
Например, вы разработали и тщательно отладили достаточно сложное приложение» которое работает с распределенными базами данных и имеет набор диалогов ввода и вывода информации. Поставлена задача: для некото-
рых пользователей, работающих и создающих отчеты исключительно в Excel, предоставить интерфейс, используя стандартные для вашей программы диалоговые окна, и организовать загрузку данных непосредственно в документ. Один из способов решения этой задачи ——разработка динамической библиотеки, функции которой вызывают необходимые диалоги и обеспечивают обмен информацией между документом и созданным приложением. Средства Visual Basic позволяют использовать внешние функции, но перед использованием их нужно описать.
Описание внешних функций и процедур в модуле документа
Для начала рассмотрим, как можно получить доступ к функциям н процедурам из стандартной динамической библиотеки и какие ограничения накладываются на них и на их аргументы и возвращаемые значения. В таких функциях можно использовать не все типы переменных — только некоторые типы данных в Excel и Delphi имеют общую структуру. Подходят следующие типы данных: String — строка длиной до нескольких гигабайт, ограниченная символом CHR(O); Longint (Integer) — целое число от —2 147 48 3 648 до 2 147 483 647; Byte — целое число от 0 до 255; Boolean — логическая переменная (True / False); Variant — тип данных, к которому относятся все переменные, не описанные явно. Чтобы подробней ознакомиться с данным вопросом и получить список всех возможных типов данных, используйте справку по Excel, раздел *'Справочник по Visual Basic”.
Определив, какими типами данных будем оперировать, попробуем описать и вызвать какую-либо функцию или процедуру из стандартной библиотеки Windows. В качестве примера можем поработать с функцией Messagebox из стандартной динамической библиотеки. Функция Messagebox использует в качестве входных и возвращаемых значений типы PChar и integer. В макросе Excel тип PChar можно заменить типом String. Прежде чем обращаться к внешней процедуре, опишем ее.
Описание внешних процедур и функций, используемых в макросах, имеет следующий синтаксис.
Описание процедуры
Declare Sub "имя процедуры" Lib “имя библиотекиtr [Alias "псевдоним,'] [([псписок аргументов "])]
;Описание функции
Declare Function "имя функции" Lib "имя библиотеки" [Alias "псевдоним"] [([tfсписок аргументов н]) ] [As "т*口"]
Ключевые слова: Sub — указывает, что процедура не возвращает значение; Function — указывает, что процедура возвращает значение, которое может быть использовано в выражении; Lib ——указывает, что описываемая процедура содержится в динамической библиотеке, "имя библиотеки1* — имя динамической библиотеки; Alias ——указывает, что вызываемая процедура имеет другое имя в библиотеке, ''псевдоним'1 — имя процедуры в библиотеке; "список аргументов0 — список переменных, представляющий аргументы, которые передаются в процедуру при ее вызове; “тип”一 тип данных значения, возвращаемого процедурой типа Function.
В нашем примере из рабочей кннгн Excel вызовем функцию Messagebox. Ссылку на эту функцию можно найти в файле WINDOWS.PAS, входящем в состав Delphi. Используем полученную информацию. Из описания, представленного в файле WIN DOWS. PAS, видно, что эта функция входит в состав библиотеки USER32.DLL
]Описание ссылки на функцию Messagebox
Interface
function MessageBoxA(hWnd:HWND;IpText, IpCaption:PAnsiChar; uType:UINT):Integer; stdcall;
implementation
function MessageBoxA; external user32 name ^essageBoxA*;
В макросе в объявлении функции мы напишем строку, определяемую следующим синтаксисом.
;Описание функции Messagebox в макросе Excel
Declare Function MessageBoxA Lib "user32.dll" (By Vai hwnd As Integer, ByVai IpText As String, ByVai IpCaption As String, ByVai uType As Integer) As Integer
Представленное описание указывает на то, что мы используем функцию, возвращающую целое значение. Функция импортируется из библиотеки USER32.DLL. Нмена функции в библиотеке и в макросе совпадают, но для макроса можно было бы задать и другое имя. Аргументы импортируемой функции не возвращают значения, а только передают. Для аргументов, возвращающих значения, необходимо опустить зарезервированное слово ByVaL В теле макроса напишем следующую процедуру для вызова функции Message Box динамической библиотеки user32.dll.
;Вызов функции Messagebox из макроса
Public Sub Message(J
+ TypeName (Selection), из библиотеки user32.dllH, 0) =” + Range(°Al").Text, из библиотеки user32.dll", 0)+ TypeName (Selection), из библиотеки user32.dllH, 0) =” + Range(°Al").Text, из библиотеки user32.dll", 0)Call MessageBoxA<0, "Тип объекта 二" "Вызов функции MessageBox
+ TypeName (Selection), из библиотеки user32.dllH, 0) =” + Range(°Al").Text, из библиотеки user32.dll", 0)
+ TypeName (Selection), из библиотеки user32.dllH, 0) =” + Range(°Al").Text, из библиотеки user32.dll", 0)
Call MessageBoxA(0r "Значение ячейки "Вызов функции MessageBox
End Sub
Данная процедура дважды вызывает функцию Message Box. Первый вызов процедуры отображает значение типа выделенного объекта. Второй вызов выводит в диалоговом окне значение, записанное в ячейке А1. Выполним этот макрос и получим результат в виде диалогового окна (рис. 18.1).
Вызов функции MestageBox нз биб^1иотеки uter32.dfl
Тип объекта * Range
Рис. 18」. Открытие диалогового окна из макроса Excel
Соглашение о вызовах
Разрабатывая динамическую библиотеку процедур и функций, необходимо помнить, что к созданной библиотеке могут обращаться приложения, написанные на разных языках н скомпилированные в разных средах программирования. Поэтому при обращении к функциям и процедурам используются различные способы передачи их параметров. Передача параметров при вызове динамических функций производится через стек или регистры процессора. Помещаемые в стек или регистр параметры могут следовать в различном порядке. После передачи параметров стек должен очищаться вызывающим процессом или вызываемой процедурой. Поэтому соглашение о вызовах это способ передачи параметров в вызываемую функцию или процедуру.
В табл. 18.1 приведены директивы соглашения о вызовах.
Таблица 7 g. 7. Директивы соглашения о вызовах
Директива
Порядок следования параметров
Очищает стек, регистры
Использование регистров для передачи параметров
Register
Слева направо
Вызываемая процедура
Да
Таблица 18.1 (окончание)
Директива
Порядок следования параметров
Очищает стек, регистры
Использование регистров для передачи параметров
Pascal
Слева направо
Вызываемая процедура
Нет
Cdecl
Справа налево
Вызывающая процедура
Нет
Stdcall
Справа налево
Вызываемая процедура
Нет
Safecall
Справа налево
Вызываемая процедура
Нет
Директива, определяющая тот или иной способ передачи параметров, приводится в заголовке процедуры или функции и указывает компилятору соглашение о вызовах, применяемое для данной функции. В языке Pascal по умолчанию всегда используется директива Register. Она определяет, что параметры будут передаваться через регистры процессора, в порядке слева направо, и регистры будет очищать вызываемая процедура. Директива Cdecl указывает компилятору, что вызов функции должен быть осуществлен в стиле языка С. Параметры загружаются в стек справа налево, затем стек очищается вызывающим процессом. Директива Pascal извещает компилятор, что необходимо сгенерировать код в стиле языка Pascal. Параметры процедуры помещаются в стек слева направо, стек очищает вызываемая процедура. Директивы Stdcall н Safecail, как н Cdecl, указывают компилятору помещать в стек параметры слева направо, но стек очищает вызываемая процедура, как в случае применения директивы Pascal. Если мы будем использовать создаваемую динамическую библиотеку для вызова процедур и функций из макросов Excel, то лучше в их описании использовать директиву Stdcall:
Function GetDateDialog:variant; Stdcall;
Рассмотрим программный код динамической библиотеки, которую мы будем использовать в макросах документов MS Excel.
Создание в среде Delphi динамической библиотеки для ее использования в макросах Excel
В качестве примера создадим динамическую библиотеку, состоящую из двух функций, одна из которых содержит диалоговое окно выбора даты (она бу-
дет возвращать дату). Другая функция будет просто преобразовывать значение аргумента, заданного в формате денежной единицы, и возвращать его в виде текстовой строки. Весь проект будет состоять из файла проекта Delphi LIBFOROF.DPR, модуля MYLIB.PAS, формы диалогового окна задания даты и программного модуля к этой форме (полный текст приложения представлен на сопроводительном компакт-диске книги).
library LiblforOf;
uses
SysUtils,
Classes,
MyLib;
{$R *.RES} exports GetDateDialog, Ge t Sumi nWo rds;
begin end.
Текст файла проекта содержит имя библиотеки, список используемых модулей и список экспортируемых функций. Модуль MYL1B.PAS содержит исходные тексты экспортируемых функций. Обратим внимание на то, что при описании функций используется соглашение о вызове Stdcall, позволяющее компилировать библиотеку так, чтобы она была совместима для использования в программных модулях документов Excel.
I Исходный текст модуля MVLIB.PAS
unit MyLib;
interface
Function GetDateDialog:variant; Stdcall;
Function GetSuminWords(cur_:currency; var stroka_:string):boolean;
Stdcall;
implementation
uses windows,Sysutils,Forms,Controls, DateDlg;
var j_:longint;
Function GetDateDialog:variant;
begin
Application. CreateForm (TDateDlg_f DateDlg_);
if DateDlg_* ShowModal^mrOk
then GetDateDialog:=Dat@Dlg_* MonthCalendar1.Date
else GetDateDialog:=null;
DateDlg_.Free;
End;
Function currtostrSS(str_:shortstring;zpz_:word):shortstring; begin
if pos(Decimalseparator r str_)>0
then str_:«copy(str_+ * 00000 *,l,pos(DecimalSeparator,str_)+zpz_) else str_:=str_+DeciinalSeparator+copy(1000001,lf zpz;
currtostrSS: =str_;
End;
Function Del_sstr(ss_:shortstring;var str_:shortstring):boolean; var a_: word;
begin
Del_sstr: =false; a_:=pos (ss_f str_);
if pos (ss__, str_) =0 then exit;
delete (str_, a_, length (ss_)); Del^sstr :=True;
End;
Function Get_strok__num(var ssl,ss2:shortstring;
razd_: char; nn_raz_: byte) :byte;
const
src_l:array [0.. 20] of string [15] = (1 *, ,одан1, ,два|,
'три1, 'четь^зеI 'пять', 'шесть 1, 'семь',
* восемь I Девять ', ' десять', ' одиннадцать ',
'двенадцать', ' тринадцать', ' четырнадцать',
1 пятнадцать *, 1 шестнадцать 1, 'семнадцать I
Iвосемнадцать', 'девятнадцать ‘3двадцать'};
src_l_:array[0.,20]of string[15]=(f1,1одна1r'две',
'три1f'четыре1,'пять','шесть','семь'.
'восемь1,'девять'上 т десять','одиннадцать',
■двенадцать','тринадцать *,'четырнадцать',
'пятнадцать1,Шестнадцать','семнадцать'『
'восемнадцать', Девятнадцать 1,1двадцать');
src_2:array(0* * 9]of string[15] = (11,Десять 1,1двадцать1,
” тридцать I 'сорок I 'пятьдесят*,'шестьдесятL * семьдесят * # 'восемьдесят',*девяносто');
src_3:array[0..9]of string[15]=(1*,^то1,*двести*,
'триста','четыреста1,*пятьсот','шестьсот',
'семьсот','восемьсот I 'девятьсот');
src_4:array[0..4]of string[15]& £,1,* тысяча1,1миллион1,
'миллиард ― триллион *);
src_5:array [0<. 4]of string [15] = (,1Jтысячи —миллиона1,
1 миллиарда',,триллиона *};
src_6:array[0. *4]of string[15] = (1 \ 'тысяч*, 'миллионов1, 1 миллиардов1, * триллионов');
mb_:array[0. .2] of string [10] = (1 рубль *, 1 рубля *, 'рублей1);
kop_:array[0 *.2]of string[10) = (1 копейка1,* копейки I,копеек1);
var ccl__/ сс2_: string(20];
а_, b_:byte;
razrad:array[1..5,1.-3]of byte;
Function preob(ccc:shortstring;kod_: byte):shortstring;
type mema=array[0* Л00]о£ byte;
var eee_:shortstring?
a_rb_:byte;
mem_: Amema;
begin
for a_:=l to length(ccc) do
if ((ord (ccc [a__l) <48) or (ord (ccc [a_]) >57))
then begin preob: = * 01; exit; end;
fillchar(razrad,sizeof(razrad),48};
mem_:=@razrad;
for a_:=l to length(ccc) do
mera_[a^l+sizeof (razrad) ^length (ccc) ] :=ord {ccc [a_]);
eee_:i,;
for b_:=l to 5 do begin
for a_:=l to 3 do begin
if (a__=l) and (razrad [b_, a_] >49) then eee_:=eee_+* * + src_3 [razrad[b—/a_]-48];
if razrad[b_, 2]>49 then begin
if (a_=2) and (razrad [b_, a_ 1 >4 8) then eee_:=eee__+r f + src_2 [ razrad [b_, a_] -48];
if b_<>4 then
if (a_/=3) and (razrad[b_, a_] >48) and{kod_=l) then eee__:=eee_+ 1 *+src_l [razrad[b_,a_]-48];
if (a_=3) and (razrad [b__, a_] >48) and (kod_=2) then eee_: =eee_+' ' + src_l_[razrad[b_,a]-48];
if b_=4 then
if (a__=3) and(razrad [b_,a_l>48) then eee_:=eee_+1 * +
src_l__[ razrad [b_, a_J ~48];
end;
if razrad [b_r 2]=48 then begin
if (a_=2) and (razrad [b_, a_] >48) then eee_:^eee_+, 7 src_2 [ razrad [b_, a J -48];
if b_<>4 then
if (a_=3)and(razrad[b__,a__]>48) and(kod_=l) then eee_: =eee_+1 1 + src_l[razrad[b_ra_]-48];
if (a_=3)and(razrad[b_,a_]>48)and(kod_=2) then eee_: =eee_+ * ,+ sr jl_ [ razrad [b_, a_] -48];
if b_=4 then
if (a^=3)and(razrad[b_,a_]>48) then eee_:=eee_+, ,+ src_l_[razrad[b_,a_]-48];
end;
if (razrad[b_,2]=49)and(a_=2) then begin
eee_: =eee_+1 1+src_l[(razrad[b_, 2]-48)*10+(razrad[b_,3]-48)];
end;
end;
if razrad[b_,2]=48 then begin
if (razrad[b_,3]=49)then eee_:=eee_+1 1+src_4 [5-b_);
if ((razrad[b_r3]>49)and(razrad[b_, 3]<53))
then eee_: =eee_+,* +src_5 [5-b_];
if (razrad[b_, 3]>52)then eee_:=eee_+r T+src_6 [5-b_];
end;
if razrad[b_# 2]=4 9 then begin
if (razrad[b_, 3] >=48) then eee_:=eee_+* *+src_6[5-b__];
end;
if (razrad[b_,2]=48)and(razrad[b_, 3] =^48) then begin
if razrad[b_, 1]>48 then ◎启e_:=eee_+‘ *+src_6[5-b_];
end;
if razrad[b_. 2] >4 9 then begin
if (razrad[b_, 3]=49) then eee_:=eee_+* 1 +src_4 [5-b__];
if ((razrad[b_,3]>49)and(razrad[b_,3]<53))
then eee_: =eee_+,* +s rc__5 [ 5-b__];
if (razrad[b_,3]>52)then eee_: =eee_+1 '+src_6[5-b」;
if (razrad[b__, 3]=48) then eee_:=eee_+ * ' +src_6 [5-b_];
end;
end;
preob: i=eee_;
end;
begin
Get_strok_num: =0;
if (pos (razd_, ssl) >0) and (length (ssl) -pos (razd_,ssl) >nn_raz_) then ssl :=copy (ssl, l,pos (razd_r ssl) +nn_raz_);
if pos (razd_, ssl) >0
then ssl :=ssl+copy (10000001,1, nn_raz_- (length (ssl) -pos (razd_, ssl)));
if pos(razd_,ss1)>0 then begin
ccl_:=copy(ssl,l,pos(razd_,ssl)-1);
cc2_:=copy(ssl,pos(razd_,ssl)+1,length(ssl)-pos(razd_,ssl));
end
else begin
gc1_:=ss1; cc2_:=.‘;
end;
if length (ccl__) >15 then begin get_strok_num: =2; exit; end;
if Length (cc2_> >15 then begin get_strok_num: =3; exit; end;
ssl:=preob(ccl_, 1); ss2:=preob(cc2_, 2);
End;
Function get_rub_kop (var rub, kop: shortstring) :byte;
label 0,1,2;
const
rub :array(0..2)of string[10]=(1ру^пь1,1рубля1,*рублей*};
kop_:array[0..2]of string[10] = <'копейка1,1 копейки *,1копеек *);
begin
get_rub_kop: =0;
try
if rub=‘‘ then begin rub:=11; goto 1; end;
if ((strtoint(rub) mod 100 >4)and(strtoint(rub)mod 100 <=20))
then begin rub:=rub_[21; goto 1; end;
if {strtoint(rub) mod 10>l)and(strtoint(rub) mod 10<5)
then begin rub:=rub_[l]; goto 1; end;
if (strtoint (rub) mod 10=1) then begin rub:=rub_[0]; goto 1; end;
if ((strtoint (rxab) mod 10>4) and (strtoint (rub) mod
0^9)) or (strtoint (rub) mod 10=0) then begin rub:=mb」2]; goto 1; end;
1:
except
get_rub_kop: =1;
end;
try
if кор=*1 then begin kop:=11; goto 2; end;
if ((strtoint(kop) >4)and(strtoint(kop) v=20))
then begin kop:«kop_[2]; goto 2; end;
if (strtoint(kop) mod 10>l)and(strtoint(kop) mod 10<5)
then begin kop:=kop_[l]; goto 2; end;
if (strtoint (kop) mod 10=1) then begin kop:=kop_[0]; goto 2; end;
if ((strtoint(kop) mod 10>4}and(strtoint(kop) mod
10<=9))or(strtoint(kop) mod 10=0) then begin kop:=kop_[2]; goto 2; end;
2:
except
get_rub_kop: =2;
end;
End;
Function GetSuralnWords(cur_:currency; var stroka_:string):boolean; label 1;
var ss_r,ss_k,rub_,ckop_,kop_:shortstring;
str_.eee_, vux_:string;
a_,b_:word;
begin
1:
str_:=cnrrtostr(cur_);
if str_<>一 then
begin ss_r:^currtostrSS(str_, 2); while Del^sstr(* ',ss_r) do;
rub_:=5§_r; kop_:='';
if pos (DecimalSeparator, ss_r) >0 then
begin rub_:«copy (ss_r, 1/pos (De c imal Sepa rat or, ss_r) -1);
if length(S3_r)>pos(DecimalSeparator# ss_r)
then kop_:=copy(ss_r,pos(DecimalSeparator,ss_r)+1, length(ss_r)-pos(DecimalSeparator,ss_r))
else kop_: = ''; ss_r[pos(DecimalSeparator,ss_r)]: = *, *; end;
ckop_:=kop_; get_strokjium(s s_r r ss_k, ', ',2}; get_rub kop(rub_,kop_);
if ckop_<>' * then vwc_:=ss_r+l •+rub_ + , '+ckcp_+‘ 1 +kop_
else vux_:=ss__r+' 1 +rub_;
vux_: =copy (vux_, 2, length (vux_) -1);
eee_: =vux_; eee_[1 ] : =chr (ord(eee_[11)-32}; stroka_: =eee__;
end; end;
End,
После компиляции проекта мы получим файл LIBFOROF.DLL и можем использовать доступные процедуры и функции, которые содержатся в этой библиотеке. Для этого расположим файл библиотеки таким образом, чтобы он был доступен приложению Excel. Это можно сделать, поместив файл LIBFOROF.DLL в одной папке с Excel или в папке, в которой он будет доступен для приложения Excel, например, в папке Windows\System32.
Использование
созданной динамической библиотеки
Переходим к использованию в Excel функций динамической библиотеки, созданной в Delphi. Для начала используем функцию GetDateDialog, кото-
рая будет по нажатию кнопки открывать диалоговое окно и вставлять дату в выделенную ячейку таблицы-
Вот исходный текст объявления функции и макроса.
Использование функции ввода даты в ячейку листа рабочей книги
Declare Function GetDateDialog Lib "LibForOf.dll" () As Variant
Public Sub DateDialog()
Selection = GetDateDialog
End Sub
На рис. 18.2 представлен результат выполнения процедуры GetDateDialog.
Выбор пмыВыбор пмыАвгуст 2003Август 2003ааЗОАв!ЗОАв!
Выбор пмы
Выбор пмы
Август 2003
Август 2003
а
а
ЗОАв!
ЗОАв!
Пн Вт Ср Чт Йт 亡 6 Вс
4 5 611 12 1318 19 2025 26 27ЕГ Сегодня:4 5 611 12 1318 19 2025 26 27ЕГ Сегодня:7891415162122232S 一①R'т30 06.20037891415162122232S 一①R'т30 06.2003-3WU^^-3WU^^кнопка вызовд Функциикнопка вызовд Функции
4 5 6
11 12 13
18 19 20
25 26 27
ЕГ Сегодня:
4 5 6
11 12 13
18 19 20
25 26 27
ЕГ Сегодня:
789
141516
212223
2S 一①
R'т
30 06.2003
789
141516
212223
2S 一①
R'т
30 06.2003
-3WU^^
-3WU^^
кнопка вызовд Функции
кнопка вызовд Функции
Рис. 18.2. Открытие диалогового окна выбора даты
Очевидно, что такой способ выбора даты будет неудобен пользователю. Предложим второй вариант, когда диалог выбора даты будет открываться по двойному щелчку левой кнопки мыши в ячейке таблицы. Здесь мы используем стандартную процедуру отклика на двойной щелчок. В эту процедуру передается ссылка на объект Range, в который необходимо записать дату. Вот исходный текст этой процедуры.
:Использование процедуры отклика на двойной щелчок
Private Sub Worksheet_BeforeDoubleClick(ByVai Target As Excel.Range,
Cancel As Boolean)
Target = GetDateDialog
Target. Number Format = ”d mrnram, yyyy"
End Sub
Использование данной процедуры позволит отказаться от кнопки и сократит количество действий пользователя. Дополнительно в этой процедуре выполняется преобразование формата ячейки для обеспечения правильного отображения даты.
Рассмотрим использование процедуры GetSumlnWords из состава динамической библиотеки LIBFOROF.DLL, которую мы создали для преобразования числового значения типа Currency в строковый эквивалент. В объявлении этой процедуры обратите внимание на описание ее параметров. Первый параметр объявляется с ключевым словом ByVai, указывающим на то, что этот параметр только передает и не возвращает данные. Второй параметр описан без ключевых слов, он возвращает строку — эквивалент значения первого параметра. В качестве второго параметра мы используем переменную str_, которую декларируем непосредственно в теле функции SumlnWords. В данном случае в модуле рабочей книги нам удобней использовать функцию, потому что ее можно будет применять в формулах Excel. Исходные тексты, представленные далее, дополняют сказанное.
;Использование функции преобразования числа в строковый эквивалент
Declare Function GetSumlnWords Lib "LibForOf.dll" (ByVai cur As Currency, stroka_ As String) As Boolean
Public Function SumlnWords (cur_ As Currency) As String
Dim str__ As String
Call GetSumlnWords (cur_, str_)
Sun^nWords = str_
End Function
Рис. 18*3. Преобразование числового значения в строковый эквивалент
После того как макрос записан и протестирован, переходим к его использованию. Для этого в ячейку F1 запишем формулу =SumInWords(A I). Эта формула позволит отображать в ячейке F1 строковый эквивалент числового значения, введенного в ячейку А1 (рис. 18.3).
В данной главе мы рассмотрели, как создавать и использовать динамические библиотеки в модулях документов MS Office. Были рассмотрены простые примеры, которые при желании можно выполнить и средствами языка Visual Basic. Но для экспорта и импорта информации в приложениях, созданных на базе Delphi, представленная информация весьма полезна.
Приложение 1. Объекты, свойства и методы
Приложение 2・ Ответы на вопросы
Приложение 3. Описание компакт-диска
ПРИЛОЖЕНИЕ 1
Объекты, свойства и методы
Приложение MS Word
Таблица П1.1, Свойства объекта Application
Свойство
Тип
Описание
ActiveDocument
Объект
Активным документ
ActivePrinter
String
Строка, содержащая имя принтера по умолчанию
Active Window
Объект
Ссылка на активное окно, т. е. окно, которое получило фокус ввода
Addins
Коллекция
Библиотека шаблонов стилей документов
Assistant
Объект
Ссылка на Помощник (анимированный элемент интерфейса)
AutoCaptions
Коллекция
Заголовки объектов, автоматически добавляемые, когда в документ вставляются объекты
AutoCorrect
Объект
Содержит информацию для автозамены слов в тексте
BackgroundPrintingStatus
Integer
Положение в очереди печати
BackgroundSavingStatus
Integer
Количество документов, сохраняемых в файлах
Build
String
Информация о версии MS Word
CapsLock
Boolean
True — включен режим CAPS LOCK (нажата клавиша <Caps Lock〉)
Таблица /77 Л (продолжение)
Свойство
Тип
Описание
Caption
String
Строка, которая содержит заголовок главно* го окна приложения
CommandBars
Коллекция
Панели элементов управления приложения Word
CustomDictionaries
Коллекция
Словари
DefaultSaveFormat
String
Тип формата сохраняемого документа по умолчанию (текстовая строка)
DefaultTableSeparator
String
Символ-разделитель, используемый для преобразования текста в таблицу
Dialogs
Коллекция
Диалоги
DisplayRecentFiles
Boolean
True — меню Файл содержит список недавно открывавшихся файлов
DisplayScreenTips
Boolean
True — комментарии, сноски, ссылки и т* л. выделяются в документе
DisplayScrollBars
Boolean
True — полосы прокрутки отображаются, False — полосы прокрутки скрыты
DisplayStatusBa「
Boolean
True — отображается строка состояния
Documents
Коллекция
Открытые документы
FileConverters
Коллекция
Файлы-конверторы, применяемые для преобразования документов во время их открытия, если файлы документов имеют формат, отличный от стандартных форматов
File Search
Объект
Используется для поиска файлов
FindKey
Объект
Ссыпка на объект, ассоциированный с комбинацией клавиш
FontNames
Коллекция
Список имен всех доступных шрифтов
Height
Integer
Значение высоты главного окна приложения Word
International
Коллекция
Значения некоторых национальных стандартов для текущей версии ОС
IsObjectValid (object)
Boolean
Имеет значение True, если объект object существует, иначе имеет значение False
KeyBindings
Коллекция
Комбинации клавиш и команды* которые с ними связаны
KeysBoundTo
Объект
Все комбинации клавиш, связанные с определенной командой
Таблица П1.1 (продолжение)
Свойство
Тип
Описание
Languages
Коллекция
Языки, которые могут быть использованы в документе
Left
Integer
Значение положения левой границы главного окна Word на рабочем столе
MacroContainer
Объект
Ссылка на объект, ассоциированный с документом или шаблоном, в модуле кото- ро「。содержится процедура, запущенная на выполнение
MailSystem
Integer
Установленная система обмена почтовыми сообщениями
MAPIAvailable
Boolean
True, если установлен MAPI
MathCoprocessorAvailable
Boolean
True, если установлен математический сопроцессор
MouseAvailable
Boolean
True, если манипулятор "мышь11 установлен в системе
Name
String
Обычно содержит текст ^Microsoft Word'*
NormalTemplate
String
Имя файла, содержащего шаблон Normal
NumLock
Boolean
True — на клавиатуре нажата клавиша <Num Lock>
Options
Объект
Опции приложения MS Word, большинство из которых представляет собой значения различных параметров по умолчанию
Path
String
Рабочий каталог приложения MS Word
PrintPreview
Boolean
True — включен режим просмотра печатной формы документа
RecentFiles
Коллекция
Имена недавно открытых файлов
ScreenUpdating
Boolean
True — окно и элементы окна были обновлены
Selection
Объект
Выделенный объект или диапазон текста в документе
ShowVisualBasicEditor
Boolean
True — окно редактора Visual Basic отображено
StatusBar
String
Строка состояния
System
Объект
Системная информация
Tasks
Коллекция
Объекты, связанные с запущенными на выполнение процессами
Таблица П1,1 (окончание)
Свойство
Тип
Описание
Templates
Коллекция
Доступные шаблоны
Тор
Integer
Верхняя координата главного окна приложения Word
UsableHeight
integer
Высота рабочей области главного окна приложения Word
UsableWidth
Integer
Ширина рабочей области главного окна приложения Word
UserAddress
String
Почтовый адрес пользователя
UserControl
Boolean
Тше — приложение Word или документ были созданы или открыты пользователем. False — приложение Word или документ были созданы или открыты программным путем
Userinitials
String
Инициалы пользователя
UserName
String
Имя пользователя
VBE
Объект
Visual Basic Editor
Version
String
Информация о версии приложения MS Word
Visible
Boolean
True — окно приложения MS Word отображено. Позволяет отобразить/скрыть окно MS Word
Width
Integer
Ширина главного окна приложения Word
Windows
Коллекция
Окна, связанные с приложением MS Word
WindowState
Integer
Состояние главного окна приложения MS Word
WordBasic
Объект
Объект Word Basic
Таблица /712 Методы объекта Application
Метод
Описание
Activate
Активизирует приложение MS Word
AddAddress
Добавляет запись в адресную книгу
BuildKeyCode
Возвращает код для комбинации клавиш
CentimetersToPoints
Преобразует значение в сантиметрах в количество пикселов
Таблица П1.2 fпродолжение)
Метод
Описание
ChangeFileOpenDirectory
Устанавливает каталог, в котором MS Word по умолчанию ищет и открывает документы
CheckGrammar (String=,tCTpoKa текста")
Проверяет грамматику в строке текста
CleanString (String)
Заменяет в строке символы, которые не могут быть напечатаны, символами пробела (код символа пробела — 32)
DDEExecute, DDE Initiate, DDEPoke, DDERequest, DDETerminat©, DDETerminateAII
Методы, позволяющие реализовать DDE-интерфейс
GetAddress
Возвращает адрес из адресной книги
GoBack
Перемещает курсор в предыдущее местоположение (где курсор располагался до последнего перемещения)
GoForward
Перемещает курсор вперед (действие» обратное действию, выполняемому методом GoBack)
Help
Открывает справочное окно. Единственный параметр метода определяет индекс блока информации из файла помощи, которую необходимо отобразить в окне
InchesToPoints
Преобразует значение в дюймах в количество пикселов
KeyString (KeyCode, KeyCode2)
Возвращает строку — текстовый эквивалент комбинации клавиш для заданных кодов клавиш
MHIimetersToPoints
Преобразует значение в миллиметрах в количество пикселов
Move
Перемещает главное окно приложения MS Word в новые координаты
NewWindow
Создает новое окно для активного документа
OnTime
Запускает на выполнение макрос в заданное время. Параметры метода — значение времени м имя макроса
PointsT oCentimeters
Преобразует количество пикселов в значение в сантиметрах
PointsToInches
Преобразует количество пикселов в значение в дюймах
Таблица П12 (окончание)
Метод
Описание
PointeToMillimeters
Преобразует количество пикселов в значение в миллиметрах
Printout
Печать документа. Параметры метода позволяют задать режим печати
Quit
Закрыеает приложение MS Word
Repeat
Повторяет последнее действие редактирования документа
Resize
Изменяет размеры главного окна приложения MS Word
Run
Запускает на выполнение макрос Visual Basic
ScreenRefresh
Обновляет главное окно MS Word в соответствии с новой информацией
SendFax
Посылает факсимильное сообщение
Документы Word
Таблица П1.3. Свойства коллекции Documents
Свойство
Тип
Описание
Count
Integer
Количество открытых документов
Parent
Объект
Ссылка на объект, которому принадлежит коллекция Documents
Таблица ГН4 Методы коллекции Documents
Метод
Описание
AdcKTemplate, NewTemplate)
Создает новый документ. Необязательные параметры: Template — путь и имя используемого шаблона, NewTemplate:=Тrue — создание нового шаблона
Close(SaveChanges, OriginaFormat, RouteDocument)
Закрывает все открытые документы. Необязатель- нь/е параметры: Save Changes — порядок сохранения закрываемых документов, OriginalFormat — формат закрываемых документов, используется, если документ имеет вложения
Таблица П1.4 (окончание)
Метод
Описание
Item(lndex)
Возвращает ссылку на открытый документ. Параметром метода служит номер документа в коллекции или его имя
Open(FileName, ConfirnnConversions, ReadOnlyt AddToRecentFiles,
Pa ss word Doc u me ntt PasswordTemplate, Revert WritePasswordDocument, WritePasswordTemplate, Format)
Открывает ранее созданный м сохраненный документ. Первый параметр является обязательным (путь и имя открываемого файла). Остальные параметры необязательны и определяют режимы открытия документа
Save(NoP『ompt, OriginalFormat)
Сохраняет все открытые документы. Необязательные параметры: NoPrompt:=True — позволяет автоматически сохранить все открытые документы, OriginalFormat — задание формата сохраняемых документов
Таблица Е5 Свойства объекта Document
Свойство
Тип
Описание
ActiveWindow
Объект
Активное окно документа
ActiveWritingStyle
Объект
Активный стиль документа
AttachedTemplate
Объект
Информация о шаблоне, используемом при создании документа
Background
Объект
Свойства фона области документа
Bookmarks
Коллекция
Закладки в документе
Characters
Коллекция
Символы, составляющие текст документа
CommandBars
Коллекция
Панели элементов управления
Comments
Коллекция
Комментарии в документе
Content
Объект
Область, которая представляет главную часть документа
CustomDocume ntProperties
Коллекция
Свойства документа (имя, значение и тип свойств), задаваемые пользователем
Fields
Коллекция
Поля. Например, коллекция может содер-〔 жать дату, которая размещается в тексте и обновляется автоматически
Footnotes
Коллекция
Сноски в документе
Таблица П1.5 (продолжение)
Свойство
Тип
Описание
FormFields
Коллекция
Формы в тексте документа
Frames
Коллекция
Рамки в документе
FullName
String
Полный путь и имя файла документа на диске
HasPassword
Boolean
True — требуется пароль, чтобы открыть данным документ
Hyperlinks
Коллекция
Размещенные в документе гиперссылки
InlineShapes
Коллекция
Объекты-формы, которые могут содержать только рисунки или OLE-объекты
IsMasterDocument
Boolean
True — признак главного документа, имеющего один или более подчиненных документов
IsSubdocument
Boolean
True — признак подчиненного документа
Name
String
Имя файла документа
Page Setup
Объект
Параметры страницы
Paragraphs
Коллекция
Абзацы документа
Parent
Объект
Ссылка на объект-хозяин данного документа
Password
String
Пароль для открытия документа
Path
String
Полное путевое имя файла документа
PrintFormsData
Boolean
True — печатать только данные для форм
ProtectionType
Integer
Тип защиты документа
Readonly
Boolean
True — документ открыт в режиме "только для чтения" и не может быть сохранен под старым именем
ReadOnlyRecommended
Boolean
True — при открытии документа будет выведен диалог, рекомендующий пользователя открывать данный документ в режиме нтолько для чтения'1
Saved
Boolean
True — с момента последнего сохранения документа в файле изменения в документ не вносились
SaveFormat
Integer
Формат документа
Shapes
Коллекция
Объекты в документе — надписи, рисунки, геометрические фигуры и др.
Таблица E・5 (окончание)
СвойствоТип
Описание
ShowGrammaticalErrorsBoolean
True — отображать грамматические ошибки в документе
ShowRevisionsBoolean
True — изменения в документе отображаются на экране
TrackRevisionsBoolean
True — изменения в документе отслеживаются
ShowSpellingErrorsBoolean
True — слова с ошибками в документе выделяются подчеркиванием
StoryRangesКоллекция
Различные области документа
StylesКоллекция
Текстовые стили, используемые для форматирования документа
SubdocumentsКоллекция
Документы, вложенные в главный документ
TablesКоллекция
Ссыпки на таблицы
TypeInteger
Тип документа: WdTypeDocument(=0)— документ, wdTypeTemplate(=1) — шаблон
UpdateStylesOnOpenBoolean
Тrue — коллекция стилей обновляется при открытии документа и соответствует стилям шаблона, с помощью которого создан документ
UserControlBoolean
True — документ был создан или открыт пользователем, False — документ создан или открыт программно, с использованием методов CreateOleObject
VariablesКоллекция
Заданные переменные для использования в вычислениях в модуле документа
VBProjsctКоллекция
Проекты, включенные в состав шаблона или документа
WindowsКоллекция
Ссылки на активные окна открытого документа
WordsКоллекция
Ссылки на слова в документе (объекты имеют тип Range)
WritePasswordString
Пароль, используемый для защиты документа при записи его на диск
WriteReservedBoolean
True — документ был защищен паролем для записи на диск
Таблица П1.6. Методы объекта Document
Метод
Описание
Activate
Активизирует документ
AddToFavorites
Добавляет документ в список избранных документов
AutoFormat
Форматирует документ или его часть
CheckGrammar
Проверяет грамматику. Если есть ошибки, то открывается окно для их исправления
CheckSpelling
Проверяет орфографию. Отображает окно для контроля и исправления ошибок. Если заданы параметры t то они определяют дополнительные уело* вия: используемые словари, регистр символов, режим окна
Close
Закрывает документ. Если метод вызывается с параметрами, то они определяют, как будут или не будут сохранены изменения в главном и в подчиненных документах, а также формат документа
ClosePrintPreview
Закрывает окно предварительного просмотра документа
Compare{Name: String)
Сравнивает документ с документом, путь которого содержится в строке Name
ComputeStatisticstStatistic, IncludeFootnotesAndEndnotes)
Возвращает статистические данные для документа: количество символов, линий, страниц, абзацев ит. Д・
CopyStylesFromTemplate(Name: String)
Копирует стили из шаблона в документ, Name — путь к файлу шаблона
Fo)lowHyperlink(Address:String)
Загружает HTML-документ в отдельное окно
GoTo(What( Which, Count, Name)
Возвращает ссылку на область, на которую был осуществлен переход. What определяет тип объекта, Which— направление перехода, Count — количество объектов, на которое производится переход, Name — имя объекта, в область которого производится переход (для некоторых типов объектов)
Merge(FileName: String)
Объединяет текущий документ с документом, путь к которому содержится в параметре FileName
Post
Отправляет документ по электронной почте
Printout
Отправляет документ на печать. Если используются параметры, то они позволяют задать режимы и области печати
Таблица П1.6 (окончание)
Метод
Описание
PrintPreview
Предварительный просмотр печати
Protect(Type, NoReset, Password)
Устанавливает защиту на документ. Аргументы позволяют задать режим защиты и пароль
Range
Возвращает область документа. Если используются аргументы, то они устанавливают ограничение этой области
Redo
Возвращает изменения в документе, которые были отменены
RejectAIIRevisions
Отменяет все последние изменения в документе
Reload
Отменяет все последние действия и загружает последнюю версию документа
RunAutoMacro
Выполняет макрокоманды, которые могут быть использованы при открытии, закрытии, сохранении документа и т. д.
Save
Сохраняет документ в файл
SaveAs(FileName:String)
Сохраняет документ а файл с новым именем (имя файла — обязательный аргумент). Могут использоваться дополнительные аргументы, определяющие формат сохраняемого документа, режимы доступа и другие свойства
Select
Выделяет содержимое документа
SsndFax(Add「ess, Subject)
Передает документ по факсу, параметры определяют номер факса и тему факсимильного сооб* щения
SendMail
Создает письмо электронной почты с вложением в это письмо данного документа
Undo
Отменяет последнее изменение документа
UndoClear
Очищает лист последних изменений документа
UnProtect(Password:String)
Отменяет защиту, которая была установлена на документ. В качестве параметра используется строка пароля, заданного при установке защиты на документ
UpdateStyles
Копирует все стили из шаблона в документ
14 3нк 723
Область Range
Таблица /71.7. Свойства объекта Range
Свойство
Тип
Описание
Bold
Boolean
True — в заданной области документа текст имеет полужирное начертание
BookmarklD
Integer
Количество закладок в данной области докумен* та
Bookmarks
Коллекция
Закладки в документе
Borders
Коллекция
Свойства границы области
Case
Integer
Регистр символов для выделенного текста
Characters
Коллекция
Символы, из которых состоит область текста
Comments
Коллекция
Комментарии, входящие в область
End
Integer
Конечная граница области текста
Fields
Коллекция
Поля, входящие в заданную область
Find
Объект
Объект, свойства которого определяют критерии и методы для поиска фрагмента текста в документе
Font
Объект
Свойства шрифта заданной области документа
Footnotes
Коллекция
Сноски в документе
FormattedText
Объект
Объект, который дополнительно к тексту содержит информацию и о формате этой области
FormFields
Коллекция
Формы в заданной области
Frames
Коллекция
Рамки в заданной области
GrammarChecked
Boolean
True — для заданной области была проверена проверка грамматики
G rammaticalErrors
Коллекция
Слова заданной области, которые написаны с грамматическими ошибками
Hyperlinks
Коллекция
Гиперссылки, размещенные в данной области документа
Information
Объект
Различного рода информация о данной области в документе
InlineShapes
Коллекция
Объекты-формы, которые могут содержать только рисунки или OLE-обьекты. Все объекты коллекции принадлежат заданной области документа
Italic
Boolean
True — для данной области шрифт имеет курсивное начертание
Таблица П1.7 (окончание)
Свойство
Тип
Описание
LanguagelD
Integer
Позволяет определить или установить язык для заданного объекта
ListParagraphs
Коллекция
Список абзацев области
Orientation
Integer
Позволяет определить или задать направление текста в заданной области
PageSetup
Объект
Параметры страницы
ParagraphFormat
Объект
Свойства абзацев, включенных в заданную область
Paragraphs
Коллекция
Абзацы заданной области
Parent
Объект
Ссылка на объект-хозяин объекта Range
PreviousBookmarklD
Integer
Номер закладки, которая находится до заданной области
Start
Integer
Позиция первого символа заданной области
Text
String
Текст данной области
Underline
Integer
Стиль подчеркивания текста
Words
Коллекция
Слова, входящие в данную область
Таблица П1.8. Методы объекта Range
Метод
Описание
AutoFormat
Форматирует заданную область документа
Calculate
Вычисляет результат математического выражения, которое содержится в заданной области
CheckGrammar
Проверяет грамматику в тексте заданной области. Если есть ошибки, то открывается окно для их исправления
CheckSpelling
Проверяет орфографию в тексте заданной области. Если есть ошибки, то открывается окно для их исправления
CheckSynonyms
Показывает диалоговое окно со словами- синонимами для замены слова, которое находится в заданной области
Collapse
Изменяет значения начальной и конечной границ заданной области (после выполнения этого метода эти значения становятся равными друг другу)
Таблица Ш.8 (продолжение)
Метод
Описание
ComputeStatistics(Statistic, IncludeFootnotesAndEndnotes)
Возвращает статистические данные для документа: количество символов, линий, страниц, абзацев ит. д.
ConvertToTable
Преобразует данную область текста в таблицу
Copy
Копирует данную область в буфер обмена
CopyAsPicture
Копирует данную область в буфер обмена как рису* нок
Cut
Вырезает данную область и помещает ее в буфер обмена
Delete
Удаляет заданную область из документа
EndOf
Изменяет конечную границу области, приводя ее к положению, совпадающему с окончанием символа, слова и т. п.
Expand
Расширяет границы заданной области; возвращает величину, на которую произведено расширение
GetSpellingSuggestions
Возвращает коллекцию слов, подходящих для замены первого слова в заданном диапазоне (орфография)
GoTo(Whatt Which, Count, Name)
Возвращает ссылку на область, на которую был осуществлен переход: What — тип объекта. Which — направление перехода, Count — количество объектов, на которое производится переход, Name — имя объекта, в область которого производится переход (для некоторых типов объектов)
GoToNext
Осуществляет переход на следующий объект и возвращает ссылку на него
GoToPrevious
Осуществляет переход на предыдущий объект и возвращает ссылку на него
InRange(Range)
Проверяет вхождение заданной области в область Range и возвращает значение True, если это условие выполняется
InsertAfter
Вставляет текст после границы заданной области
InsertAutoText
Вставляет текст в режиме "автозамена", если есть подходящий вариант
InsertBefore
Вставляет текст перед границей заданной области
InsertBreak
Вставляет разрыв страницы в заданную область
InsertCaption
Вставляет текст
Таблица П1.8 (продолжение)
Метод
Описание
I nsertCrossRef е ге псе
Вставляет ссылки к заголовкам, страницам» сноске и т. m
InsertDatabase
Вставляет данные из ресурса, который представляет собой рабочую книгу Excel, документ Word, базу данных Access или текстовый файл
InsertDateTime
Вставляет дату и время как текст в заданном формате
InsertFile
Вставляет содержимое файла в заданную область
InsertParagraph
Вставляет новый абзац в область Range документа
InsertParagraphAfter
Вставляет новый абзац после границы заданной области
InsertParagraphBefore
Вставляет новый абзац перед границей заданной области
InsertSymbol
Вставляет символ в заданную область, при этом можно выбрать режим и шрифт вставляемого символа
InStory
Возвращает True, если область находится в том же диапазоне, в котором находится область, указанная в качестве параметра этого метода
IsEqual
Возвращает True, если область, к которой применен этот метод, равна области, указанной в качестве параметра этого метода
LookupNameProperties
Ищет имя в адресной книге и отображает диалог свойств адресата
Move
Изменяет границы области и перемещает указатель в новую позицию
MoveEnd
Перемещает конечную позицию указателя объекта Range или курсора в конец или начал。документа на указанное количество объектов (символовt слов( ячеек и т. nJ
MoveEndUnW
Перемещает конечную позицию указателя объекта Range или выделенной области в конец или начало документа до тех пор, пока не встретится заданный объект (символ)
MoveEndWhile
Перемещает конечную позицию указателя объекта Range нем выделенной области в конец или начало документа до тех nopt пока встречается заданный символ или объект
Таблица ГП.8 (окончание)
Метод
Описание
MoveStart
Перемещает начальную позицию указателя объекта Range или курсора в конец или начало документа на указанное количество объектов (символов, слов, ячеек и т. п.)
MoveStartUntil
Перемещает начальную позицию указателя объекта Range или выделенной области в конец или начало документа до тех пор, пока не встретится заданный объект (символ)
MoveStartWhile
Перемещает начальную позицию указателя объекта Range или выделенной области в конец или начало документа до тех пор, пока встречается заданный символ или объект
MoveUntH
Перемещает позицию объекта Range или выделения в области до тех пор, пока заданная комбинация символов не будет найдена. Возвращает фактическое количество символов, на которое было произведено перемещение
MoveWhile
Перемещает позицию объекта Range или выделения на заданное количество символов, слов и т. п. в области до тех пор, пока встречается заданная комбинация символов. Возвращает фактическое количество символов, на которое было произведено перемещение
Next
Перемещает позицию объекта Range или выделения к следующему символу, слову и т. п.
Paste
Вставляет текст из буфера обмена в заданную область
PasteSpecial
Вставляет текст из буфера обмена в заданную область. В отличие от метода Paste, данный метод позволяет управлять форматом вставляемого текста
Previous
Возвращает область, связанную с символом, словом и т. пм предшествующим заданной области
Select
Выделяет заданную область
SetRange
Устанавливает начальную и конечную позиции заданной области
Sort
Сортирует текст в заданной области
StartOf
Перемещает указатели объекта Range или выделения в начало заданной области
WholeStory
Расширяет границы заданной области
Область Selection
Таблица "7.9. Свойства объекта Selection
Свойство
Тип
Описание
Cells
Коллекция
Ячейки таблицы, попадающие в выделенную область
Columns
Коллекция
Столбцы таблицы, попадающие в выделенную область
ColumnSelectMode
Boolean
Тrue — режим выделения столбца
Document
Объект
Ссылка на документ, которому принадлежит выделенная область
ExtendMode
Boolean
True— режим, позволяющий расширять границы выделенной области
Flags
Integer
Свойства выделенной области (объекта), выражаемые суммой определенных констант
Rows
Коллекция
Строки таблицы, попадающие 日 выделенную область
Shading
Объект
Свойства штриховки выделенной области
Start
integer
Позиция первого символа заданной области
StartlsActive
Boolean
True— активно начало выделенной области, например, если правая часть области текста зафиксирована и область изменяет свои границы за счет изменения левой границы
Tables
Коллекция
Таблицы, попадающие в выделенную область
Text
String
Текст выделенной области
Type
Integer
Тип выделенного объекта — таблица, окно и т. п.
Words
Коллекция
Слова текста, попадающие в выделенную область
Таблица ПТЛО. Методы объекта Selection
Метод
Описание
Сору
Копирует выделенную область в буфер обмена
CopyAsPicture
Копирует выделенную область в буфер обмена как рисунок
CopyFormat
Копирует выделенную область и формат, в котором представлена информация в этой области, в буфер обмена
Таблица ШЛО (продолжение)
Метод
Описание
CreateTextbox
Создает надпись в месте выделенной области, перенося ее в область объекта
Cut
Вырезает текст (объект) и помещает его в буфер обмена
Delete
Удаляет выделенный объект или область
EndKey
Расширяет выделенную область к концу указанной единицы. Возвращает величину фактического перемещения (в символах)
EscapeKey
Отменяет установленный режим задания「ранни выделенной области
Extend
Расширяет выделенную область до положения символа, указанного в качестве аргумента метода
MoveDown
Перемещает конечную позицию указателя объекта Selection вниз и возвращает величину, на которую реально было выполнено перемещение
MoveEnd
Перемещает конечную позицию указателя объекта Selection в конец или начало документа на указанное количество объектов (символов, слов, ячеек и т, nJ
MoveLeft
Перемещает положение указателя объекта Selection влево и возвращает величину, на которую реально было выполнено перемещение
MoveRight
Перемещает положение указателя объекта Selection вправо и возвращает величину, на которую реально было выполнено перемещение
Movellp
Перемещает начальную позицию указателя объекта Selection вверх и возвращает величину, на которую реально было выполнено перемещение
Paste
Вставляет текст из буфера обмена в выделенную область
PasteFormat
Вставляет текст из буфера обмена в выделенную область с учетом формата
SeiectColumn
Выделяет столбец таблицы, в котором находится курсор
SelectCurrentAlignment
Расширяет выделенную область до тех порт пока не встретится текст с друплм выравниванием
SelectCurrentColor
Расширяет выделенную область до тех пор, пока не встретится текст с другим цветом
SelectCurrentFont
Расширяет выделенную область до тех пор, пока не встретится текст с другим шрифтом
Таблица П1,10 (окончание)
Метод
Описание
SelectCurrentSpacing
Расширяет выделенную область до тех пор, пока не встретится текст с другим межбуквенным интервалом
SelectCurrentTabs
Расширяет выделенную область до тех пор, пока не встретится абзац с другим отступом
SelectRow
Выделяет строку таблицы, в которой находится курсор
Т ypeBackspace
Удаляет выделенную область или символ слева от курсора (как по нажатию клавиши <Backspace>)
Шрифт, свойства и методы
Таблица /71/1. Свойства объекта Font
Свойство
Тип
Описание
AllCaps
Boolean
True — все буквы прописные
Animation
Integer
Вид анимации символов
Bold
Boolean
True — полужирное начертание символов
Colorindex
Integer
Индекс цвета из цветовой палитры
DoubleStrikeThrough
Boolean
True — к символам применяется эффект двойного перечеркивания
Duplicate
Объект
Свойства шрифта, используемые для их дублирования применительно к набору символов
Emboss
Boolean
True — приподнятые символы
Engrave
Boolean
True — утопленные символы
Hidden
Boolean
True — символы шрифта скрыты
Italic
Boolean
True — курсивное начертание символов
Kerning
Extended
Величина кернинга
Name
String
Имя шрифта
Name Ascii
String
Имя шрифта, используемое для символов с кодами от 0 до 127
NameOther
String
Имя шрифта, используемое для символов с кодами больше 127
Outline
Boolean
True — отображение символов в виде контура
Таблица П1.11 (окончание)
Свойство
Тип
Описание
Parent
Объект
Объект-хоэяин» свойством которого является объект Font
Position
Extended
Величина вертикального смещения
Scaling
Extended
Величина масштаба отображения символов
I Shading
Объект
Свойства фона символов
Shadow
Boolean
True — символы отображаются с тенью
Size
Integer
Размер шрифта
SmallCaps
Boolean
True — малые прописные буквы
Spacing
Extended
Расстояние между символами
StrikeThrough
Boolean
True - зачеркнутые символы
Subscript
Boolean
True — символы в виде нижнего индекса
Superscript
Boolean
True — символы в виде верхнего индекса
Underline
Integer
Стиль подчеркивания
Таблица П1.12. Методы объекта Font
Метод
Описание
Grow
Увеличивает размер шрифта на минимальную доступную величину
Reset
Отменяет пользовательские настройки шрифта
SetAsTemplateDefault
Устанавливает данный шрифт как шрифт по умолчанию для этого документа и для всех новых документов
Shrink
Уменьшает размер шрифта на минимальную доступную величину
Коллекция таблиц, свойства и методы
Таблица П1.13, Свойства коллекции Tables
Свойство
Тип
Описание
Count
Integer
Количество таблиц коллекции
Parent
Объект
Ссылка на объект, которому принадлежит коллекция Tables
Таблица П1.14. Методы коллекции Tables
Метод
Описание
Add
Добавляет новую таблицу в коллекцию
Item
Возвращает ссылку на таблицу коллекции
Таблица, свойства и методы
Таблица П1.15. Свойства объекта Table
Свойство
Тип
Описание
AutoFormatType
Integer
Формат таблицы
Borders
Коллекция
Свойства линий сетки таблицы
Columns
Коллекция
Столбцы таблицы
Parent
Объект
Ссылка на объект, которому принадлежит таблица
Range
Объект
Область таблицы
Rows
Коллекция
Строки таблицы
Shading
Объект
Свойства штриховки области таблицы
Uniform
Boolean
True — все строки таблицы имеют одинаковое количество столбцов
Таблица П1.16. Методы объекта Table
Метод
Описание
AutoFormat
Форматирует таблицу. Параметры метода позволяют задать формат, шрифт, цвет, стиль линий сетки и другие свойства таблицы и текста
Cell
Возвращает объект, представляющий собой ячейку таблицы
ConvertToText
Преобразует таблицу в текст и возвращает объект Range как ссылку на область, которая содержит этот текст
Delete
Удаляет таблицу
Select
Выделяет таблицу
Sort
Сортирует информацию в таблице. Параметры метода позволяют задать способы и условия сортировки
SortAscending
Сортирует информацию в таблице по возрастанию
Таблица П1,16 (окончание)
Метод
Описание
SortDescending
Сортирует информацию в таблице по убыванию
Split
Разрывает таблицу (вставляет пустую строку) в месте таблицы, задаваемом номером строки
UpdateAutoFormat
Восстанавливает формат таблицы, приэодя его к стандартному формату, который был использован при создании таблицы
Коллекция объектов Shapes, свойства и методы
Таблица П1.17. Свойства коллекции Shapes
Свойство
Тип
Описание
Count
Integer
Количество элементов коллекции
Parent
Объект
Ссылка на объект, которому принадлежит коллекция Shapes
Таблица П1」8. Методы коллекции Shapes
Метод
Описание
AddCallout
Создает объект-выноску. Параметры метода позволяют определить тип объекта, его координаты и размеры. Возвращает ссылку на созданный объект
AddCurve
Создает кривую линию. Параметры метода несут информацию о массиве координат точек создаваемой линии. Возвращает ссылку на созданный объект
AddLabel
Создает метку. Параметры метода определяют ориентацию текста надписи, координаты ее местонахождения и размеры. Возвращает ссылку на созданный объект
AddLine
Создает линию. Параметры метода определяют начальные и конечные координаты линии. Возвращает ссылку на созданный объект
AddOLEControl
Создает элемент управления ActiveX. Параметры метода определяют класс объекта, его координаты и размеры
AddOLEObject
Создает OLE-объект. Параметры метода определяют класс объекта, файл, откуда он загружается, координаты объекта, размеры и способ отображения
AddPicture
Создает рисунок, загружаемый из графического файла. Параметры метода определяют координаты, размеры и способ отображения и сохранения изменений рисунка
Таблица П1.18 (окончание)
Метод
Описание
AddPolyline
Создает полилинию (линию» состоящую из прямых и кривых участков). Параметры метода несут информацию о массиве координат точек создаваемой полилинии. Возвращает ссылку на созданный объект
AddShape
Создает автофигуру. Параметры метода определяют вид создаваемой фигуры, ее координаты и размеры
AddTextbox
Создает надпись. Параметры метода определяют ориентацию текста надписи, координаты ее местонахождения и размеры. Возвращает ссылку на созданный объект
AddTextEffect
Создает объект WordArt. Параметры метода определяют стиль создаваемого объекта, текст, параметры шрифта и координаты
BuildFreeform
Создает объект, позволяющий описать и создать в документе произвольную фигуру t состоящую из прямых и кривых линий
Item
Предоставляет доступ к элементам коллекции Shapes
Range
Возвращает ссылку на область одного из элементов коллекции. Параметром служит порядковый номер этого элемента в коллекции Shapes
SelectAII
Выделяет все элементы коллекции
Объект Shape, свойства и методы
Таблица П1.19. Свойства объекта Shape
Свойство
Тип
Описание
Adjustments
Коллекция
Точки, позволяющие настраивать вид графической фигуры. Элементы коллекции представляют собой значения типа Extended
Anchor
Обьект типа Range
Определяет связь объекта с областью текста страницы документа (якорь)
AutoShapeType
Integer
Тип объекта Shape (автофигуры)
Callout
Объект
Обеспечивает связь графического элемента с элементом — выноской
Fill
Объект
Свойства заливки графического объекта
GroupUems
Коллекция
Свойства сгруппированных объектов
! Height
Integer
Высота объекта
Таблица Ш・79 (продолжение)
Свойство
Тип
Описание
HorizontalFlip
Boolean
True (-1)— объект был зеркально отражен в горизонтальной плоскости
Hyperlink
Объект
Гиперссылка
Left
Extended
Левая координата объекта
Line
Объект
Свойства линий границы объекта или самой линии для объекта Line
LinkFormat
Объект
Свойства ресурсов, используемых при созДании этого объекта, и действия над ними
LockAnchor
Boolean
True — объект связан с областью Range и заблокирован. Якорь не может быть перемещен и указывает на то место документа, где будет отображен объект
LockAspectRatio
Boolean
True — объект автоматически пропорционально изменяет все свои размеры при изменении хотя бы одной характеристики размера
Name
String
Имя объекта
Nodes
Коллекция
Геометрическое описание объекта
OLEFormat
Объект
OLE-объект, заключенный в объект Shape, и его свойства
Parent
Объект
Ссылка на объект, которому принадлежит объект Shape
PictureFormat
Объект
Рисунок, заключенный в объект Shape, и его свойства
RelativeHorizontalPosition
Integer
Определяет, относительно че「о будет задано горизонтальное положение (выравнивание) объекта (например, относительно страницы» колонки, края текста)
RelativeVerticalPosition
Integer
Определяет, относительно чего будет задано вертикальное положение (выравнивание) объекта (например, относительно края текста, страницы, абзаца)
Rotation
Integer
Угол поворота фигуры
Shadow
Boolean
True — объект отображен с тенью
TextEffect
Объект
Объект WordArt, заключенный в объекте Shape, и его свойства
TextFrame
Объект
Текст, заключенный в объект Shape, и его свойства
Таблица П1.19 (окончание)
Свойство
Тип
Описание
ThreeD
Объект
ЗО-объект, заключенный в объект Shape, и его свойства
Тор
Integer
Верхняя координата расположения объекта Shape
Туре
Integer
Тип объекта Shape
VerticalFlip
Boolean
True (-1) — объект зеркально отражен в вертикальной плоскости
Vertices
Коллекция
Координаты точек кривых и ломаных линий
Visible
Boolean
True — объект отображен, иначе False
Width
Integer
Ширина объекта
WrapFormat
Объект
Способ и параметры обтекания текста вокруг объекта Shape
ZOrderPosition
Integer
Порядок размещения данного объекта Shape относительно других объектов Shape (на переднем или заднем плане относительно друг друга)
Таблица П1.20. Методы объекта Shape
Метод
Описание
Activate
Активизирует объект
Apply
Применяет к объекту формат, скопированный у другого подобного объекта с помощью метода PickUp
ConvertToFrame
Преобразует объект в рамку. Возвращает ссылку на новый объект
ConvertToInlineShape
Конвертирует рисунок в объект InlineShape — объект, который при редактировании документа ведет себя как символ текста
Delete
Удаляет объект из документа
Duplicate
Создает копию объекта
Flip
Зеркально отражает объект
IncrementLeft
Перемещает объект по горизонтали на заданное количество точек
IncrementRotation
Изменяет угол поворота объекта на заданное количество градусов
Таблица П1.20 (окончание)
Метод
Описание
IncrementTop
Перемещает объект по вертикали на заданное количество точек
PickUp
Копирует формат объекта
ScaleHeight
Задает масштаб изменения высоты объекта. Параметры метода задают величину и условия применения масштаба
ScaleWidth
Задает масштаб изменения ширины объекта. Параметры метода задают величину и условия применения масштаба
Select
Выделяет объект
SetShapesDefaultProperties
Сохраняет и использует свойства объекта как свойства по умолчанию, которые будут использоваться при создании новых объектов
Ungroup
Разгруппировывает сгруппированные объекты Shape
ZOrder
Изменяет порядок размещения объекта относительно других объектов (на переднем или заднем плане относительно друг друга)
Приложение MS Excel
Таблица П1.21. Свойства объекта Application
Свойство
Тип
Описание
ActiveCell
Объект
Ссылка на активную ячейку (имеющую фо^ кус ввода)
ActiveChart
Объект
Ссылка на активную диаграмму
ActivePrinter
Объект
Свойства активного принтера
ActiveSheet
Объект
Ссылка на активный лист
ActiveWindow
Объект
Ссылка на активное окно
ActiveWorkbook
Объект
Ссыпка на активную рабочую книгу
Addins
Коллекция
Библиотека шаблонов стилей документов
Assistant
Объект
Ссылка на Помощник (анимированный элемент интерфейса)
AutoCorrect
Объект
Информация для автоэамены слов в тексте
Таблица П1,21 (продолжение)
Свойство
Тип
Описание
Build
String
Информация о версии MS Excel
CalculateBefore Save
Boolean
True — информация в ячейках рабочих книг рассчитывается перед тем, как они будут сохранены в файле
Calculation
Integer
Режим вычисления формул на листе — ав* тематическое или неавтоматическое (ручной режим)
Caption
String
Заголовок окна
CellDragAndDrop
Boolean
True — включен режим перетаскивания
Cells
Объект
Ссь1лка на область ячеек активной рабочей книги
Charts
Коллекция
Диаграммы
CHpboardFormats
Integer
Формат буфера обмена
Columns
Коллекция
Столбцы листа рабочей книги
CommandBars
Коллекция
Панели элементов управления приложения Excel
Cursor
Integer
Вид курсора
CutCopyMode
Integer
Статус команд Вырезать и Копировать
DefaultFilePath
String
Путь по умолчанию, используемый для открытия файлов
DefaultSaveFormat
Integer
Формат рабочих книг, по умолчанию используемый для сохранения файлов
Dialogs
Коллекция
Диалоги
DisplayAlerts
Boolean
False — отключить сообщения, генерируемые во время выполнения макросов
DisplayCommentlndicator
Integer
Режим отображения индикаторов и (или) примечаний для ячеек таблицы
DisplayFormulaBar
Boolean
False — строка формул не отображается
DisplayFullScreen
i Boolean
;True — полноэкранный режим отображения таблицы рабочей книги
DisplayNotelndicator
Boolean
True — отображение комментариев
DisplayRecentFiles
Boolean
True — в меню Файл отображается список недавно открытых файлов
15 Зак ?2л
Таблица П1.21 (продолжение)
Свойство
Тип
Описание
DisplayScrollBars
Boolean
True — полосы прокрутки отображаются, False — скрыты
Display Statu sBar
Boolean
True — отображается строка состояния
EditDirectlyInCell
Boolean
True — допускается правка информации прямо в ячейке
EnableEvents
Boolean
True — допускается обработка откликов объекта на различные события
EnableSound
Boolean
Включение/отключение звуковых эффектов в Excel
FileConverters
Коллекция
Файлы-конверторы
FileSearch
Объект
Используется для поиска файлов
Fixed Decimal
Boolean
True — все вводимые числовые данные будут автоматически приводиться к формату с фиксированной точкой. Количество десятичных знаков определяется свойством FixedDecimalPlaces
FixedDecimalPlaces
Integer
Определяет количество знаков для формата с фиксированной точкой (см. свойство FixedDecimal)
Height
Integer
Высота главного окна приложения Excel
IgnoreRemoteRequests
Boolean
True — запросы DDE внешних программ игнорируются
Interactive
Boolean
False — блокируется ввод с клавиатуры и от мыши
International
Коллекция
Значения некоторых национальных стандартов для текущей версии ОС
Left
Integer
Положение левой границы 「лавн口「。окна Excel на рабочем столе
Librarypath
String
Путь к файлам библмотек
MailSystem
Integer
Информация об установленной системе обмена почтовыми сообщениями
MathCoprocessorAvailable
Boolean
True — установлен математический сопроцессор
MemoryFree
Integer
Объем свободной доступной приложению Excel оперативной памяти (в байтах)
MemoryTotal
Integer
Объем всей доступной приложению Excel оперативной памяти (в байтах)
Таблица П1.21 (продолжение)
Свойство
Тип
Описание
MemoryUsed
Integer
Объем используемой приложением Excel оперативной памяти (в байтах)
MouseAvailable
Boolean
True — манипулятор "мышьи установлен в системе
MoveAfterReturn
Boolean
Управление перемещением фокуса ввода к новой ячейке по нажатию клавиши <Enter>
MoveAfterReturnDirection
Integer
Направление перемещения фокуса ввода к новой ячейке (см. свойство MoveAfterReturn)
Name
String
Обычно содержит текст "Microsoft Excel"
Names
Коллекция
Имена объектов всех рабочих книг приложения
NetworkTemplatesPath
String
Сетевой путь к папке, содержащей шаблоны документов
OnWindow
String
Имя процедуры, выполняемой при активации окна
OperatingSystem
String
Наименование и номер установленной операционной системы
OrganizationName
String
Наименование организации, зарегистрировавшей данное приложение MS Excel
Path
String
Путь к рабочей папке приложения MS Excel
PathSeparator
Char
С имвол - раздел итель для строки, содержащей путь к рабочей папке приложения MS Excel (см свойство Path)
PromptForSummarylnfo
Boolean
True — во время сохранения рабочем книги в файле выводится окно для редактирования ее свойств
Range
Объект
Ссылка на область ячеек рабочей книги
RecentFiles
Коллекция
Имена недавно открытых файлов
ReferenceStyle
Integer
Стиль заголовков столбцов таблицы
RollZoom
Boolean
True — включить режим управления масштабом отображения рабочей книги с помощью колеса мыши
Rows
Коллекция
Строки таблицы рабочей книги
Screenupdating
Boolean
True — окно и элементы управления окна были обновлены
Таблица П1.21 (окончание)
Свойство
Тип
Описание
Selection
Объект
Выделенный объект или диапазон ячеек в рабочей книге
Sheets
Коллекция
Листы активной рабочей книги
SheetsInNewWorkbook
Integer
Количество листов рабочей книги, создаваемых при создании новой рабочей книги
Standard Font
String
Наименование стандартного шрифта
StandardFontSize
Integer
Размер стандартного шрифта
Startuppath
String
Полный путь к папке запуска Excel
StatusBar
String
Строка состояния
TemplatesPath
String
Папка с шаблонами документов
ThisWorkbook
Объект
Ссылка на рабочую книгу, макрос из программного модуля которой выполняется в настоящее время
Top
Integer
Верхняя координата главного окна приложения Excel
UsableHeight
Integer
Высота рабочей области главного окна приложения Excel
UsableWidth
Integer
Ширина рабочей области гт1авно「。окна приложения Excel
UserControl
Boolean
True — приложение Excel или рабочая книга были созданы или открыты пользователем, False — приложение Excel или рабочая книга были созданы или открыты программным путем
UserName
String
I Имя пользователя
Value
String
Всегда содержит строку “Microsoft Excel"
VBE
Объект
Объект Visual Basic Editor
Version
String
Информация о версии приложения Excel
Visible
Boolean
Позволяет отобразить/скрыть главное окно приложения Excel (True — окно отображено)
Width
Integer
Ширина главного окна приложения Excel
Windows
Коллекция
Окна, связанные с приложением Excel
WindowState
Integer
Состояние главного окна приложения Excel
Workbooks
Коллекция
Открытые рабочие книги
Worksheets
Коллекция
Листы открытых рабочих книг
Таблица П1.22. Методы объекта Application
Метод
Описание
Activate MicrosoftApp
Активирует или запускает, если приложение не было актив- wot одно мз приложений MS Office. Параметр метода — мм- еловая константа, ассоциированная с одним из этих приложений
Add С hart Auto Format
Добавляет в коллекцию форматов диаграмм новый формат, используя для этого готовую диаграмму
Calculate
Рассчитывает все формулы во всех открытых рабочих книгах
CentimetersToPoints
Преобразует значение в сантиметрах в количестзо точек
CheckSpelling
Проверяет орфографию. Отображает окно для контроля и исправления ошибок. Если заданы параметры, то они определяют дополнительные условия: используемые словари, регистр символов, режим окна
ConvertFormula
Конвертирует формулы, которые содержат адреса ячеек в стиле R1C1, в идентичные формулы, содержащие адреса в стиле А1
DDEExecute, DDEInitiatet DDEPok% DDERequest, DDETerminate
Позволяют реализовать DDE-интерфейс
DeleteChartAutoFormat
Удаляет формат диаграммы, заданный названием, из списка форматов диаграмм, используемых при создании новой диаграммы
DoubleClick
Действие метода эквивалентно двойному щелчку левой кнопки мыши
Evaluate
Преобразует имя объекта в ссылку на этот объект. Параметром метода является строка, содержащая имя объекта
FindFile
Открывает диалог Открытие документа
GetOpenFilename
Открывает диалог Открытие документа, затем возвращает результат выполнения диалога: строку (путь и имя открываемого файла) или False, если пользователь отменил открытие документа
GetSaveAsFilename
Открывает диалог Сохранение документа, затем возвращает результат выполнения диалога: строку (путь и имя сохраняемого файла) или False, если пользователь отменил сохранение документа
Goto
Выполняет переход к объекту, заданному параметром метода
Таблица П1.22 (окончание)
Метод
Описание
Help
Открывает справочное окно. Первый параметр метода указывает на файл помощи, второй определяет индекс блока информации из файла помощи( который требуется отобразить в окне
InchesToPoints
Преобразует значение в дюймах в количество пикселов
InputBox
Открывает диалог для ввода информации. Возвращает значение, введенное пользователем. Параметры метода задают свойства диалога
Intersect
Возвращает объект, представляющий собой пересечение областей, адреса которых заданы аргументами метода
MacroOptions
Позволяет задать для макроса параметры, например, сочетание клавиш и его описание. См. диалог Параметры макроса
OnKey
Позволяет задать ключевую комбинацию для выполнения заданных процедур. Параметрами метода являются описание ключевой комбинации и наименование выполняемой 1 процедуры
OnTime
Предписывает запустить на выполнение макрос в заданное время. Параметрами метода являются значение времени и имя макроса
Quit
Закрывает приложение MS Excel
Repeat
Повторяет последнее действие редактирования документа
Run
Запускает на выполнение макрос Visual Basic
SaveWorkspace
Сохраняет рабочую область документа
SendKeys
Действие метода эквивалентно нажатию клавиши или комбинации клавиш, коды которых заданы первыми параметрами метода, последний параметр метода — время задержки выполнения
SetDefaultChait
Определяет наименование шаблона диаграммы Excel, который будет использоваться при создании новых диаграмм
Undo
Отменяет последнее изменение документа
Union
Возвращает объект, представляющий собой объединение двух и более областей Range
Wait
Позволяет задержать выполнение макросов Excel
Рабочая книга Excel
Таблица П1.23. Свойства коллекции Workbooks
Свойство
Тип
Описание
Count
Integer
Количество открытых рабочих кнм「
Item
Объект
Ссылка на открытую рабочую книгу. Параметром метода служит номер документа в коллекции или его имя
Parent
Объект
Ссылка на объект, которому принадлежит коллекция Workbooks
Таблица П1.24. Методы коллекции Workbooks
Метод
Описание
Add(Template)
Создает новый документ. Необязательный параметр Template — путь и имя используемого шаблона
Close
Закрывает все открытые документы
Open(FileName, UpdateLinks, Readonly, Format, Password, WriteResPassword. IgnoreReadOnlyRecommended, Origin, Delimiter, Editable, Notify, Converter, AddToMRU)
Открывает созданную ранее и сохраненную рабочую книгу. Первый параметр является обязательным и указывает путь и имя открываемого файла. Остальные параметры необязательны и определяют режимы открытия документа
OpenText (Filename, Origint StartRow, DataType, TextQualifier, ConsecutiveDeiimiter, Tab, Semicolon, Comma, Space, Other, OtherChaj Fieldinfo)
Открывает текстовый файл. Первый параметр является обязательным и указывает путь и имя открываемого файла. Остальные параметры необязательны и определяют режимы открытия документа
Таблица Е.25. Свойства объекта Workbook
Свойство
Тип
Описание
ActiveChart
Объект
Ссылка на активную диаграмму
ActiveSheet
Объект
Ссылка на активный лист рабочей книги
AutollpdateFrequency
Integer
Период обновления документа в минутах (для документов с общим доступом)
AutoUpdateSaveChanges
Boolean
True — обновлять документ, если он был сохранен (для документов с общим доступом)
Таблица П1.25 (продолжение)
Свойство
Тип
Описание
BuiltinDocumentProperties
Объект
Свойства документа (см. диалог, зкрь卜 ваемый командой Свойства меню Файл
ChangeHistoryDuration
Integer
Количество дней, в течение которых необходимо хранить журнал изменений документа (для документов с общим доступом)
Charts
Коллекция I
Диаграммы рабочей книги
CodeName
String
Кодовое название (обозначение) рабочей книги. Обозначение может подставляться в макросах вместо описателя объекта
Colors
Коллекция
Цветовая палитра для данной рабочей книги
CommandBars
Коллекция
Панели управления
ConflictResolution
Integer
Способ решения конфликтов при совместном доступе к документу
CreateBackup
Boolean
True — создается и используется резервная копия рабочей книги
CustomDocumentProperties
Объект
Свойства документа (имя. значение и тип свойств), которые задает пользователь
Date 1904
Boolean
True— используется система дат, применяемая до 1904 года
DisplayDrawingObjects
Integer
Режим отображения графических объектов в документе
FileFormat
Integer
Формат файла загруженной рабочей книги
FullName
String
Полный путь и имя файла документа
HasPassword
Boolean
True — рабочая книга защищена паролем
KeepChangeHistory
Boolean
True — приложение Excel позволяет сохранять журнал изменений для рабочей книги с раздельным доступом
Mailer
Объект
Электронное письмо, его свойства и методы (текст, адрес и др.)
MultiUserEditing
Boolean
True — рабочая книга открыта в режиме раздельного доступа для нескольких пользователей
Name
String
Имя файла, в котором хранится документ
Names
Коллекция
Имена объектов активной рабочей книги
Path
String
Полный путь файла документа
Таблица П1.25 (окончание)
Свойство
Тип
Описание
PrecisionAsDisplayed
Boolean
True — точность числовых значений такая, как отображена в ячейках рабочей книги
ProtectStructure
Boolean
True — структура книги защищена от изменений
ProtectWindows
Boolean
True— окна рабочей книги защищены от изменений
Readonly
Boolean
True — документ открыт в режиме "только для чтения" и не может быть сохранен
ReadOnlyRecommended
Boolean
True— при открытии документа выводится диалог, рекомендующий пользователю открывать документ в режиме "только для чтения"
Saved
Boolean
True — после последнего сохранения документа в файле документ не был изменен
SaveLinkValues
Boolean
True — сохранение внешних связей в активном документе
Sheets
Коллекция
Листы рабочей книги
Styles
Коллекция
Стили, используемые для формирования рабочей книги
TemplateRemoveExtData
Boolean
True — удаление внешних связей при сохранении шаблонов
UpdateRemoteReferences
Boolean
True — обновление внешних связей в рабочей книге
UserStatus
Массив
Информация о пользователях, открывших рабочую книгу
VB Project
Коллекция
Проекты, включенные в состав шаблона или документа
Windows
Коллекция
Ссылки на активные окна открытой рабочей книги
Worksheets
Коллекция
Обеспечивает доступ к листам рабочей книги
WriteReserved
Boolean
True — документ защищен паролем для записи на диск
WriteReservedBy
String
Имя пользователя, который в настоящее время редактирует рабочую книгу
Таблица Е.26. Методы объекта Workbook
Метод
Описание
Activate
Активирует первое окно, связанное с документом
AddToFavorites
Добавляет документ в список избранных документов
Close (SaveChangesf FileName, RouteWorkbook)
Закрывает рабочую книгу. Необязательные параметры: SaveChanges — определяет, сохранять документ или нет, FileName — имя файла, в котором сохраняется документ, RouteWorkbook — позволяет отправить документ
DeteteNumberFormat
Удаляет числовой формат из рабочей книги. Параметром метода является строка, соответствующая удаляемому формату
ExclusiveAccess
Позволяет дать текущему пользователю исключительный доступ
NewWindow
Создает новое окно для заданной рабочей книги
Post
Отправляет по почте документ
Printout
Отправляет документ на печать. Параметры метода позволяют задать режим печати
PrintPreview
Открывает окно предварительного просмотра печати
Protect (Password, Structure, Windows)
Устанавливает защиту на документ. Параметры позволяют задать пароль и степень защиты
PurgeChangeHistoryNow
Удаляет все изменения в документе, сделанные ранее
RejectAIIChanges
Отклоняет все изменения в разделенном документе
Removellser
Отключает удаленного пользователя от рабочей книги
ResetColors
Устанавливает цветовую палитру в состояние по умолчанию
RunAutoMacros
Запускает макрокоманды, выполняющиеся при открытии, закрытии, активации и деактивации рабочей книги
Save
Сохраняет документ в файле
SaveAs (FileNameiString)
Сохраняет документ в файле с новым именем (имя файла —обязательный аргумент). Могут использоваться дополнительные аргументы, определяющие формат сохраняемого документа, режимы доступа и другие свойства
SaveCopyAs
Записывает в файл копию рабочей книги, не изменяя ее
SendMail
Создает письмо электронной почты с вложением в это письмо данного документа
Unprotect (Password: String)
Отменяет защиту, установленную для документа. В качестве параметра используется строка пароля, заданного при установке защиты на документ
Таблица ПЬ26 (окончание)
Метод
Описание
UnprotectSharing (Password:String)
Отменяет защиту для разделяемого документа и сохраняет его на диске
UpdateFromFile
Обновляет документ, читая его из файла на диске
UpdateLink
Обновляет связи документа MS Excel с внешними объектами
Лист рабочей книги Excel
Таблица П1.27. Свойства коллекций Worksheetst Sheets
Свойство
Тип
Описание
Count
Integer
Количество элементов коллекции Sheets рабочей книги
HpageBreaks
Коллекция
Горизонтальные разрывы листа на страницы
Item
Объект
Ссылка на лист рабочей книги. Параметром метода служит номер элемента в коллекции или имя листа рабочей книги
Parent
Объект
Ссылка на объект^ которому принадлежит коллекция Workbooks
VPageBreaks
Коллекция
Вертикальные разрывы листа на страницы
Таблица П1.28. Методы коллекций Worksheets, Sheets
Метод
Описание
Add
Создает новый лист. Необязательные параметры определяют положение создаваемого листа, количество и тип листов
Сору
Создает копии листов рабочей книги. Параметры метода определяют местоположение созданных копий
FillAcrossSheets
Копирует область, заданную аргументом метода, на такие же области других рабочих листов книги
Move
Перемещает выбранные листы в новое место, указанное в качестве аргумента метода
Printout
Осуществляет вывод на печать
Р ri ntP review
Открывает окно предварительного просмотра печати
Select
Выделяет листы рабочей книги
Таблица "129. Свойства объекта Worksheet
Свойство
Тип
Описание
Cells
Коллекция
Ячейки листа рабочей книги
CodeName
String
Кодовое название (обозначение) листа рабочей книги. Обозначение может подставляться в макросах вместо объекта-описателя
Columns
Коллекция
Столбцы листа рабочей книги
Comments
Коллекция
Список комментариев листа
ConsoJidationFu notion
Integer
Информация о функции, используемой для консолидации
Consolidation Opt io ns
Boolean
Информация об опциях консолидации
ConsolidationSou rces
String
Адрес исходных данных для консолидации
DisplayPageBreaks
Boolean
True — отображаются линии разделения листа на печатные страницы
EnableCalculation
Boolean
True — приложение Excel автоматически пересчитывает лист тогда, когда это требуется
HPageBreaks
Коллекция
「ормзонтальные разрывы листа на страницы
Hyperlinks
Коллекция
「иперссылки
Index
Integer
Номер (индекс) листа в коллекции Worksheets
Name
String
Имя листа рабочей книги
Names
Коллекция
Имена объектов листа
Next
Объект
Ссылка на следующий лист рабочей книги
PageSetup
Объект
Параметры страницы
Previous
Объект
Ссылка на предыдущий лист рабочей книги
ProtectContents
Boolean
True — содержимое листа защищено
P rotect D rawi ng Objects
Boolean
True — объекты листа защищены
ProtectScenarios
Boolean
True — сценарии защищены
Range
Объект
Ссылка на область ячеек листа рабочей книги
Rows
Коллекция
Строки таблицы листа рабочей книги
ScrollArea
String
Диапазон адресов, доступный пользователю для просмотра, ввода/аывода информации ячеек
Shapes
Коллекция
Надписи, рисунки, геометрические фигуры и другме фигуры на листе рабочей книги Excel
Таблица П1.29 (окончание)
Свойство
Тип
Описание
StandardHeight
Extended
Стандартная высота строк таблицы, используемая по умолчанию
Standardwidth
Extended
Стандартная ширина столбцов таблицы, используемая по умолчанию
Type
Integer
Тип листа рабочей книги
UsedRange
Объект
Ссылка на заполненную область листа рабочей книги
Visible
Boolean
Позволяет отобразить/скрыть лист рабочей книги (True — лист отображен)
VPageBreaks
Коллекция
Вертикальные разрывы листа на страницы
Таблица "乙 30. Методы объекта Worksheet
Метод
Описание
Activate
Активизирует лист рабочей khn「u MS Excel
Calculate
Рассчитывает все формулы в ячейках листа рабочей книги
ChartObjects
Возвращает объект, представляющий собой диаграмму. Аргумент метода — номер или имя диаграммы
CheckSpelling
Проверяет орфографию. Отображает окно для контроля и исправления ошибок. Если заданы параметры, то они определяют дополнительные условия: используемые словари, регистр символов, режим окна
Copy
Создает копию листа. Параметры метода определяют место, где будет создана копия
Delete
Удаляет лист
Evaluate
Преобразует имя объекта (ячейки), принадлежащего листу, в ссылку на этот объект. Параметром метода является строка, содержащая имя объекта (ячейки)
Move
Перемещает лист. Параметры метода определяют место, куда будет перемещен лист
OLEObjects
Возвращает OLE-объект. Параметр метода представляет собой номер или имя объекта
Paste
Вставляет содержимое буфера обмена в область листа рабочей книги
PasteSpecial
Вставляет текст из буфера обмена в заданную область. В отличие от метода Paste, данный метод позволяет управлять форматом вставляемого текста
Таблица П1,30 (окончание)
Метод
Описание
Printout
Выполняет печать листа. Если используются параметры, то они позволяют задать режимы и области печати
PrintPreview
Осуществляет предварительный просмотр листа рабочей книги
Protect (Password, DrawingObjects, Contents, Scenarios, UserlnterfaceOnly)
Устанавливает защиту на документ. Аргументы позволяют задать режим защиты и пароль
ResetAIIPageBreaks
Выполняет начальную установку вертикальных и горизонтальных линий разрывов листа на страницы
SaveAs(FileName:String)
Сохраняет рабочую книгу в файле с новым именем (имя файла — обязательный аргумент). Могут использоваться дополнительные аргументы, определяющие формат сохраняемого документа, режимы доступа и другие свойства
Scenarios
Возвращает сценарий, номер которого используется В качестве аргумента метода
Select
Выделяет содержимое листа рабочей книги
SetBackgroundPicture
Устанавливает рисунок в качестве фона листа. Аргумент метода указывает путь и имя графического файла
UnProtect
(Password: String)
Отменяет защиту, установленную для листа рабочей книги. В качестве параметра используется строка пароля, заданного при установке защиты
Таблица П1.31, Свойства объекта Range
Свойство
Тип
Описание
Address
String
Адрес области ячеек. Аргументы позволяют задать стиль адреса области
AddressLocal
String
Адрес области ячеек. Аргументы позволяют задать стиль адреса области
Borders
Коллекция
Свойства линий границы области
Cells
Объект
Ячейки области Range
Characters
Коллекция
Символы, составляющие текст области
Column
Integer
Номер первого столбца области Range
Columns
Коллекция
Столбцы области Range листа рабочей книги
Таблица П1.31 (продолжение)
Свойство
Тип
Описание
ColumnWidth
Extended
Ширина столбцов области Range
Comment
Объект
Комментарии для верхней левой ячейки области
Count
Integer
Количество ячеек области Range
End
Объект
Область (ячейка), которая находится в крайнем левом, правом, верхнем или нижнем положении на листе рабочей книги в этой области Range
Font
Объект
Шрифт текста области Range
Formula
String
Формула для расчета значений ячеек области Range
FormulaArray
String
Формула для массива ячеек области Range
FormulaHidden
Boolean
True — формула скрыта в защищенной рабочей книге или на защищенном листе
FormulaRICI
String
Формула в формате R1C1 для расчета значений ячеек области Range
HasArray
Boolean
True — область Range содержит массив формул
HasFormula
Boolean
True — область Range содержит формулу
Height
Extended
Высота области Range
HorizontalAlignment
Integer
Стиль 「ормзонтальнопэ выравнивания текста в ячейках области Range
IndentLevel
Integer
Отступ для текста в ячейках области
Interior
Объект
Свойства заливки области ячеек
Item
Объект
Ссылка на элемент коллекции
Left
Extended
Левая координата области Range
Locked
Boolean
True — позволяет заблокировать ячейку или область ячеек при условии, что защищен лист или книга
MergeArea
Объект
Область ячеек, объединенных в "одну ячейку*'. Возвращает объект Range, ассоциированный с областью ячеек до объединения
MergeCells
Boolean
True — область содержит объединенные ячейки
Next
Объект
Указывает на следующий объект коллекции. Если Range представляет собой ячейку, то свойство Next содержит ссылку на следующую ячейку листа
Таблица П1.31 fпродолжение)
Свойство
Тип
Описание
NumberFormat, NumberFormatLocal
String
Эти свойства устанавливают формат отображения числовых данных и данных типа "дата" в ячейках области (первое — на языке программы или макроса и едино для всех, второе — на национальном языке пользователя)
Offset
Объект
Область (объект типа Range), смещенную относительно текущей области. Величина смещения задается параметрами метода
Orientation
Integer
Угол наклона текста, отображаемого в ячейках. Величина этого угла может изменяться от -90 до 90 градусов
OutlineLevel
Integer
Уровень группировки для строк или столбцов таблицы листа рабочей книги
PageBreak
Integer
Вертикальный или горизонтальный разрыв листа; используется как свойство для строк или столбцов
Parent
Объект
Ссылка на объект, которому принадлежит область Range
Previous
Объект
Ссыпка на предыдущий объект коллекции. Если Range представляет собой ячейку, то Previous содержит ссылку на предыдущую ячейку листа
Resize
Объект
Область, местоположение которой определяется положением области Range, а размер определяется параметрами объекта Resize
Row
Integer
Номер первой строки, принадлежащей области Range
RowHeight
Extended
Высота строк, принадлежащих области Range
Rows
Коллекция
Строки области Range рабочей книги
ShrinkToFrt
Boolean
True — текст автоматически сжимается до такой степени, чтобы разместиться в заданных размерах ячейки
Style
String
Стиль текста, используемый для области ячеек рабочей книги
Text
String
Текст, отображаемый в ячейках области рабочей книги
Top
Extended
Верхняя координата области Range
UseStandard Height
Boolean
Тrue — стандартная высота строк
UseStandardWidth
Boolean
True — стандартная ширина столбцов
Таблица П1.31 (окончание)
Свойство
Тип
Описание
Value
Variant
Значение ячейки или массив значений области ячеек
Value2
Variant
Значение ячейки
VerticalAlignment
Integer
Стиль вертикального выравнивания текста в ячейках области Range
Width
Extended
Ширина области Range
Worksheet
Объект
Ссылка на лист рабочей книги, которому принадлежит область ячеек Range
WrapText
Boolean
True — текст в ячейках области будет записан с переносом слов на новую строку, если ширина текста превышает ширину ячейки
Таблица П1.32. Методы объекта Range
Метод
Описание
Activate
Активизирует объект. Если применяется к области ячеек Range, то выделяет область
AddComment
Добавляет текст примечания к ячейке. Аргументом служит строка текста
AdvancedFilter
Устанавливает расширенный фильтр
ApplyNames
Устанавливает имена ячеек
ApplyOutlineStyles
Устанавливает типы линий границ
AutoFill
Производит автоматическое заполнение ячеек диапазона
AutoFilter
Устанавливает автоматический фильтр
AutoFrt
Автоматически устанавливает ширину столбцов таблицы в зависимости от содержимого ячеек
AutoFormat
Задает формат ячеек. Аргументы метода определяют формат и шрифт текста
BorderAround
Задает свойства линии границы области, В параметрах метода передаются тип, цвет и толщина линии границы
Calculate
Вычисляет результат ма¥емат(лнеско「о выражения, содержащегося в ячейках заданной области
CheckSpelling
Проверяет орфографию для данной области. Отображает окно для контроля и исправления ошибок. Если заданы параметры, то они определяют дополнительные условия: используемые словари, регистр символов, режим окна
Таблица П1.32 (продолжение)
Метод
Описание
Clear
Очищает содержимое и формат ячеек области
ClearComments
Очищает комментарии для ячеек области
ClearContents
Очищает только содержимое, оставляя формат ячеек без изменения
ClearFormats
Очищает формат ячеек области
ClearNotes
Очищает примечания
ColumnDifferences
Возвращает область в столбце таблицы, ячейки которой содержат данные, отличные от значения ячейки того же столбца (эту ячейку задает параметр метода)
Consolidate
Объединяет данные
Copy
Копирует данную область (объект Range со всеми свойствами) в буфер обмена
Copypicture
Копирует область Range в буфер обмена в виде рисунка
CreateNarnes
Создает имена для ячеек на основе текста — содержимого соседних ячеек
Cut
Помещает данную область в буфер обмена, затем очищает область при выполнении команды Paste
Delete
Удаляет заданную область из документа
FillDown
Заполняет ячейки области сверху вниз, копируя содержимое верхних ячеек в следующие ячейки диапазона
FilILeft
Заполняет ячейки области справа налево, копируя содержимое правых ячеек а следующие ячейки диапазона
FillRight
Заполняет ячейки области слева направо, копируя содержимое левых ячеек в следующие ячейки диапазона
FillUp
Заполняет ячейки области снизу вверх, копируя содержимое нижних ячеек в следующие ячейки диапазона
Find
Осуществляет поиск данных в заданной области. Аргументы метода задают шаблон и режим поиска. Метод возвращает ссылку на область, содержащую искомые данные
FindNext
Повторяет поиск, возвращает ссылку на следующую область
FindPrevious
Повторяет поиск, возвращает ссылку на предыдущую область
FunctionWizard
Открывает диалог мастера функций
Insert
Вставляет ячейки. Параметры метода определяют направление смещения ячеек
Таблица П1.32 (окончание)
Метод
Описание
Justify
Перестраивает текст таким образом, чтобы он равномерно заполнил видимую часть ячеек
Merge
Объединяет ячейки заданной области, если аргумент метода имеет значение True, иначе — разъединяет объединенные ячейки
NoteText
Вставляет или изменяет примечание для ячейки
Parse
На основе содержимого столбца по заданным правилам формирует данные и распределяет их в разные столбцы. Аргументы метода задают правила и местоположение формируемых данных
PasteSpecial
Вставляет текст из буфера обмена в заданную область. В отличие от метода Paste данный метод позволяет управлять форматом вставляемого текста
Printout
Отправляет содержимое области на печать. Параметры метода позволяют задать режим печати
PrintPreview
Осуществляет предварительный просмотр печатм области
Replace
Осуществляет поиск и замену данных в области Range
RowDifferences
Возвращает область в строке таблицы, ячейки которой содержат данные, отличные от значения ячейки той же строки (параметр метода задает эту ячейку)
Select
Выделяет содержимое области
Sort, SortSpecial
Сортируют содержимое ячеек области
SpecialCells
Возвращает область ячеек, соответствующих определенному типу (текст, формулы, примечание и др.)
UnMerge
Разъединяет объединенные ячейки
Таблица П1.33. Свойства объекта Font
Свойство
Тип
Описание
Background
Integer
Характеристика прозрачности фона текста
Bold
Boolean
True — символы шрифта имеют полужирное начерта* ние
Color
Integer (tcolor)
Значение цвета в формате RGB
Colorindex
Integer
Индекс цвета в палитре цветов
Fontstyle
String
Стиль шрифта
Italic
Boolean
True — курсивное начертание символов
Таблица П1.33 (окончание)
Свойство
Тип
Описание
Name
String
Наименование шрифта
OutlineFont
Boolean
True — шрифт не изменяется при изменении стиля документа
Parent
Объект
Ссылка на объект, для которого выбирается шрифт
Shadow
Boolean
True — символы текста отображаются с тенью
Size
Integer
Размер шрифта
Strikethrough
Boolean
True — символы текста зачеркнуты
Subscript
Boolean
True — символы текста отображаются в виде нижнего индекса
Superscript
Boolean
True — символы текста отображаются в виде верхнего индекса
Underline
Integer
Стиль подчеркивания текста
Таблица П1.34. Свойства объекта FHIFormat
Свойство
Тип
Описание
BackColor
Integer (tcolor)
Цвет фона, или второй цвет для градиентной эаливки( или цвет фона узора (штриховки) по* верхности
ForeColor
Integer (tcolor)
Цвет штриховки или первый цвет для градиентной заливки поверхности
GradientColorT уре
Integer
Тип цветового градиента
GradientDegree
Extended
Определяет, в какой тон цвета переходит цвет одноцветной градиентной заливки; может иметь значение в пределах от 0 до 1 (плавное изменение от черного цвета до белого)
Gradientstyle
Integer
Направление градиента
GradientVariant
Integer
Один из четырех возможных вариантов направления градиента
Parent
Объект
Ссылка на объект, которому принадлежит заливка
Pattern
Integer
Узор заливки
P re setG rad ie ntType
Integer
Одна из возможных заготовок градиента
PresetTexture
Integer
Один из возможных образцов текстур
Таблица П1.34 (окончание)
Свойство
Тип
Описание
TextureName
String
Имя текстуры, если она выбрана в списке образцов текстур
TextureType
Integer
Тип текстуры (одноцветная, двухцветная или образец)
Transparency
Extended
Может иметь значение в пределах от 0 до 1 и определяет прозрачность заливки
Type
Integer
Тип заливки (градиентная, текстура, узор и др.)
Visible
Boolean
False — заливка становится полностью прозрачной
Таблица П1.35. Методы объекта FillFormat
Метод
Описание
OneColorGradient
Устанавливает одноцветную градиентную заливку
Patterned
Устанавливает узор заливки поверхности
PresetGradient
Устанавливает один из возможных заготовленных вариантов градиента
PresetTextured
Устанавливает один из возможных образцов текстуры
Solid
Устанавливает одноцветную заливку (без градиента и текстуры)
TwoColorG radient
Устанавливает двухцветную градиентную заливку
UserPicture
Использует в качестве заливки рисунок из графического файла. Аргумент метода — путь и имя графического файла
UserTextured
Использует в качестве текстуры рисунок из графического файла. Аргумент метода — путь и имя графического файла
Таблица "7.36. Свойства объекта LineFormat
Свойство
Тип
Описание
BackColor
Integer (tcoior)
Цвет фона для линии, тип которой — узор (штриховка)
Beg i nArrowhead Le ngth
Integer
Длина стрелки в начале линии
BeginArrowheadStyle
Integer
Стиль стрелки в начале линии
BeginArrowheadWidth
Integer
Толщина стрелки в начале линии
Таблица П1.36 (окончание)
Свойство
Тип
Описание
DashStyle
Integer
Шаблон линии (сплошная линия, варианты штрихпунктирных линий)
EndArrowheadLength
Integer
Длина стрелки в конце линии
EndArrowhead Style
Integer
Стиль стрелки в конце линии
EndArrowheadWidth
Integer
Толщина стрелки в конце линии
ForeColor
Integer (tcolor)
Цвет узора (штриховки) или цвет линии
Parent
Объект
Ссылка на объект, которому принадлежит линия
Pattern
Integer
Шаблон линии
Style
Integer
Стиль (тип) линии (обычная, двойная толстая + тонкая, двойная тонкая + толстая и т. п.)
Transparency
Extended
Прозрачность линии (может иметь значение в пределах от Одо 1)
Visible
Boolean
False — невидимая линия
Weight
Integer
1 Толщина линии
ПРИЛОЖЕНИЕ 2
Ответы на вопросы
В этом приложении даны ответы на типичные вопросы, возни кающие при работе с документами MS Office в среде Delphi.
Как подключиться
к выполняющемуся приложению Excel?
Во всех предыдущих примерах мы создавали объект Application с помощью функции CreateOIeObject. Это влекло за собой запуск соответствующего приложения MS Office. Но когда приложение запушено и требуется создать объект, который будет ссылаться на это приложение, нужно использовать функцию GetActiveOleObject, возвращающую ссылку на объект, класс которого описан в строке — единственном аргументе этой функции. Следующий пример демонстрирует использование данной функции.
[Подключение к выполняющемуся приложению MS Excel
procedure TForml. ButtonlClick (Sender: TObject);
begin
E:=GetActiveOleObject(TExcel.Application*);
E. Visible:=True;
end;
В приложениях Delphi, предназначенных для работы с документами MS Office, лучше использовать не одну функцию GetActiveOleObject, а пару функций GetActiveOIeObject и CreateOIeObject. Это позволит при отсуз'ствии открытых приложений обработать ошибку и открыть приложение для работы с документами. Следующая процедура позволяет запустить приложение MS Office, если оно до этого не было активным.
i Запуск неактивного приложения MS Office
procedure TForml.Button2Click(Sender: TObject); begin try
E: =GetActive01e0bj ect (* Excel. Application1); except
E:^CreateOleObject(*Excel.^plication'); end;
E. Visible: ==Тгие; end;
Описанный способ использования приложений MS Office н проектах Delphi является более экономичным и гибким и избавит пользователя от лишних манипуляций.
Как освободить память
после окончания работы в Excel?
0
Если я открываю Excel из моей /уюарпммы, а потом закрываю его и даже делаю Quit, то все равно, пока совсем не закрою мою программу, не могу открыть ни один файл ExceL Как решить эту проблему?
Для освобождения памяти после закрытия Excel с помощью метода Quit используйте такой оператор:
Е: =UnAs signed;
Он освобождает ссылку и память от объекта Application. Используйте следующий фрагмент исходного текста в свонх приложениях.
:Освобождение памяти по окончании работы с Excel
E.Quit;
Е: ^UnAs signed;
Как вставить в документ Word рисунок, не перемещая текст?
Мне потребовалось вставить рисунок е документ Word, не раздвигая текст (перед текстом или за текстом), По логике должно быть какое-то свойство, но найти его не смогла.
Эту проблему можно решить путем использования объектов коллекции Shapes. Объекты коллекции Shapes могут использовать в качестве заливки рисунки, загружаемые из файла. Другим свойством этих объектов является то, что их можно разместить как перед текстом, так м за текстом документа Word. Следующий фрагмент программы с помощью этих свойств помещает рисунок за текст документа Word (в примере сначала вставляется текст, а затем рисунок).
Рис. П2Л. Рисунок размещен в документе Word за текстом
Вставка рисунка в документ Word без перемещения текста
const
msoTextOrientationHorizontal=l;
msoSendBehindText^5;
var W:variant;
procedure TForml.ButtonlClick(Sender: TObject);
begin
W: -CreateOleObject (1 Word.^plication1);
W.Visible:^True;
W. Documents. Add;
W. Selection. range: = 'Записью超ем текст в документ1; end;
procedure TForml.Button2Click(Sender: TObject);
begin
W. Active Document. Shapes .AddShape (msoTextOrientat ionHorizontal, 80, 60. 120, 100);
W.ActiveDocument.Shapes.Item(l) .ZOrder (msoSendBehindText);
W.ActiveDocument.Shapes. Item(l).Fill.UserPicture ('C: \Mq* документы、PARFOMER工VA.JPG,) end;
Результат представлен на рис. П2.1.
Как выбрать масштаб отображения документа Word?
И
Одной из решаемых мной задач в разрабатываемом приложении было создание выходной формы s Word. Пользователю потребовалось добавить функцию масштабирования отображения документа (чтобы он мог задавать любой масштаб, например, 100 % иди 75 % или 50 %). Как выбрать масштаб?
Масштаб отображения окна документа является свойством объекта View, определяющего режимы отображения области окна. Программно можно задать масштаб, определив его в процентах от нормальной величины. Для этого используется свойство Percentage объекта Zoom. Данное свойство имеет тип Integer и может принимать значения от 10 до 500.
Рассмотрим пример процедуры.
Изменение масштаба отображения документа
procedure TForml.Button3Click(Sender: TObject); begin
W. Act iveWindow. ActivePane .View. Zoom. Percentage: =SpinEditl .Value; end;
На рис, П2.2 представлен результат использования свойства Percentage.
Для того чтобы задать один из наиболее удобных и часто используемых масштабов, можно воспол ьзоваться свойством Page Fil объекта Zoom. В этом случае масштаб автоматически рассчитывается и устанавливается таким образом, чтобы одна страница могла разместиться в активном окне целиком.
Этот режим задается путем записи значения коисганты wdPageFitFullPage в свойство PageFit. Чтобы автоматически задать другой масштаб отображения, когда ширина отображаемой страницы приравнивается ширине окна, в свойство PageFit необходимо записать значение константы wd Page Fit Best Fit. Для отключения режима автоматического масштабирования в свойство PageFit записывается константа wdPageFitNone. Реализация способа автоматического масштабирования представлена в виде следующей процедуры.
Рис. П2.2. Задаем масштаб отображения документа
Задание режима автоматического масштабирования
procedure TForml•PageFitChange(Sender: TQbject); begin
W. ActiveWindow>ActivePane. View. Zoom. PageFit :=PageFit * Itemindex; end;
Есть еще один способ, позволяющий косвенно задавать масштаб отображения документа. Этот способ основан на использовании свойств PageColumns и Page Rows объекта Zoom, позволяющих задать количество одновременно отображаемых страниц документа в одном окне. Значение свойства
PageColunins определяет количество страниц, размещенных по ширине активного окна, а значение свойства Page Rows — количество страниц, размещенных по высоте активного окна. Таким образом, общее количество страниц будет определяться величиной PageColunins х Page Rows. Очевидно, что количество одновременно отображаемых страниц влияет на масштаб отображения страниц документа.
:Задание количества одновременно отображаемых страниц по ширине окна
procedure TForml.SpinEdi12Change(Sender: TObject); begin
if SpinEdit2.Value<l then exit;,
W. Activewindow. Ac tiveFane. View. Zoom* PageColumns: «SpinEdit2 .Value; end;
procedure TForml.SpinEdit3Change(Sender: TObject); begin
if SpinEdit3.Value<l then exit;
W« ActiveWindow.ActivePane.View.Zoom.PageRows:«SpinEdit3.Value; end;
Результат выполнения описанных процедур представлен на рис, П2.3.
Рис. П2.3. Задаем масштаб отображения путем задания количества страниц
Как добавить новую страницу в документ Word?
Для того чтобы вставить новую страницу в документ Word, используйте ме* тод InsertBreak объекта Range с параметром Type :=wd Page Break. Новая страница вставляется в область, заданную объектом Range, поэтому от положения этого объекта зависит то, будет новая страница добавлена в конец документа или сплошной текст будет разорван и размещен на разных страницах. Для того чтобы добавить страницу в конец документа, можно использовать метод InsertBreak объекта Range, указывающий на последний символ документа.
;Добавление страницы в конец документа
const wdPадeBrеак=7;
var W:variant;*
procedure TForml* Button3Click(Sender: TObject); begin
W. Act i veDocument * Range (W. Ac t ive Document. Range. end-1).」 InsertBreak(Type:=wdPageBreak);
end;
Другой способ более универсален. Перемещаем курсор в конец документа и вызываем метод InsertBreak объекта Selection. Этот способ применим и для того, чтобы вставить страницу, разорвав текст в середине документа. Перед использованием этого способа необходимо разместить курсор в том месте, где требуется вставить страницу. Для этого можно выбрать любой способ, напрммер поиск фрагмента текста в документе. Следующие две процедуры демонстрируют то, как работает этот способ. Вторая процедура отличается от первой тем, что сначала выделяется искомый фрагмент, а затем вызывается метод InsertBreak объекта Selection. Это является избыточным, но наглядным как пример.
Добавление страницы в разрыв текста документа
procedure TForml.Button4Click(Sender: TObject);
var myRange:variant;
begin
myRange:&W.ActiveDocument.Range;
myRange・ Find.Execute(FindText: = ,my1, Forward:=True);
if myRange.Find.Found Then myRange.InsertBreak(Type:=wdPageBreak); end;
procedure TForml.Buttcn4Click(Sender: TObject);
uar myRange:variant;
begin
myRange:=W* ActiveDocument.Range;
myRange. Find • Execute (FindText:='my', Forward: =True);
if myRange.Find.Found then begin
myRange.select;
W.Selection.InsertBreak(Type:=wdPageBreak);
end;
end;
Как пронумеровать страницы в документе Word?
Номера страниц представляют собой элементы коллекции PageNumbers. Сама коллекция PageNumbers являются свойством элемента коллекции Headers, п редставля ю те го собой верхний колонтитул страницы, или элемента коллекции Footers (нижний колонтитул страницы). Если документ имеет более одного раздела, то нумерацию можно создать отдельно для каждого раздела. При создании нумерации страниц можно выбрать вариант пространственного размещения номера страницы и порядок нумерации первой страницы.
Новая нумерация страниц создается с помощью метода Add(PageNum- berAligiimeiitiinteger, First Page: Boolean) коллекции PageN umbers. Первый аргумент этого метода определяет выравнивание номера страницы по горизонтали, второй аргумент ——наличие номера на первой странице документа (Тrue) или его отсутствие (False).
Для создания нумерации страниц в верхнем колонтитуле используем следующую процедуру.
:Размещение номеров страниц в верхнем колонтитуле
procedure TFoml<Button3Click (Sender: TObject);
var mySection:variant;
myPageNumber:variant;
myPageNumbers:variant;
begin
mySection: =W * Act iveDocument. Range. Sections * item (1);
MyPageNumbers: ==mySection.Headers. itemfl}. PageNumbers;
MyPageNumber: =mySection. Headers. item (1) * PageNumbers.
Add (PageNuniberM ignment: ^wdAlignPageNumberRight, Fi rstPage: ^True) end;
Для создания нумерации в нижнем колонтитуле страницы используем элемент коллекции Footers и его свойство — PageNumbers.
:Размещение номеров страниц в нижнем колонтитуле
procedure TForml.Button4Click(Sender: TObject);
var mySection:variant;
begin
mySection: =W. ActiveDocument. Range. Sections. item (1);
MyPageNunibers: mySection*Footers. item(1) . PageNumbers;
MyPageNuniber: ==mySection. Footers. item (1) . PageMumbers ・ Add J
(PageNumberAlignment: =wdAlignPageNumberRight, Fir st Page: =True); end;
В представленных процедурах ссылка mySection указывает на первый раздел документа, для которого будет создана нумерация (документ не может иметь меньше одного раздела). Второй оператор предоставляет доступ к коллекции PageNumbers, средствами которой мы создаем новую нумерацию (третий оператор).
Рии П24 Изменяем стиль и горизонтальное выравнивание номеров страниц
Стиль созданной нумерации страницы можно изменить. Для этого воспользуемся объектами, ссылки на которые были получены во время ее создания. С их помощью изменим горизонтальное выравнивание номеров страниц и их стиль.
:Задание горизонтального выравнивания и стиля номеров страниц
procedure TForml. AlignmentChange (Sender: TObj ect); begin
MyPageNumber < Alignment: =Aligmnent * Itemindex; end;
procedure TForrnl • PageNuiriberStyleChange (Sender: TObject);
begin
MyPageNuiribers.NuimberStyle: =PageNumberStyle* Itemindex; end;
На рис. П2.4 представлен результат выполнения процедур создания и изменения выравнивания н стиля номеров страниц.
Как изменить положение таблицы по горизонтали?
Я пробовал задать Alignment для таблицы разными способами:
W. ActiveDocument. Tables * Item(Table) , Select;
sel_:-W.selection;
sel_.Range, ParagraphFonnat.Alignment : = align;
W.ActiveDocument,Tables .Item(Table) .Range. ParagraphFormat * Alignment;
Но почему-то получается задать Alignment для ячеек, а не для самой таблицы.
Если выделить таблицу п изменить свойство Alignment объекта Selection, то изменится положение содержимого ячеек. Также если выделить не всю таблицу, а несколько ее ячеек, и изменить свойство Alignment объекта Selection, то будет изменено выравнивание содержимого выделенных ячеек. Изменить выравнивание самой таблицы можно с помощью свойства Alignment коллекции Rows выбранной таблицы. Когда требуется изменить выравнивание только выбранной строки, нужно изменить значение свойства Alignment для этой строки. С помощью оператора
W. Active Document, Tables (Table) . Rows • Al ignment: -align;
мы добиваемся изменения положения таблицы с помощью выравнивания по горизонтали.
:Изменение выравнивания таблицы и первой строки таблицы
procedure TForntl. alignChange {Sender: TObject); begin
W * ActiveDocument * Tables ・ Itm (1). Rows. Alignment: =align. Itemlndex; end;
procedure TForml.alignrChange(Sender: TObject);
begin
W.ActiveDocument.Tables.Item(l) .Rows.Item(l) ,Aligment:=alignr.Itemlndex; end;
Результат использования представленных процедур показан на рис. П25 Первая строка таблицы выровнена по центру, оставшаяся часть таблицы —— по правому краю.
Рис. П2.5. Изменение выравнивания таблицы и ее первой строкиРис. П2.5. Изменение выравнивания таблицы и ее первой строки
Рис. П2.5. Изменение выравнивания таблицы и ее первой строки
Рис. П2.5. Изменение выравнивания таблицы и ее первой строки
16 Зак 72m
Как решить проблему с добавлением новой таблицы в документ Word?
Ш
Есть рабочая книга Excel, s ней ——“Лист 7м с выполненным шаблоном. Этот лист нужно перенести/скопироватъ s "Лист 2二 6 этой же книге. В Excel все идет нормально, а ш Delphi не получается.
Таблицу в новом документе можно создать с помощью метода Add коллекции Tables.
:Создание таблицы в новом документе
MyRange: =W. ActiveDocument • Range;
W,ActiveDocument.Tables * Add(Range:-MyRange, NumRows:=2,NumColumns:=2 "
Если пытаться создать таблицу в документе этим способом после того, как ранее была создана хотя бы одна таблица, возникнет ошибка, связанная с использованием первого аргумента метода Add, который определяет область, где будет создана таблица. В приведенном варианте такой областью является весь документ ——но поскольку таблица не может быть создана внутри таблицы, возникает ошибка. Для решения этой проблемы необходимо определить область создания новой таблицы за пределами таблиц, созданных ранее.
Создание таблицы в конце документа
var MyRange:variant;
MyRange: =W. Active Document * Range (W. Active Document. Range. End-工,
W.ActiveDocument.Range * End-1);
W. ActiveDocument.Tables. Add (Range: =M^ange,NuwRows :=2,NumColumns :^2);
В этом случае объект MyRange указывает на конец документа, где нет ни одной созданной ранее таблицы.
Как решить типичную проблему настройки размеров диаграммы?
0
У меня возникла проблема с диаграммами. Пишу на Delphi 6, MS Office 2000. Создаю диаграмму, затем пытаюсь изменить ее координаты и размеры, “о возникает ошибка.
Вот мой обработчик события:
procedure TGraph.ExcelExportClick(Sender: TObject); var
Excel,WorkBook,Sheetl/Sheet2,Chart:variant;
ChartNaine: string;
Sheet, SeriesCollection:Variant;
vrange: variant;
if j:integer;
begin
// Создаем экземпляр объекта автоматизации
Excel: ^reateOleObj ect (' Excel. Application');
Excel,Visible:=true;
Excel.SheetsInNewWorkbook ;= 2; // Количество листов в создаваемой книге
Workbook:=Excel.Workbooks.Add; // Создание новой рабочей книги
Sheetl:-WorkBook.Worksheets[1];
Sheet2:=WorkBook4Worksheets[2];
Cha rtName: =Excel > Chart s. Add. Name; / / Создание новой диаграмглы
// А далее при попытке поменять любое свойство диаграммы возникает
// ошибка типа "Нельзя установить свойство Left класса ChartArea" // и т, д. для всех свойств.
Excel.Charts * Item[ChartName]・ ChartArea.Left:=10;
Excel.Charts♦Item[ChartNameJ ・ChartArea.Top:^10;
Excel.Charts. Item[ChartNaine].ChartArea.Width: =20;
Excel.Charts・Item[ChartName].ChartArea.Height:=20;
Excel.Charts.Item [ChartName].HasTitle: *=true;
Excel. Charts. Item[ChartName].ChartTitle.Text: = *XXX1;
Что-то здесь 〃e так. Подскажите, e чем дело.
Диаграмма создается на отдельном листе, поэтому изменить ее размеры и положение нельзя, это не имеет смысла. Для включения заголовка необходимо определить область данных для диаграммы и только после этого включать заголовок.
Вот текст программы.
;Создание диаграммы, определение области данных и включение заголовка
uses ComObj;
var Exce1:var iant;
Sheet1r Sheet2:variant;
WorkBook:variant;
ChartName: string;
procedure ТForml.ButtonlClicк(Sender: TObject);
begin
Excel: =CreateOleObject {1 Excel.Application1);
Excel .Visible :=true;
Excel.SheetsInNewWorkbook := 2;
WorkBook:=Excel.Workbooks.Add;
Sheet1:=WorkBook.Worksheets[1];
Sheet2:=WorkBook.Worksheets[2];
ChartName:^Excel.Charts .Add.Name;
// Задаем область данных диаграммы
Excel.Charts.ItemtChartName].Seriescollection.
Add(Source:=Sheetl* Range(* D4:DI2']);
Excel.Charts.Item[ChartName].HasTitle:=True;
Excel.Cha rts.Item. [ ChartName].ChartTitle.Characters.Text:^1XXXf;
end;
В результате выполнения данной процедуры будет создана диаграмма и изменен заголовок в том случае, если задана область данных диаграммы.
Как копировать лист в Excel?
_ j! Есть рабочая книга Excel, в ней — "Лист /"с выполненным шаблоном. 3 Этот лист нужно перенести/скопировать е нЛист 2", s этой же книге. 6 Excel все идет нормально, ь из Delphi не получается.
Копирование одного листа рабочей книги выполняется методом Сору элемента коллекции Sheets. Этот метод копирует, создает полную копию выбранного листа со всеми элементами настроек и всей информацией в ячейках таблицы.
:Копирование листа рабочей книги
procedure TForml.Button2Click(Sender: TObject);
begin
Excel* sheets.item[глист11].copy end;
В представленном примере копия листа рабочей книги по умолчанию создается в новой рабочей книге. Чтобы создать копию листа в той книге, где находится оригинал, необходимо использовать метод Сору с параметром, представляющим собой ссылку на лист, рядом с которым необходимо поместить копию. Следующие два примера создают копии листа в той же ра-
Ответы на вопросы 469 бочей книге, где находится копируемый лист, и располагают их после или до оригинала.
:Расположение копий листа после или до оригинала
procedure TForml.ButtonlClick(Sender: TObject);
begin
MySheet :>=Excel. sheets * item[ глист11 ];
MySheet *copy〈 after:=raysheet);
end;
procedure TForml.ButtonlClick(Sender: TObject);
begin
MySheet:=Excel.sheets.item[глист1'];
MySheet.copy(Before: =mysheet);
end;
Результат выполнения данных процедур представлен на рис. П2.6.
Рис. П2.6. Создаем копии листа рабочей книги
Как обратиться к существующей диаграмме в открытой книге?
0
Уже несколько лет делаю sc巴 отчеты с Delphi через Excel. Сейчас проблема ——есть шаблон с подготовленной диаграммой, “ не знаю, как к ней обратиться.•
Когда раньше создавал ее сам (из программы), проблем не было, а вот до уже существующей 井"листе диаграммы почему-то не достучаться — все ошибки получаются, если 〃。индексу или по имени (как s макросах Excel сам ее называет). Мне надо максимальное значение шкалы У установить на заданную величину. Вот фрагмент кода:
XLApp: =Excel_TLB. СоАрр 1 i cat i on_. Create;
WorkBks:=XU^3p.WorkBooks as WorkBooks;
WorkBks :=XLApp. WorkBooks;
Workbk:=XLApp.Workbooks•Add(ExtractFilePath(ParamStr(0))+
'Shablon\pareto.xlt', 0);
ASheets:=Workbk.Worksheets;
Worksheet: ==ASheets. Item [1 изделия1 j as __Worksheet;
// А дальше все ошибки при разных вариантах
// AChart: =ASheets.Item[1 Диаграмма!1 ] as Chart;
// AChart: =XLApp・Workbooks * Item[1] .Charts [1] As Chart;
// AChart: =WorkSheet.Chartobjects (1 Диагр. 1 *,EnptyParam) As Chart;
Доступ к созданным ранее диаграммам обеспечивается через элементы коллекции ChartObjects с помощью позднего связывания. В свою очередь эта коллекция принадлежит листу рабочей книги. Посредством свойств и методов этой коллекции мы получаем список диаграмм, а затем, используя имя или индекс диаграммы, получаем доступ к выбранной диаграмме.
;Получение списка диаграмм
procedure TForml.Button2click(Sender: TObject);
var a_:integer;
begin
ListBoxl. Items • Clear;
for a_:=l to E.ActiveWorkBook.ActiveSheet*ChartObjects.Count do begin ListBoxl * Items .Add (E * Act iveWo rkBook, ActiveSheet.
Chartobjects. Item[a_] .name);
end;
end;
На основании списка диаграмм, предварительно загруженного в компонент ListBoxl, получаем ссылку на диаграмму, выбранную пользователем, и изменяем ее свойства.
j Получение доступа к существующей диаграмме и изменение ее свойств
procedure TForml. ListBoxlClick (Sender: TObject); begin
Chart: =E. ActiveWorkBook * ActiveSheet. Cha rtObj ects.
Item[ListBoxl. Itemlndex+ll; end;
procedure TOKBottomDlg2. SpinEditl Change (Sender; TObject); begin
Chart•Left:=SpinEdit1,Value;
end;
procedure TOKBottomDlg2.SpinEdit2Change(Sender: TObject); begin
Cha rt * Top: ==SpinEdit2 * Value; end;
Как в выбранной ячейке таблицы документа Word писать снизу вверх?
Для того чтобы изменять направление текста, используйте свойство Orientation объекта Range, если этот объект связан с областью ячейки или областью выбраниькх ячеек. Алгоритм построения приложения в данном случае выглядит так: сначала определяем ссылку на объект Range выбранной ячейки для заданной таблицы, затем изменяем свойство самого объекта Range.
;Изменение направления текста в ячейке таблицы документа Word
procedure TForml .Button3Click(Sender: TObject); begin
Range: =W.ActiveDocument.Tables. Item(1) ,Cell {1Д) .Range;
Range * Text:s 1 Как в вь^ранной ячейке таблицы документа Word писать 」 снизу вверх?1;
end;
procedure TForml.TextOrientationChange (Sender; TObject); begin
case TextOnentation. Itemindex of
0:Range・ Orientation:=wdTextOrientationHorizontal;
1:Range.Orientation:=wdTextOrientationUpward;
2:Range.Orientation:=wdTextOrientationDownward;
end;*
end;
Выполняя данные процедуры, получим результат, представленный на рис. П2.7.
W Microsolt Wsd - Докдмент!W Microsolt Wsd - Докдмент!「恩 Файл Црадко Дид Вставка Формат 匸叩вне Х^^з &кн。?「恩 Файл Црадко Дид Вставка Формат 匸叩вне Х^^з &кн。?』中电日每0学J. -1臨勺G-'』中电日每0学J. -1臨勺G-')j Обычный » Times New Reman •'IQ)j Обычный » Times New Reman •'IQ可 IKI% » 国 Просгм кнопка可 IKI% » 国 Просгм кнопка▲Si为▲Si为膿電,囹为氐覧w _:» ■ ^ и匕三卓車'□•/▼& •.相「忌 И - ЙИП£膿電,囹为氐覧w _:» ■ ^ и匕三卓車'□•/▼& •.相「忌 И - ЙИП£dxdaCQm 更HQ S5SB р」ом EEH3SAXOH вёю^н $X«QBK1s 0HHEd9IqCQ^1dxdaCQm 更HQ S5SB р」ом EEH3SAXOH вёю^н $X«QBK1s 0HHEd9IqCQ^1Рис. П2.7* Изменяем направление текста в ячейке таблицыРис. П2.7* Изменяем направление текста в ячейке таблицы
W Microsolt Wsd - Докдмент!
W Microsolt Wsd - Докдмент!
「恩 Файл Црадко Дид Вставка Формат 匸叩вне Х^^з &кн。?
「恩 Файл Црадко Дид Вставка Формат 匸叩вне Х^^з &кн。?
』中电日每0学J. -1臨勺G-'
』中电日每0学J. -1臨勺G-'
)j Обычный » Times New Reman •'IQ
)j Обычный » Times New Reman •'IQ
可 IKI% » 国 Просгм кнопка
可 IKI% » 国 Просгм кнопка
▲Si为
▲Si为
膿電,囹为氐覧w _
:» ■ ^ и匕三卓車'□•/▼& •
.相「忌 И - ЙИП£
膿電,囹为氐覧w _
:» ■ ^ и匕三卓車'□•/▼& •
.相「忌 И - ЙИП£
dxdaCQm 更HQ S5SB р」ом EEH3SAXOH вёю^н $X«QBK1s 0HHEd9IqCQ
^1
dxdaCQm 更HQ S5SB р」ом EEH3SAXOH вёю^н $X«QBK1s 0HHEd9IqCQ
^1
Рис. П2.7* Изменяем направление текста в ячейке таблицы
Рис. П2.7* Изменяем направление текста в ячейке таблицы
Как заполнять ранее созданные надписи книги Excel из проекта Delphi?
@
Есть некоторый шаблон 8 формате Excel, е котором уже вставлены надписи. Требуется заполнять эти надписи данными из программы на Delphi. Здесь встает вопрос: как обратиться к уже существующим надписям? Я делаю следующее.
Включаю s Excel запись макроса, заполняю надпись текстом. По строке макроса, например ActiveSheet.Shapes('Текст 9r).Select, узнаю имя надписи.
В Delphi пишу:
.ActiveWorkBook*ActiveSheet. Shapes (1 Текст 91) .Select;
.ActiveWorkBook.ActiveSheet.Selection.Characters.Text := ,Текст';
Появляется ошибка "He найден член группы
Также хотелось бы узнать, как можно изменять имена надписей.
Для того чтобы изменять текст надписи, принадлежащей листу рабочей книги Excel, нужно получить доступ к изменяемой надписи. Доступ можно получить, используя имя или индекс объекта в коллекции Shapes. Последний вариант надежнее. Также надо учесть, что коллекция Shapes может содержать объекты не только типа TextBox, но и другие, например геометрические фигуры. Поэтому при загрузке списка имен объектов TextBox необходимо учитывать тип загружаемого объекта, т. е. свойство Туре элемента коллекции Shapes.
Загрузим список имен объектов типа TextBox в компонент List Box L
]Получение списка имен надписей для листа рабочей книги
procedure TForml.Button3Click(Sender: TObject);
var a_: Integer;
begin
ListBoxl.Items・ Clear;
for a_:= 1 to E. ActiveSheet.Shapes.Count do
if E.ActiveSheet.Shapes.Item(a_).type = 17
then ListBoxl. Items. Add (E. ActiveSheet. Shapes, It^n (a_| ,Name)
else ListBoxl. Items. Add (1 - *); end;
Чтобы не загружать имена объектов, не являющихся надписями, нужно проверять тип объекта. Если свойство Туре загружаемого объекта равно 17, то этот объект является надписью (TextBox) н его имя добавляется в список компонента ListBoxl, в противном случае в список добавляется прочерк ('-').
После того как имена объектов TextBox загружены, можно получить доступ к любому из этих объектов. В следующей процедуре, вызываемой при выборе элемента списка компонента ListBoxl, мы получаем ссылку на выбранный пользователем объект TextBox (надпись), затем считываем его имя и текст, который содержится в свойстве TextFranie этого объекта.
;Считывание имени и текста выбранной надписи
procedure TForml.ListBoxlClick(Sender: TObject); begin
TextBox :=E. ActiveSheet. Shapes. item(ListBoxl, Itemlndex+1);
Editl.Text:=TextBox *Name;
Memol. Text: ^TextBox ・ Text Frame. Characters. Text; end;
С помощью считанных имени и текста надписи можно оценить эту информацию, а также при необходимости изменить ее. Далее представлены фрагменты исходного текста процедур, позволяющих изменить содержание свойства TextFrames т. е. текст, отображаемый надписью, и имя объекта Text Box. В обоих случаях можно использовать механизм обработки нсклю- чительных ситуаций, позволяющий корректно исправить ошибки пользователя.
;Редактирование текста и имени надписи
procedure TFoml. MemolChange (Sender: TObj ect);
var text_:string;
begin
text_: =Memol. Text;
try
Text Box. Text Frame. Characters. Text: =Memol. Text;
except
Memol.Text:~text_;
end;
end;
procedure TForml*Button4Click(Sender: TObject);
begin
try
TextBox.Name:=Editl.Text;
ListBoxl.Items.Strings[ListBoxl.Iteralndex]:=TextBox.Name; except end;
end;
Выбранный в приложении Delphi объект документа Excel можно выделить. Для этого воспользуемся методом Select объекта TextBox в следующей процедуре.
:Выделение надписи
procedure TForml.ButtonbClick(Sender: TObject); begin try
TextBox.select;
except
end;
end;
Результат всех приведенных здесь действий показан на рис. П2.8.
Ч Htaottill I ш;«1 - Е mchIIЧ Htaottill I ш;«1 - Е mchII-]"xl-]"xl-iblxj-iblxjНПОНПО
Ч Htaottill I ш;«1 - Е mchII
Ч Htaottill I ш;«1 - Е mchII
-]"xl
-]"xl
-iblxj
-iblxj
НПО
НПО
Рис. П2.8. Работа с существующими объектами TextBox
Как работать с абзацами?
@
Часто возникает необходимость форматирования документа 〃 изменения свойств абзацев. До написания формул приходится использовать перевод символов 6 верхний или нижний индекс (например, икс в квадрате). Как автоматизировать эти действия из приложений Delphi?
Для работы с абзацами используется коллекция Paragraphs, которая определяет, каким образом документ разбит на абзацы и способ отображения текста в каждом отдельном абзаце. Количество абзацев в документе определяется свойством Count коллекции Paragraphs, например: W.ActiveDocument.Range.Paragraphs.Count, Также можно использовать спи-
сок абзацев не только для всего документа, но и для его определенной части. Для этого определяем размеры и положение области Range.
Метод Add коллекции Paragraphs добавляет новый абзац, метод CloseUp —— устраняет интервал между абзацами. Для доступа к свойствам конкретного абзаца используйте метод ltem(i:integer), где i — индекс абзаца в коллекции Paragraphs.
Загрузим список абзацев в приложение Delphi и попробуем изменить некоторые их свойства с помощью следующих процедур.
;Получение списка абзацев активного документа и задание их свойств
procedure TForml.Button3Click(Sender: TObject);
var a_: integer;
begin
if not OpenDialogl.Execute then exit;
W. Documents. Open (OpenDialogl. FileNaxne);
for a_:=l to W.ActiveDocurnent.Range.Paragraphs.Count do begin ListBoxl.Items-Add(* Абзац - *+inttostr(a_));
end;
end;
/ / Изменим стиль буквицу
procedure TForml.DropCap_PositionChange(Sender: TObject);
begin
W. ActiveDocument. Range. Paragraphs. Item (ListBoxl. Itemlndex), DropCap* Position:=DropCap_Position.Itemindex;
end;
// Зададим отступ буквицы от левой границы
procedure TForml.FirstLinelndentChange(Sender: TObject);
begin
W .Active Document * Range * Paragraphs ・ Item (ListBoxl. Itemindex). FirstLinelndent: =FirstLineI ndent. Value;
end;
〃 Отобразим линию границы абзаца
procedure Tline_.Borders^EnableClick(Sender: TObject);
begin
Borders ・ Enable: =Borders__Enable. Checked;
end;
// Зададим тип линии границы абзаца
procedure Tline_. SpinEdi11Change(Sender: TObject);
begin
Borders .Outsidelinestyle: =LineStyle,Value; end;
Пример результата таких преобразований показан на рис. П29
Рис, П2.9. Изменяем свойства абзацев в открытом документе
Как перевести символы текста в верхний или нижний индекс?
Перевод символов в верхний или нижний индекс производится путем использования объекта Font и его свойств Subscript и Superscripi, имеющих логический тип. Запись значения True в свойство Subscript переведет символы текста в нижний индекс, а запись True в свойство Superscript — в верхний индекс. Перед использованием этих свойств объекта Font необходимо определить фрагмент (область) текста, к которому будут применены эти изменения. Область текста определяется объектом Range, а объект Font (шрифт) в свою очередь является свойством объекта Range. Поэтому процедуры Delphi, реализующие перевод символов в верхний млн нижний индекс, могут быть, например, следующими.
j Перевод символов текста в верхний и нижний индекс
procedure TForml.Button2Click(Sender: TObject); begin
W. ActiveDoCLiment. Range (1,10) . Font. Subscript: =True; end;
procedure TFoml. Button4Click (Sender: TObj ect); begin
W. ActiveDocument • Range (11,20) . Font. Superscript: =True; end;
Как создать новый стиль текста ?
При создании нового документа или редактировании созданного и сохраненного ранее часто приходится изменять разные фрагменты документа. Можно задавать фрагментам текста такой вид, который выделит их и придаст им отличия по смыслу и назначению» для этого потребуется изменять различные параметры шрифта и фона. Для упрощения этой процедуры можно применять стили, имеющиеся в приложении Word или созданные пользователем. Новый стиль можно создать и программно из внешних приложений. Коллекция Styles объекта Document позволяет создать новый стиль или изменить созданный ранее* Новый стиль создается с помощью метода Add коллекции Styles, возвращающего ссылку на созданный стиль (элемент коллекции). Метод Item(i) обеспечивает доступ к созданному ранее стилю (параметром этого метода может быть как индекс, так и название стиля).
Следующие процедуры — пример работы с текстовыми стилями. Первая создает новый стиль с названием 'Новь俯 стиль текста*, шрифтом Arial (размер 36) и текстурной запивкой абзаца 10% серого цвета. Вторая процедура изменяет имя шрифта, его размер и текстуру абзаца.
Создание нового стиля и настройка его свойств
procedure ТForml.Button2Click(Sender: TObject); begin
MyStyles:=W,ActiveDocument.Styles.Add(*Новый стиль текста1);
MyStyles. Font. Name: = * ArialT;
MyStyles. Font. Size: =36;
MyStyles»Shading ・ Texture: =wdTex ture 10 Pe rcent; end;
procedure TForml.Button4Click(Sender: TObject);
begin
MyStyles:=W.ActiveDocument・ Styles.Item (1Новый стиль текста');
MyStyles.Font.Name : = *Tahoma';
MyStyles.Font.Size:=26;
MyStyles.Shading.Texture:^dTexture20Percent;
end;
Результат выполнения процедур представлен на рис. П2.10.
Рис. П2.10. Создаем новый стиль для использования в документе Word
Как определить координаты положения для ячейки таблицы Excel?
Координаты ячейки относительно верхнего левого угла листа рабочей книги содержатся в ее свойствах Тор и Left. Чтобы получить координаты ячейки в активном окне, необходимо провести вычисления, т. е. из значений координат положения ячейки вычесть значения координат ячейки, которая в данный момент находится в верхнем левом углу окна листа рабочей книги.
Следующие процедуры определяют и отображают значения координат ячейки в окне (полный исходный текст приложения представлен на сопроводительном компакт-диске книги).
;Определение координат ячейки
procedure TForml. colChange (Sender: TObj ect); begin
х, Caption: =currtostr (E • ActiveWor kBoo к. ActiveSheet. J
Cells [row. Value, col. Value ] . Left-E * Act iveWorkBook. ActiveSheet .Columns,」 Item[E.ActiveWindow.ScrollColumn] . Left);
end;
procedure TForml.rowChange(Sender: TObject); begin
у • Caption: ^currtost r (E. ActiveWorkBook. ActiveSheet. J
Cells [row.Value, col»Value] .Top-E. ActiveWorkBook.ActiveSheet»Rows♦ J
11em[E.ActiveW indow.ScrolIRow].Top); end;
Как перемещать курсор по тексту документа Word?
Положение курсора связано с положением области Selection, поэтому методы MoveLeft н MoveRight объекта Selection позволяют перемещать положение курсора. Следующие процедуры позволяют перемещать курсор влево и вправо.
;Перемещение курсора влево и вправо
const wdCharacter=l;
procedure TForml.MoveLeftClick(Sender: TObject); begin
W.Selection.MoveLeft (Unit:=wdCharacter, Count:=1); end;
procedure TForml.MoveRightClick(Sender: TObject); begin
W. Select ion. MoveRight (Unit :swdCharacter, Count: =1); end;
Как выделить область листа, заполненную данными?
Объект UsedRange позволяет обращаться к той области таблицы Excel, которая заполнена данными. Этот объект имеет тип Range и обладает соответствующими свойствами и методами. Метод Select объекта UsedRange позволяет выделить область ячеек, заполненную информацией. Свойство Column
возвращает количество ячеек этой области, коллекции Columns и Rows возвращают ссылки на столбцы и строки этой области.
Следующая процедура позволяет выделить область листа рабочей кннп£, заполненной информацией^ и возвращает общее количество ячеек, количество строк и столбцов, а также интервал этой области.
Получение некоторых характеристик области, заполненной данными
procedure TForml.ButtonlClick(Sender: TObject); begin
E. ActiveWorkbook. ActiveSheet .UsedRange. Select;
Count.Caption:=E.ActiveWorkbook.ActiveSheet.UsedRange.Count;
Col Count. Caption: =E. ActiveWorkbook, Active Sheet. UsedRange. Columns. Count;
RowCount.Caption:=E.ActiveWorkbook.ActiveSheet.UsedRange.Rows.Count;
Address.Caption:=E.ActiveWorkbook.ActiveSheet.UsedRange.Address;
end;
Выполнив эту процедуру, мы получим данные, которые можно использовать в приложении (рис. П2.11).
Рис. П2.11. Количественная характеристика заполненной области листа
Как вычислить адрес и размеры выделенной области?
Выделенная область ячеек описывается объектом Seiectiorr Поэтому с помощью свойств и методов этого объекта можно определить численные характеристики и адрес выделенной области.
Следующая процедура позволяет определить количество строк и столбцов выделенной области ячеек, а также адрес верхней левой ячейки выделенной области.
procedure TForml*ButtonlClick(Sender: TObject);
begin
rowscount:=E.Selection.Rows.Count;
columncount:=E.Selection.Columns.Count;
range_st: =E. Selection.Range [ 'ALAI1 ] .Address;
end;
Как закрепить на экране область листа Excel?
Закрепить область листа на экране можно так: выделить необходимую область, а затем использовать свойство FreezePanes объекта ActiveWindow.
Запись значения True в это свойство закрепит выбранную область.
? Закрепление области листа
procedure TForml.ButtonlClick(Sender: TObject); begin
E.ActiveWorkbook*ActiveSheet.Range[ ^iEb* ] .Select;
E. ActiveWindow. FreezePanes :=T rue;
end;
ПРИЛОЖЕНИЕ 3
Описание компакт-диска
На сопроводительном диске представлены исходные тексты примеров» рассматриваемых в книге, и исходные тексты программ для печати платежных документов.
Для того чтобы начать работу с исходными текстами, расположенными на диске, достаточно будет вставить его в CD-привод. Программа установки запустится автоматически и предложит меню в виде списка, соответствующее главам книги, в которых используются примеры исходных текстов. После открытия списка вам достаточно выбрать пункт и нажать соответствующую кнопку. Исходный текст приложения для выбранной главы будет скопирован в соответствующий подкаталог папки Мои документы на жесткий диск вашего ПК. По окончании копирования папка будет открыта и вам останется только загрузить проект. •
Если по каким-то причинам после установки компакт-диска в дисковод программа не запускается, то вы можете запустить ее сами; Для этого откройте папку Programme на компакт-диске, а затем запустите файл MYFIRSTBOOK.EXE.
Если же вы решили не использовать программу установки, а просто просмотреть содержимое диска с помощью Проводника Windows, то воспользуйтесь описанием содержимого папок сопроводительного компакт-диска, представленным ниже.
РгодОЗ
Глава 3. Примеры доступа к Word и Excel.
Prog05
Глава 5. Создание объекта Word, запуск и визуализация приложения, создание нового или открытие ранее созданного документа, работа со списком
открытых документов, запись текста в документ, сохранение документа, закрытие документа и приложения MS Word.
РгодОб
Глава 6. Поиск, копирование, вставка текста и другие функции работы с открытым документом. Свойства и методы объекта Selection. Использование шаблона документа для создания простых документов в MS Word.
Prog07
Глава Z Формат, редактирование, положение таблицы в документе. Свойства ячеек таблицы. Шрифт. Разработка приложения с выводом информации в документ, содержащий табличную часть, на примере программы формирования счета-фактуры.
Prog08
Глава £ Создание надписей, выносок, геометрических фигур, рисунков и других объектов в документе Word, настройка их свойств. Создание н отображение внешних объектов в документах Word. Параметры страницы. Печать. Пример создания приложения, использующего объект коллекции Shapes.
Prog09
Глава 9. Использование объекта Word.Basic для создания нового документа Word, поиска и редактирования текста, создания н редактирования таблиц, работы с внешними объектами. Печать документа. Запись документа на диск н окончание работы. Пример простого приложения.
Prog 10
Глава /0. Программирование панелей и кнопок. Программирование главного меню. Создание и использование макроса Visual Basic средствами Delphi. Программирование диалогов. Пример программирования панелей.
Prog11
Глава 1L Создание объекта Excel.Application. Создание новой рабочей книги, создание рабочей книги на основе шаблона. Открытие существующей книги и получение доступа к ней. Работа с окнами и со списком листов ра-
бочей книги. Доступ к информации в ячейках рабочей книги. Сохранение, закрытие рабочей книги и приложения MS Excel.
Prog12
Глава /2 Чтение и запись данных. Формат отображения данных ячеек, запись и использование формул. Запись и чтение комментариев. Работа с областью ячеек. Поиск и замена текста. Работа со свойством текста, шрифт. Изменение свойств линий границы и области заливки ячеек. Разработка приложения "Налоговая декларация".
Prog13
Глава Л?. Объект Text Box, свойства и методы, линия границы и заливка объекта. Создание выносок, линий, геометрических фигур, объектов WordArt в книге Excel, изменение их свойств*
Prog14
Глава /4 Создание диаграммы, выбор типа, определение области данных, настройка свойств диаграммы. Заголовок и другие области диаграммы, их свойства. Изменение диаграммы объемного вида. Некоторые особенности некоторых типов диаграмм. Некоторые дополнительные элементы рядов.
Prog15
Глава /5* Деление листа на страницы, разрыв страницы. Объект PageSetup, настройка свойств листа и параметров печати. Выбор и настройка принтера, выбор качества печати. Вывод на печать. Печать объектов рабочей книги Excel.
Prog16
Глава 16. Список элементов управления коллекции CommandBars; панели и кнопки. Исследование главного меню. Создание новой панели, кнопки или элемента меню. Использование объекта Visual Basic Editor в приложениях Delphi. Коллекция диалогов. Пример программирования панелей.
Prog17
Глава /7* Создание пользовательской библиотеки для работы с документами MS Office. Обработка ошибок. Создание пользовательской динамической библиотеки. Неявная загрузка модуля DLL Явная загрузка модуля DLL.
Prog18
Глава 18. Разработка в среде Delphi динамических библиотек для использования в макросах документов Excel. Пример создания и использования библиотеки с функцией диалога выбора даты и функцией преобразования числа в его строковый эквивалент для денежных единиц.
Скопируйте файл LIBFOROF.DLL в папку, доступную для MS Excel, например System32. Откройте рабочую книгу LIBFOROF.XLS и работайте с макросами.
Prog19
Приложение 2. Ответы на наиболее часто возникающие вопросы при программировании контроллеров автоматизации.
Prog20
Приложение нПлатежные документы*'. Платежное поручение, требование, инкассовое требование, счет-фактура, приходно^кассовый ордер.
В этой папке представлены полные исходные тексты нескольких проектов как примеры использования материалов книги в целом.
Список литературы
L Елманова Н., Трепалин С., Тенцер A. Delphi 6 и технология COM (+CD) (серия "Мастер-класс"). — СПб.: Питер, 2002. — 640 с.
Матросов А. В. и др. MS Office ХР: разработка приложений / Матросов А. В., Новиков Ф. А., Усаров Г. Е., Харитонова И. А. / Под ред. Ф. А. Новикова. — СПб*: БХВ-Петербург, 2003. — 944 с.
Персон Р. Excel 7.0 для Windows 95 в подлиннике: пер. с англ. — СПб.: BHV — Санкт-Петербург, 1996. — 1056 с.
Корняков В. Серия статей в компьютерном издании "Компьютерное Вести”* — Минск, 2003.
Предметный указатель
А
Activate 410, 416
Active Document 407
Active Printer 407
Active Window 407, 413
ActiveWritingStyle 413
Add 412
AddAddress 410
Addins 407
AddToFavorites 416
ADO 36
Assistant 407
AutoCaptions 407
AutoCorrect 407
AutoFonnat 416, 419
в
Background 413
BackgroundPrintingStatus 407
Вас kgroundSavi ngStatus 407
Bold 418
BookmaiicID 418
Bookmarks 413, 418
Borders 418
Build 407
BuildKeyCode 410
c
Calculate 419
CapsLock 407
Caption 408
Case 418
Cells 423
Cenlimetei^sToPoints 410
Cha ngc FilcOpe n D i rec to ry 411
Characters 413, 418
CheckGrani mar 4] 1, 416, 419
CheckSpeliing 416,419
CheckSynonyms 419
CleanString 411
Close 412, 416
ClosePrintPreview 416
Coll叩sc 419
Columns 423
ColumnSelectMode 423
COM 31
CommandBars 408, 413
Comments 413, 414
Compare 416
ComputeStatistics 416, 420
СОМ-объекть» 17
Content 413
ConvertToTable 420
Copy 420
CopyAsPicture 420
CopyStylesFiomTemplate 416
Count 412
Custom Dictionaries 408
CustomDocumentProperties 413
Cut 420
D
DCOM 31
DDE 31
DDE Execute 411
DDEInitiate411
DDEPoke4il
DD ERequest 411
DDETerminate 411
DD ETerm inate All 411
DefaukSaveFormat 408
DefaukTableSeparator 408
Delete 420
Dialogs 408
DisplayReccntFiles 408
DisplayScreenTips 408
Display Scroll Bara 408
DispiayStatusBar 408
DLL 30, 3】
Document 423
Documents 408
Dynamic Link Library 31
E
End 418
EndOf420
Expand 420
Extend Mode 423
F
Fields 413, 418
File Converters 408
FileSearch 408
Find 418
FindKey 408
Flags 423
FoilowHyperlink 416
Font 418
FontNanies 408
Footnotes 413, 418
FormattedText 418
FormFields 414, 418
Frames 4〕4, 418
FullName 414
G
Get Address 411
GetSpe П i ng S uggest io ns 420
GoBack 41!
GoFonvard 411
GoTo 416, 420
GoToNexi 420
Grammai<2hecked 4]8
GranimaticalEnors 418
H
HasPassword 414
Height 408
Help 411
Hyperlinks 414, 418
InchesToPoints 411
Information 418
InlineShapcs 414, 418
In Range 420
InsertAfter 420
InsertAutoText 420
InseriBefore 420
InsertBreak 420
Insert Caption 420
InsertCrossReference 421
InseitDatabase 421
InsertDateTimc 421
InsertFiie 421
Insert Paragraph 421
Insert Paragraph Aft er 421
InsertPai^graphBefore 421
InsertSymbol 421
InStory 42】
International 408
IsEqual 421
IsMasterDocumcnt 414
IsObjeclValid 408
Italic 418
Item 413
Key В indings 4Q8
KcysBoundTo 408
KeyString 411
L
LanguagelD 419
Languages 409
Left 409
ListParagraphs 419
LookupN ame Propert ies 421
м
Post 416
Previous 422
MacroContainer 409
MailSystem 409
MAPIAvailable 409
MathCoprocessorAvailable 409
Meige 416
MillimetersToPoints 411
MouseAvaliable 409
Move 411,421
Move End 421
MoveEnd Until 421
MoveEndWhilc 421
MoveStan 422
MoveStartUntil 422
MoveStartWhile 422
MoveUntil 422
Move While 422
Previous Book mark ID 419
Printout 412, 416
PrintPreview 409, 417
Protect 417
Q
Quit 412
R
Range 417
RecentFiles 409
Redo 417
RejcctAll Revisions 41/
Reload 417 '
Repeat 412
N
Resize 412
Rows 423
Name 409
New Window 411
Next 422
NormalTemplate 409
NumLock 409
Run 412
RuiiAutoMacro 417
s
Save 413, 417
О
SaveAs 417
Screen Refresh 412
OLE 31
OLE Automation 32, 142
OLE-объект 23
OLEy叩вер 23
OnTime411
Open 413
Options 409
Orientation 419
Screen Updating 409
Select 417, 422
Selection 409
Send Fax 412, 417
SendMail 417
Set Range 422
Shading 423
ShowVisualBasicEditor 409
Sort 422
p
Start 419, 423
StartlsActive 423
PageSctup 419
ParagraphFonnat 419
Paragraphs 419
Parent)5, 412, 419
Paste 422
PasteSpecial 422
Path 409
PointsToCentimetere 411
PointsToInches 411
PointsToMillimeters 412
StartOf422
StatusBar 409
System 409
T
Tables 423
Tasks 409
Templates 410
Text 419, 423
Тор 4】0
Туре 415, 423
Underline 419
Undo 417
UndoClea「4l7
Un Protect 417
UpdatcStyles 417
UpdateStylesOnOpen 415
Usable Height 410
UsableWidth 410
UserAddress 410
UserControl 410, 415
Userinitials 410
UserName 4i0
Variables 415
VBE 410
VBProject4I5
Version 410
Visible 410
Visual Basic 27
Visual Basic Equivalents for Word Basic
Commands 143
w
WholeStory 422
Width 410
Windows 410, 415
WindowState 410
Word.Basic и Word.Application — сходство н различие 14i
Word Basic 410
Words 415, 419, 423
WrkePassword 415
Write Reserved 415
вВерхний колонтитул 323Возвышение 305Временная панель 173Вставка текста в документ 151Выбор:0 активного принтера 333О и отображение панели 340Выделение:О надписи 4740 таблицы 89Вызов функции из макроса 394Выравнивание таблицы 465гГлавное меню 164'Торячие" клавиши 337, 165Градиент 119, 263дДеактивизация панели 171Диалоги, количество в Excel 368вВерхний колонтитул 323Возвышение 305Временная панель 173Вставка текста в документ 151Выбор:0 активного принтера 333О и отображение панели 340Выделение:О надписи 4740 таблицы 89Вызов функции из макроса 394Выравнивание таблицы 465гГлавное меню 164'Торячие" клавиши 337, 165Градиент 119, 263дДеактивизация панели 171Диалоги, количество в Excel 368
в
Верхний колонтитул 323
Возвышение 305
Временная панель 173
Вставка текста в документ 151
Выбор:
0 активного принтера 333
О и отображение панели 340
Выделение:
О надписи 474
0 таблицы 89
Вызов функции из макроса 394
Выравнивание таблицы 465
г
Главное меню 164
'Торячие" клавиши 337, 165
Градиент 119, 263
д
Деактивизация панели 171
Диалоги, количество в Excel 368
в
Верхний колонтитул 323
Возвышение 305
Временная панель 173
Вставка текста в документ 151
Выбор:
0 активного принтера 333
О и отображение панели 340
Выделение:
О надписи 474
0 таблицы 89
Вызов функции из макроса 394
Выравнивание таблицы 465
г
Главное меню 164
'Торячие" клавиши 337, 165
Градиент 119, 263
д
Деактивизация панели 171
Диалоги, количество в Excel 368
A
Абзацы 475
Автоматическая запись действий пользователя 27
Автоматичес кое мае штабирование
305, 459
Адрес выделенной области 481
Активизация:
о панели i 71
0 рабочей книги 201
Активное меню 339
Аппроксимация 3)5
Аргументы:
О метода Open коллекции WorkBooks 199
6 метода SaveAs объекта Work Book 202
Б
Базы данных 391
Библиотека динамической компоновки 30, 392, 401
Буфер обмена 151
Диалоговые окна 186
Динамическая библиотека 392, 401
Добавление:
0 листа рабочей книги 206
0 нового окна для рабочей книги 204
0 разрыва страницы 321
0 страницы в конец документа 461
0 страницы в разрыв текста 461
0 строк и столбцов таблицы 99
0 строк к существующей таблице 89
Допустимый тнп диаграммы 309
Доступ:
0 к внешним процедурам 392
0 к диаграмме 280? 470
0 к документам и приложениям 33
0 к листу рабочей книги 206
0 к панели, ограничение 345
3
Заголовки:
0 столбцов и строк, печать 330
0 диаграммы 287, 290
О оси 297
Заготовки градиента 265
Загрузка:
0 модуля 388
0 модуля DLL, неявная 384
0 модуля DLL, явная 386
0 текста макроса из строки 362
О текста модуля из файла 362
Задание:
0 видимости лнннм 255
0 определенного имени*фа^а 187
0 переменных для точек входа 387
0 типов импортируемых функций 387
0 толщины линии 256
О узора линии 260
0 цвета линии 257
0 цвета фона узора 260
Закрытие:
О документа 381
0 приложения 381
0 рабочей книги 203
Заливка:
0 в виде рисунка 269
о надписи 118
Запись макросов 27
Заполнение области исходных данных для диаграммы 283
Запуск неактивного приложения MS Office 456
Защита:
0 надписи 253
О панели 167
Значок на кнопке 356
и
Изменение:
0 области данных 305
0 положения окна Word ] 44
О размера кнопок 337
О размеров окна Word 144
О фигуры для точек ряда 303
Изометрия 305
Импорт текста нз документа Word 380
Имя файла, подстановка в диалог 368
Исключительная ситуация 49, 341, 342, 474, 378
Качество печати 323
Кернинг 276
Ключ легенды 294
Кнопки с предопределен ными свойствами 356
Коли мест ею отображаемых страниц 460
Коллекция 18
0 Dialogs 23
0 Documents 43
Q Shapes 19
0 Words 19
0 WorkBooks 194
0 диалогов 23
0 проектов 182
Колонтитул 325, 462
Комментарий ячейки 224
Компоненты:
。Ole Container 35
0 WebBrowser 35
0 ActiveX 36
Контроллер автоматизации 27, 32, 33
Координаты:
0 панели 344
0 ячейки 479
Копирование и вставка листа рабочей книги 207
Копирование:
О листа 468
О содержимого документа в буфер обмена 380
Коридор колебания (изменения) 289, 310
Курсор, перемещение 480
л
Легенда 287, 293
Линии:
0 выноски 288, 312
О погрешностей 288
0 проекций 289, 309
0 серий (рядов) 289, 308
0 сетки 287, 297, 323
0 сетки, печать 330
0 тренда 288, 315
Линия-указатель 127, 270
м
Макрос для элемента управления 349
Макросы 182
Мастер функций 221
Масштаб:
0 отображения 458
0 печати 323, 329
Меню, отличие от панели 349
Метки оси 297
Модель СОМ 32
н
Надпись в рабочей книге 473
Направление текста 106, 114, 471
Номер:
0 версии VBE 358
0 первой страницы 323, 328
Нумерация страниц 462
о
Область 210
0 выделение 480
0 диаграммы 287
0 закрепление 482
0 печати 324
0 построения диаграммы 287
0 ячеек 282
Обработка исключительных ситуаций
49, 34】,342, 474, 378
Объект:
0 Application 18, 21
° получение ссылки 378
0 Characters 253
0 Chart 286
О Document 18
О Range 19
0 Selection 65
0 Text Effect 275
0 VBE 357
0 Word. Basic 29
Объектная модель:
0 Excel 20
О Word 17
0 Word Basic 141
0 диаграммы 288
О коллекции диалогов Excel 24
0 меню 352
0 элементов управления Word 19
Окно приложения Word 378
Описание:
0 внешних процедур и функций 384
0 процедуры 392
О ссылки на функцию 393
0 функции 392
С функции в макросе 393
Определение:
0 количества таблиц 89
0 координат ячейки 479
Ориентация страницы 323, 327
Освобождение памяти 381, 386, 389, 456
Основание диаграммы 287
Ось значений 297
Открытие:
0 рабочей книги только для чтения 200
0 существующего документа 379
Отображаемое значение 215
Отображение:
0 окна приложения Excel 194
0 панели 169
Очистка стека и регистров 394
Панели инструментов 164
Панель, положение 341
Параметры страницы 133
Передача параметров 394
Перемещение курсора 148, 480
Перенос линии разрыва страницы 321
Перспектива 305'
Печать:
0 в файл 333
0 диаграммы 289
0 документа 137, 332
Планки погрешностей (полоса погрешностей) 288, 3]4
Поворот 305
Подключение к выполняющемуся приложению Excel 455
Подписи данных 287, 288, 301
Подсказка 165, 337, 349
Позднее связывание 32
Поиск фрагмента текста в документе 148
Положение панели 167, 343
0 координаты 344
Положение таблицы 93
Полоса погрешностей (планки погрешностей) 288, 314
Полосы:
0 повышения 289, 311
0 понижения 289, 311
Получение формулы ряда 303
Пользовательская панель 346
Пользовательский модуль 376
Поля 323
Предварительный просмотр 137, 331, 333
Предупреждающие сообщения, подавление 208
Признак разделителя 179
Признак создания меню 173
Принтеры 333
0 установленные в системе 333
Проверка сохранения рабочей книги 203
Программный модуль 359
Проект 358
Прозрачность 264
Процедура отклика на двойной щелчок» использование 402
р
Размер:
0 бумаги 323
0 шрифта в колонтитуле 327
0 кнопок 164
0 панели 167
0 поле^ 324
Размещение:
О окон 204
Q файла библиотеки 401
Разрыв страницы 151, 319
Расположение диаграммы 282
Регистры процессора 394
Режим "разметка страницы*' 319
Рисунок 121
Ряды 287
0 данных 312
0 значений 299
с
Свойства (параметры) страницы 319
Свойства:
0 области построения диаграммы 292
0 объекта PageSetup 322, 323
0 проекта Excel 360
0 элемента управления 351
Свойство Visible 42
Секция:
0 implementation 376, 377
0 interface 376
Сервер автоматизации 32
Соглашение о вызовах 394
Создание:
0 диаграммы 281
0 динамической библиотеки 382, 395
0 документа 379
° в WordBasic к Visual Basic 146
0 документа на основе шаблона 382, 386, 388
0 рабочей книги по умолчанию 195
0 таблицы 88, 152, 466
0 формы Microsoft 360
0 элемента управления 354
Создание н использование макроса
из приложений Delphi 363
Создание и настройка диаграммы 467
Сохранение рабочей книги 201
Список:
0 абзацев 476
0 диаграмм 470
0 листов рабочей книги 206
0 надписей листа 473
0 панелей 339
0 рабочих книг 200
0 элементов управления панели 349
Способ отображения 215
Ссылка:
О на рабочую книгу 200
0 на элемент управления 350
Стек 394
Стены диаграммы 287
Стиль:
0 кнопки 355
0 линий таблицы 97
О текста 478
Стрелки 271
т
Таблицы в документах Word 152
Текст модуля 363
Текстура 119, 267
Тип диалога 186
Типы данных 392
Типы данных, совместимые для Excel
н Delphi 361
Точка 288, 299
Трекинг 277
У
Углы 287
Удаление строк и столбцов таблицы 99
Узор 122, 267
Установка значений элементов диалога
187
ф
Формат отображения чисел 302
Форматирование:
0 таблицы 91
0 шрифта таблицы 101
Форматы имени принтера 334
Формула ряда 303
X
Характеристики шрифта 116
ч
Черно-белая печать 323, 330
Черновая печать 323, 330
Чтение и запись информации листа
рабочей книги 210
ш
Шаблон 43, 197
0 документа 78
0 линии 259
Шрифт 274
О верхний н нижний индекс 477
Штриховка 122
0 градиента 264
0 узора 267
э
Элементы управления 174, 348
Эффект при выводе меню 337
я
Ячейка 215
I Значения идентификатора объекта (кроме 1) определяют кнопки, связанные с определенными командами Word. Значение 1 определяет кнопку, не связанную с командой Word (т. е. пользовательскую кнопку).
I Область —— одна ячейка или интервал смежных ячеек.
procedure ТОКВо11omDlд2.ButtonlClick(Sender: TObject);
begin
value1.Text:=Range* Text;
end;
При выполнении этой процедуры значение ячейки записывается в свойство Text объекта Value типа TEdit. Для записи в ячейку достаточно поменять местами объекты в операторе представленной выше процедуры и использовать свойство Value объекта Range, т. к. свойство Text в данном случае подходит только для чтения. Так мы и поступим, т. е. запишем содержание объекта TEdit приложения Delphi в ячейку рабочей книги Excel как текст.
Запись значения 日 ячейку
procedure T0KBottomDlg2.Button2Click(Sender: TObject); begin
Range. Value: rvalue 1. Text;
end;
;Запись даты в ячейку
procedure TOKBot tomDlg2. But ton4 Click (Sender: TObj ect.); begin
Range.Value:=strtodate(value1.Text);
end;
Определение формата ячейки
器“ J»»』,'"'— ..""" .",.;".,, 23j“U“.““..:…:“…厶……“小“7“…二:—
procedure TOKBottomD 1g 10.addresKeyDown(Sender: TObject; var Key: Word;
Shift: TShiftState);
begin
if Key<>13 then exit;
Range:=forml.E.ActiveSheet.Range[addres,Text];
NumberFormat. Text: =Range .Number Format; end;
Для заданного адреса ячейки данная процедура возвращает ее формат, что мы и видим на рис, 12.4.
Итак, мы определили формат ячейки, отображающей дату. Для данного случая формат представляет собой строку типа 'ДД.ММ.ГГ'. В строке, где обычно записывают формулы, отображается числовое значение даты без формата. Если мы изменим формат, то само значение не изменится. Изменится только формат отображения его непосредственно в ячейке. Изменим
В первом операторе данного примера мы создаем программный модуль и получаем доступ к нему, чтобы записать текст создаваемого макроса. Далее в строковую переменную записываем текст создаваемого макроса, учитывая стиль написания операторов Visual Basic. Оператор
CodeModule .MciFrcffnString (еее_);
где еее_ — строка, содержащая текст макроса, записывает текст макроса в модуль. Далее создаем меню и кнопку, в свойство OnAction которой запм- сываем строку —— имя модуля и макроса, разделенные точкой. Метод Execute кнопки запускает созданный макрос на выполнение. Далее удаляем кнопку, панель и компонент, содержащий программный модуль.
ВАСИЛИЙ КОРНЯКОВВАСИЛИЙ КОРНЯКОВ
ВАСИЛИЙ КОРНЯКОВ
ВАСИЛИЙ КОРНЯКОВ
©hv
ПРОГРАММИРОВАНИЕ
ДОКУМЕНТОВ И ПРИЛОЖЕНИЙMS OFFICEв DELPHI
РАЗРАБОТКА ПРИЛОЖЕНИЙ ДЛЯ РАБОТЫ С ТЕКСТОМ, ТАБЛИЦАМИ, РИСУНКАМИ И ВНЕШНИМИ ОБЪЕКТАМИ В ДОКУМЕНТАХ WORD И EXCEL
ПРОГРАММИРОВАНИЕ
ПАНЕЛЕЙ, МЕНЮ И ДРУГИХ ЭЛЕМЕНТОВ УПРАВЛЕНИЯ ПРИЛОЖЕНИЙ MS OFFICE
РАЗРАБОТКА
И ИСПОЛЬЗОВАНИЕ ДИНАМИЧЕСКИХ БИБЛИОТЕК ДЛЯ РАБОТЫ С ДОКУМЕНТАМИ WORD И EXCEL
Василий Корняков
ПРОГРАММИРОВАНИЕ
ДОКУМЕНТОВ И ПРИЛОЖЕНИЙMS OFFICEв DELPHI
Санкт-Петербург«БХВ'Петербург»2005
УДК 681.3.06
ББК 32.973,26-018.2
К67
Корняков В. Н.
К67 Программирование документов и приложений MS Office в Delphi.— СПб*: БХВ-Петербург» 2005. — 496 с.: ил.
ISBN 5-94157-458-4
Книга посвящена созданию приложений в среде Delphi для работы с текстом, таблицами, объектами, диаграммами, макросами, настройками параметров страниц и др. в документах MS Word и Excel. Большое внимание уделено объектным моделям документов MS Office. Рассмотрено программирование элементов управления редакторов MS Word и Excel, а также создание динамических библиотек, которые можно использовать в макросах документов MS Office. Приведены варианты программной реализации типовых задач н ответы на типовые вопросы, с которыми встречаются разработчики, На прилагаемом к книге компакт-диске размещены полные исходные тексты примеров из книги.
Для программистов
УДК 681306
ББК 32.973.26-018.2
Группа подготовки издания:
Главный редакторЗам. главного редактора Зав. редакцией Редактор Компьютерная верстка Корректор Дизайн серии Оформление обложки Зав. производствомГлавный редакторЗам. главного редактора Зав. редакцией Редактор Компьютерная верстка Корректор Дизайн серии Оформление обложки Зав. производствомЕкатерина Кондукова Игорь Шишигин Григорий Добин Татьяна Темкина Ольги Сергиенко Зинаида 4MHmр&ем Инны Тачиной Игоря Цырульншсоеа Николай ТверскихЕкатерина Кондукова Игорь Шишигин Григорий Добин Татьяна Темкина Ольги Сергиенко Зинаида 4MHmр&ем Инны Тачиной Игоря Цырульншсоеа Николай Тверских
Главный редактор
Зам. главного редактора Зав. редакцией Редактор Компьютерная верстка Корректор Дизайн серии Оформление обложки Зав. производством
Главный редактор
Зам. главного редактора Зав. редакцией Редактор Компьютерная верстка Корректор Дизайн серии Оформление обложки Зав. производством
Екатерина Кондукова Игорь Шишигин Григорий Добин Татьяна Темкина Ольги Сергиенко Зинаида 4MHmр&ем Инны Тачиной Игоря Цырульншсоеа Николай Тверских
Екатерина Кондукова Игорь Шишигин Григорий Добин Татьяна Темкина Ольги Сергиенко Зинаида 4MHmр&ем Инны Тачиной Игоря Цырульншсоеа Николай Тверских
Лицензия ИД № 02429 от 24,07.00. Подписало в печать 24.12.04.
Формат ТОкЮО1/^. Печать сх^сетная. Усл. печ. л. 40.
Тираж 3000 зкз* Заказ № 723"БХВ-Петербург'1, 190005, Санкт-Петербург. Измайловский пр., 29.
Сан итарно-эп и дем и ологическое заключение на продукцию№ 77.99.02.953.Д.006421.11.04 от 11.11.2004 г выдано Федеральной службойпо надзору е сфере защиты прав потребителей и благаполучия человека.
Отпечатано с готовых диапозитивовв ГУП "Типография "Наука"199034, Санкт-Петербург, 9 линий, 12
ISBN 5-94157-458-4ISBN 5-94157-458-4С Корняков В, Н+* 2005
ISBN 5-94157-458-4
ISBN 5-94157-458-4
© Оформлеиис, издательство иБХВ-Петербург,,1 2005
Содержание
От автора .9
Введение ...11