Урок 10. Интеграция приложений

1.      Создание документа MS Word 2003. 1

Технология COM... 1

Объект Application. 2

Семейство Documents. 3

Объект Document 3

Объект Range. 4

Пример формирования документа. 4

Загрузка приложений. 6

2.      Чтение таблицы MS EXCELL 2003. 7

Методы и свойства приложения MS Excel 2003. 7

Текст основной LISP-функции. 8

Тексты вспомогательных программ.. 12

Анализ программ.. 14

1.    Создание документа MS Word 2003

 

Технология COM

 

Фирма Microsoft разработала модель COM (Component Object Model — модель компонентных объектов). Модель позволяет связывать самые разнородные приложения. Построенный на спецификации этой модели программный комплекс предоставляет описание своих компонентов и средств доступа к ним другим программам. Это дает возможность проектировать такие системы, в которых одни приложения (приложения-клиенты) обращаются к другим приложениям (приложениям-серверам) для выполнения некоторых операций, специфичных для приложений-серверов. При этом приложение-сервер может запускаться в видимом режиме (для него открывается свое окно) или в невидимом режиме (приложение работает в оперативной памяти, не открывая своего окна).

Приложения, поддерживающие технологию COM, при установке заносят в реестр Windows информацию о себе, о своих компонентах и объектах. Так, например, имя приложения (ProgID), под которым оно может быть вызвано как приложение-сервер, заносится в реестр в раздел HKEY_CLASSES_ROOT.

На рис. 10.1 показано окно редактора реестра (Пуск — Выполнить — Regedit). Установленная версия AutoCAD зарегистрирована как AutoCAD.Application.17.1. Под таким именем нужно создавать (загружать в оперативную память) объект приложения AutoCAD 2008, если вы будете обращаться к нему из приложения-клиента.

 

 

Рис. 10.1. Окно редактора  реестра

 

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

 

Рассмотрим пример использования технологии COM. Создадим прямо из AutoCAD документ Word. Приложение Microsoft Word 2003 в реестре имеет регистрацию как “Word.Application.11”. Для работы с этим приложением необходимо иметь в оперативной памяти экземпляр приложения. Если он загружен и уже находится в памяти, то нужно с ним просто соединиться. Иначе требуется создать в памяти новый объект-приложение. При этом необязательно, чтобы он был виден на экране.

Установления связи с Word возможно с помощью одной из трех функций:

·         vlax-create-object — создание нового объекта;

·         vlax-get-object — соединение с существующим в памяти объектом;

·         vlax-get-or-create-object — проверка существования объекта и соединение с существующим, — при его отсутствии создание нового экземпляра приложения.

 

Объект Application

 

Создадим VLA-объект приложения Word 2003 с помощью следующего выражения:

 

(setq q_ow (vlax-get-or-create-object “Word.Application.11”))

 

Переменную q_ow рекомендуется делать глобальной. По окончании использования нужно освободить занимаемую ею память с помощью функции vlax-release-object. При неправильном освобождении COM-объекты могут оставаться в памяти (причем они могут быть невидимы), что приведет к проблемам. В данном уроке для удобства отслеживания такие переменные будут сопровождаться префиксом g_.

Для вывода свойств и методов объекта Application можно пользоваться функцией

(vlax-dump-object g_ow T)

Наличие второго параметра T в этом выражении означает вывод не только свойств, но и методов объекта g_ow. Функция возвратит свойства объекта приложения Word 2003 и его методы. Для извлечения значений свойств объекта следует пользоваться функцией vlax-get-property, например:

 

(setq vers (vlax-get-property g_ow “Version”)) или

(setq vers (vlax-get-property g_ow ‘Version)).

 

Для изменения свойств объекта используется LISP-функция:

 

(vlax-put-property g_ow ‘Visible :vlax-true)

 

Это выражение делает окно приложения (т.е. объект g_ow) видимым. По умолчанию окно приложения невидимо.

При вызове методов с помощью функции vlax-invoke-method должно быть два основных параметра: первым должен быть объект, а вторым — имя метода. Например:

 

(vlax-invoke-method g_ow ‘ListCommands :vlax-true)

 

Данное выражение формирует новый документ с таблицей, в которой приведены команды Word 2003 (примерно 25 страниц текста).

 

Семейство Documents

 

Все открытые документы являются элементами семейства Documents. Доступ к нему можно получить из объекта Application с помощью свойства Documents:

 

(setq g_docs (vlax-get-property g_ow ‘Documents))

 

Перечислим свойства семейства Documents Word 2003

;Property values (RO=ReadOnly)):

;   Application (RO) = #<VLA-OBJECT _Application 09672214>

;   Count (RO) = 0

;   Creator (RO) = 1297307460

;   Parent (RO) = VLA-OBJECT _Application 09672214>

;   NewEnum (RO) = #<IUnknown 096e150>

;Method supported:

;   Add (4)

;   CanCheckOut (1)

;   CheckOut (1)

;   Close (3)

;   Item (1)

;   Open (16)

;   Save (2)

 

Объект Document

 

Каждый из открытых текстовых документов является объектом типа Document. Доступ к активному документу получается путем извлечения значения свойства ActiveDocument объекта Application. Для создания нового документа необходимо к семейству Documents применить метод Add:

 

(setq g_doc (vlax-invoke-method g_docs ‘Add))

 

В этом выражении использован простейший вариант создания нового документа без дополнительных аргументов. Новый документ создается со свойствами по умолчанию и по стандартному шаблону.

 

Объект Range

 

Объект Range используется в качестве рабочего диапазона документа Word. Диапазон может иметь любой размер от нуля символов до всего документа. Ноль символов фактически обозначает ту позицию курсора, перед или после которой будет добавляться текст.

Метод Range, с помощью которого можно создать объект Range, присутствует у разных объектов Word. Нас будет интересовать объект Range в текущем документе:

 

(setq g_r (vlax-invoke-method g_docs ‘Range 0 0))

 

В этом выражении создан диапазон, начинающийся в позиции 0 (вначале документа). Относительно этой позиции далее будут выполнены какие-то операции.

 

Пример формирования документа

 

В приведенном ниже листинге приведен пример создания нового документа Word. В этот документ выводятся несколько заголовков, разделенных символами конца абзаца.

 

Листинг 10.1. Функция writew11_com

 

(defun writew11_com ( / _re)

(vl-load-com)

; Загружаем Word 2003 без открытых документов

(setq g_ow (vlax-get-or-create-object "Word.Application.11"))

 

; Раскомментировать следующую строку,

; если окно Word должно быть видимым

;;;(vlax-put-property g_ow 'Visible :vlax-true)

 

; Указатель семейства Documents

(setq g_docs (vlax-get-property g_ow 'Documents))

 

; Создаем новый документ

(setq g_doc (vlax-invoke-method g_docs 'Add))

; Создаем рабочий диапазон, позиция 0

(setq g_r (vlax-invoke-method g_doc 'Range 0 0))

; Вставляем текст заголовка в начало диапазона

(vlax-invoke-method g_r 'InsertBefore "Пояснительная записка")

; Вставляем конец абзаца дважды

(vlax-invoke-method g_r 'InsertParagraphAfter)

(vlax-invoke-method g_r 'InsertParagraphAfter)

; Параметры шрифта рабочего диапазона

(setq g_f (vlax-get-property g_r 'Font))

(vlax-put-property g_f 'Name "Arial")

(vlax-put-property g_f 'Size 14.0)

(vlax-put-property g_f 'Bold :vlax-true)

(vlax-put-property g_f 'Italic :vlax-false) 

(vlax-put-property g_f 'Underline :vlax-false)

 

; Создание нового диапазона в конце документа

(setq _re (vlax-get-property g_r 'End))

(setq g_r (vlax-invoke-method g_doc 'Range _re _re))

; Вставляем текст в конец

(vlax-invoke-method g_r 'InsertAfter "Строка один")

(vlax-invoke-method g_r 'InsertParagraphAfter)

(vlax-invoke-method g_r 'InsertAfter "Строка два")

(vlax-invoke-method g_r 'InsertParagraphAfter)

(vlax-invoke-method g_r 'InsertAfter "Строка три")

(vlax-invoke-method g_r 'InsertParagraphAfter)

; Параметры шрифта рабочего диапазона

(setq g_f (vlax-get-property g_r 'Font))

(vlax-put-property g_f 'Name "Times New Roman")

(vlax-put-property g_f 'Size 10.0)

(vlax-put-property g_f 'Bold :vlax-false)

(vlax-put-property g_f 'Italic :vlax-false) 

(vlax-put-property g_f 'Underline :vlax-false)

 

; Сохранение документа

(vlax-invoke-method g_doc 'SaveAs "d:\\Temp\\WordDoc.doc")

; Выход из Word

(vlax-invoke-method g_ow "Quit")

 

; Освобождение объектов и выгрузка Word

(if (and g_f (not (vlax-object-released-p g_f)))

  (vlax-release-object g_f))

(if (and g_r (not (vlax-object-released-p g_r)))

  (vlax-release-object g_r))

(if (and g_doc (not (vlax-object-released-p g_doc)))

  (vlax-release-object g_doc))

(if (and g_docs (not (vlax-object-released-p g_docs)))

  (vlax-release-object g_docs))

(if (and g_ow (not (vlax-object-released-p g_ow)))

  (vlax-release-object g_ow))

 

(setq g_f nil g_r nil g_doc nil g_docs nil g_ow nil)

(gc)

);defun

 

Создаваемое приложение имеет следующие особенности. Для хранения всех COM-объектов использованы только глобальные переменные. Это должно обеспечить их аккуратное освобождение и тем самым избежать потери памяти.

Функция writewll_com сначала создает объект приложения Word 2003 или соединяется с тем объектом, который был загружен заранее. Затем создается новый документ g_doc. В новом пустом документе формируется рабочий диапазон (объект класса Range).

В начало диапазона с помощью метода InsertBefore текст «Пояснительная записка» вставляется тем шрифтом, который действует в шаблоне по умолчанию. Тут же методом InsertParagraphAfter в конец рабочего диапазона добавляются два символа конца абзаца. Затем с помощью свойства Font создается объект Font, который управляет шрифтом выделенного диапазона текста. Для установления требуемого шрифта используется редактирование значений свойств Name, Size, Bold, Italic, Underline.

После формирования заголовка необходимо добавить три абзаца текста с новым шрифтом. Для этого с помощью свойства End вычисляется позиция в конце документа и создается новый рабочий диапазон Range вначале нулевой длины (вырожденный). Затем в его конец добавляются нужные куски текста (три фразы). С помощью объекта Font задаются нужные свойства шрифта.

Документ сохраняется под именем D:\Temp\WordDoc.doc. Приложение Word 2003 закрывается. Вообще говоря, необходимо было бы вначале программы создать признак того, что приложение Word было загружено в память функцией writewll_com. Только в случае, если признак имеет значение T, только тогда закрыть Word.В конце программы освобождаются объекты и очищается память. Созданный документ показан на рис. 10.2.

Если Word 2003 загружается только рассмотренной программой, то все выполнение по умолчанию идет в скрытом режиме. Окно MS Word не показывается на экране, но файл сохраняется. Если требуется появление окна, то следует раскомментировать строку с изменением свойства Visible. Тогда на экране появится окно MS Word (рис. 10.2).

 

 

Рис. 10.2. Окно MS Word, созданное как COM-объект

 

Загрузка приложений

 

Часто желательно, чтобы приложение автоматически загружалось при старте системы AutoCAD или открытии чертежа. Для этого необходимо добавить строку на языке AutoLISP в файл acad.lsp или acaddoc.lsp:

 

(load “exc_com2.vlx”)

 

Файл acad.lsp автоматически читается при начальной загрузке AutoCAD. Файл acaddoc.lsp читается при открытии каждого чертежа-документа. Можно заставить систему читать файл acad.lsp также с каждым открытием нового чертежа. Для этого необходимо изменить значение 0 системной переменной ACADLISPASDOC на 1. Путь к файлам должен быть внесен в пути доступа к файлам поддержки.

Иногда требуется не только загрузить файлы-приложения при открытии чертежа, но и начать их выполнение. Для этого в файлы acad.lsp или acaddoc.lsp нужно добавить строку обращения к главной функции нашего приложения:

(exc_com2)

Автоматической загрузкой LISP-функций при загрузке меню управляет файл с расширением .mnl, аналогичный файлу acaddoc.lsp.

 

 

2.    Чтение таблицы MS EXCELL 2003

 

Составленная выше программа с помощью COM-технологии устанавливает связь AutoCAD с объектами MS Word. Программа выполняет необходимые действия (составление пояснительной записки) с использованием методов и свойств чужой объектной модели.

Однако текстовые документы из системы AutoCAD составляют редко. Чаще в чертеже приходится создавать таблицу, например, спецификацию. Небольшие спецификации иногда размещают непосредственно на чертеже. Большие спецификации размещают на специальных листах. Удобно составлять спецификации в программе MS Excel. Но тогда возникает вопрос о переносе этих данных в рисунок AutoCAD. Возможен, конечно, импорт таблицы из MS Excel, так же, как и экспорт данных из рисунка AutoCAD в таблицу MS Excel. Можно такую таблицу получить вставкой OLE-объекта, — однако это не всегда удобно.

 

Методы и свойства приложения MS Excel 2003

 

С помощью реестра определим, под каким именем следует в COM-технологии обращаться к приложению MS Excel 2003 (рис. 10.3).

 

 

Рис. 10.3. Определение имени MS Excel 2003 в реестре

 

Имя этого приложения Excel.Application.11. Последняя установленная на компьютере версия MS Excel 2007 имеет имя Excel.Application.12. Если пользоваться строкой Excel.Application, то операционная система сама выбирает последнюю из установленных версий.

Запустите из командной строки следующую команду:

 

(vlax-dump-object (vlax-get-or-creare-object “Excel.Application.11”) T)

 

В текстовом окне будет выдан длинный перечень свойств и методов объекта Excel. В список свойств включены и дочерние свойства объекта. В списке методов указывается максимально допустимое количество аргументов этих методов.

 

Предположим, что данные для таблицы спецификации, которую мы должны начертить в рисунке AutoCAD, размещены в файле d:\r16\readex11.xls (рис. 10.4). Из рисунка видно, что данные располагаются на листе «Спецификация» книги Excel. Кроме этого листа в книге содержатся другие листы: Проекты, Расходы, Материалы. Поэтому программа должна открыть книгу и перелистать листы.

В листе «Спецификация» для облегчения программирования введены дополнительные данные, которые уточняют характеристики будущей таблицы деталей, создаваемой в чертеже AutoCAD. В первой строке в ячейке А1 дано количество деталей, т.е. строк таблицы без учета заголовка. В ячейке В1 указано количество столбцов таблицы (5). Вторая строка содержит размеры столбцов по ширине в мм (30, 70, 30, 40, 40). Третья строка уточняет тип данных, которые располагаются в соответствующем столбце (int — целое, real — вещественное, srt — текст). При выводе чисел будем выравнивать их вправо и писать один знак после точки. Четвертая строка содержит названия колонок таблицы. Все текстовые данные, в том числе заголовки колонок, будем выравнивать влево.

Аргументами программы установим следующие данные:

·         имя xls-файла (d:\r16\readex.xls);

·         название листа в файле (Спецификация);

·         высота строк таблицы (5 мм);

·         высота букв в таблице (3 мм).

 

Рис. 10.4. Окно просмотра книги MS Excel

 

Текст основной LISP-функции

 

Ниже приведена программа связи AutoCADMS Excel 2003.

 

Листинг 10.2. Функция readex11_com

 

;===================================================

; Программа COM-связи AutoCAD - Microsoft Excel 2003

;===================================================

; Вычерчивание таблицы по данным из книги Excel

; Используются текущий слой, текущий цвет и создаваемый стиль таблиц

;

; Аргументы:

;   tb_xls - имя файла книги Excel;

;   sheetname - имя листа;

;   hcell - высота ячейки таблицы;

;   hlet - высота букв текста таблицы;

;   show - признак показа Excel во время работы (T или nil)

;

; Глобальные переменные:

;   g_oex - VLA-объект приложения Excel 2003;

;   g_wkbs - VLA-объект семейства Workbooks;

;   g_awb - VLA-объект активной книги;

;   g_shs - VLA-объект семейства Sheets;

;   g_mainsh - VLA-объект нужного листа книги;

;   g_cell - VLA-объект ячейки.

;

; Примеры обращения к программе:

; (readex11_com "d:\\r 16\\readex11.xls" "Спецификация" 8.0 5.0 T)

; (readex11_com "d:\\r 16\\readex11.xls" "Спецификация" 5.0 3.0 nil)

;

(defun readex11_com (tb_xls sheetname hcell hlet show / nlines ncolumns

  table_items i j row pt0 widths types headers val msp tbl old_echo)

; Подгрузка библиотек, обеспечивающих работу с ActiveX

(vl-load-com)

; Отключение эхо-вывода

(setq old_echo (getvar "CMDECHO"))

(setvar "CMDECHO" 0)

;

; Установление связи c Excel

(ex11_set_connect show)

; Указатель семейства Workbooks

(setq g_wkbs (vlax-get-property g_oex "Workbooks"))

; Открытие файла (книги) и получение указателя книги

(setq g_awb (vlax-invoke-method g_wkbs "Open" tb_xls))

; Проверка открытия файла

(if (not g_awb)

  (progn

    (alert (strcat "Не обнаружен файл " tb_xls))

    (ex_break_connect)

    (exit)

  )

)

; Чтение списка листов; не обязательно активизировать нужный

(setq g_shs (vlax-get-property g_awb "Worksheets"))

; Указатель на лист с нужным именем 

(vlax-for s g_shs (if (= sheetname (vlax-get-property s "Name"))(setq g_mainsh s)))

(if (not g_mainsh)

  (progn

    (alert (strcat "Не обнаружен лист " sheetname))

    (ex_break_connect)

    (exit)

  )

)

;

; Чтение количества строк в будущей таблице спецификации

;  (из ячейки A1 листа Excel), без учета строки заголовков

(setq g_cell

  (vlax-variant-value (vlax-invoke-method g_mainsh "Evaluate" "A1")))

(setq nlines

  (fix (vlax-variant-value (vlax-get-property g_cell "Value"))))

(vlax-release-object g_cell)

; Чтение количества столбцов в будущей таблице спецификации

;  (из ячейки B1 листа Excel)

(setq g_cell

  (vlax-variant-value (vlax-invoke-method g_mainsh "Evaluate" "B1")))

(setq ncolumns

  (fix (vlax-variant-value (vlax-get-property g_cell "Value"))))

(vlax-release-object g_cell)

;

; Получение списка элементов таблицы (ряды 2,3,4, ... Excel)

; Ряд 2 - ширины столбцов в мм

; Ряд 3 - заголовки столбцов

(setq table_items nil j 1)

(repeat (+ nlines 3)

  (setq row nil j (1+ j) i -1)

  (repeat ncolumns

    (setq i (1+ i))

    (setq g_cell

      (vlax-variant-value

        (vlax-invoke-method

          g_mainsh

          "Evaluate"

          (strcat (chr (+ i (ascii "A"))) (itoa j))

        )

      )

    )

    (setq row

      (append

        row

        (list

          (vlax-variant-value

            (vlax-get-property g_cell "Value")

          )

        )

      )

    )

    (vlax-release-object g_cell)

  );repeat ncolumns

  (setq table_items (append table_items (list row)))

);repeat nlines

;

; Закрытие и выгрузка Excel

(ex_break_connect)

;

; Запрос точки левого верхнего угла таблицы

(setq pt0 nil)

(while (null pt0)

  (setq pt0 (getpoint "\nТочка левого верхнего угла таблицы: "))

);while

;

; Список ширин колонок и список типов данных

(setq widths (nth 0 table_items) types (nth 1 table_items))

;

(setq msp (vla-get-ModelSpace (vla-get-activeDocument (vlax-get-acad-object))))

; Создание стандартной таблицы с колонками равной ширины

(setq tbl (vla-AddTable msp (vlax-3d-point pt0) (+ 2 nlines) ncolumns hcell (car widths)))

; Корректировка ширин столбцов

(setq i -1)

(repeat ncolumns

  (setq i (1+ i))

  (vla-SetColumnWidth tbl i (nth i widths))

)

 

; Заголовок таблицы

; Высота букв

(vla-SetTextHeight tbl acTitleRow hlet)

; Текст

(vla-SetText tbl 0 0 "Спецификация")

;

; Заголовки колонок

; Высота букв

(vla-SetTextHeight tbl acHeaderRow hlet)

(setq headers (nth 2 table_items) i -1)

(repeat ncolumns

  (setq i (1+ i))

  (vla-SetText tbl 1 i (nth i headers))

);

;

; Вписывание элементов таблицы

; Высота букв

(vla-SetTextHeight tbl acDataRow hlet)

(setq j 2)

(repeat nlines

  (setq j (1+ j) i -1)

  (repeat ncolumns

    (setq i (1+ i) val (nth i (nth j table_items)))

    (if (= "str" (nth i types))

      (progn

            (vla-SetText tbl (1- j) i val)

        ; Выравнивание в ячейке

        (vla-SetCellAlignment tbl (1- j) i acBottomLeft)

      )

      (progn

            (vla-SetText tbl (1- j) i (rtos val 2 1))

        ; Выравнивание в ячейке

        (vla-SetCellAlignment tbl (1- j) i acBottomRight)

      )

    )

  );repeat ncolumns

);repeat nlines

;

; Восстановление режима эхо-вывода

(setvar "CMDECHO" old_echo)

;

(redraw)

(princ)

)

 

Примеры обращения к программе показаны в комментарии. В обращении нужно указать фактические аргументы основной функции.

 

Тексты вспомогательных программ

 

Листинг 10.3. Функция ex11_set_connect

 

; Установка связи с Excel 2003

; Аргумент:

;   vis = T - сделать Excel видимым;

;   vis = nil - сделать Excel невидимым.

;

(defun ex11_set_connect (vis / )

  (setq g_oex (vlax-get-or-create-object "Excel.Application.11"))

; Если связь не установлена, то аварийно завершить работу

  (if (null g_oex)

    (progn

      (alert "Невозможно запустить Microsoft Excel 2003")

      (exit)

    )

  );if

; Сделать Excel видимым в зхаисимости от параметра vis

 (if vis (vlax-put-property g_oex "Visible" :vlax-true))

)

 

Листинг 10.4. Функция ex_break_connect

 

; Разрыв связи с Excel и выгрузка из памяти

(defun ex_break_connect ( / )

  (vlax-invoke-method g_oex "Quit")

  ; Освобождаем объекты, связанные с Excel,

; для корректной выгрузки Excel из памяти

  (mapcar

    (function (lambda (x)

      (if

        (and x (not (vlax-object-released-p x)))

        (vlax-release-object x)

      )

    ))

    (list g_cell g_mainsh g_shs g_awb g_wkbs g_oex)

  )

; Сборка мусора

  (setq g_cell nil g_mainsh nil g_shs nil g_awb nil g_wkbs nil g_oex nil)

  (gc)

)

 

Перед выполнением операции загрузите все три программы, а затем запустите основную функцию readex11_com в двух вариантах:

 

(readex11_com "d:\\r 16\\readex11.xls" "Спецификация" 8.0 5.0 T) и

(readex11_com "d:\\r 16\\readex11.xls" "Спецификация" 5.0 3.0 nil).

 

Результаты приведены на рис. 10.5 и рис. 10.6.

 

 

Рис. 10.5. Таблица (hcell=8.0, hlet=5.0)

 

 

Рис. 10.6. Таблица (hcell=5.0, hlet=3.0)

 

 

 

Анализ программ

 

После установки связи с MS Excel 2003 основная программа вычисляет последовательно указатели:

g_oex — указатель объекта самого приложения Excel;

g_wkbs — указатель семейства Workbooks;

g_awb — указатель активной книги после открытия файла readex.xls;

g_shs — указатель семейства листов;

g_mainsh — указатель нужного листа (Спецификация).

Затем с помощью метода Evaluate читаются значения, записанные в листе Спецификация в ячейках А1 и В1:

nlines — количество строк или деталей;

ncolumns — количество столбцов в будущей таблице.

Поскольку метод Evaluate возвращает значение типа Variant, то для его сохранения в виде обычного целого числа применяется преобразование типа с помощью функции vlax-variant-value.

Применяя далее тот же метод Evaluate сканируем строки 2-10 листа Спецификация и получаем список table_items из девяти элементов. Каждый элемент также является списком из пяти значений:

 

(30.0 70.0 30.0 40.0 40.0) (“int” “str” “real” “str” “int”)

(“Позиция” “Наименование” “Толщина” “Материал” “Количество”)

(1.0 “Планка” 20.0 “A” 4.0) (3.0 “Плинтус” 30.0 “A” 6.0)

(4.0 “Плита” 50.0 “В” 12.0) (8.0 “Лист” 13.0 “С” 6.0)

(14.0 “Рама” 35.0 “A” 8.0) (16.0 “Накладка” 10.0 “С” 1.0)

 

Первый элемент списка table_items (ширина столбцов) сохраняется для удобства в переменной width, второй элемент (типа значений по столбцам) — в переменной types, а третий (заголовки столбцов) — в переменной headers.

Из списка видно, что все значения, являющиеся как вещественными, так и целыми числами, представлены в вещественном виде. Поэтому при вписывании их в таблицу нужно пользоваться типами “int” или “real”.

После формирования table_items программа ex_break_connect закрывает соединение с табличным процессором Excel и выгружает его из памяти. При этом проверяется, какие сформированы глобальные переменные, содержащие указатели объектов Excel. Их объекты аннулируются с помощью функции vlax-release-object. Это позволяет избежать неприятного процесса, когда приложение Excel не удаляется из памяти. При повторениях процесса количество неудаленных экземпляров приложения растет и может исчерпать всю оперативную память на компьютере.

Далее интерактивно запрашивается точка р0, в которую будет помещен верхний левый угол таблицы спецификации деталей. Цикл, организованный с помощью функции while, исключает возможность пустого ввода нажатием на клавишу Enter. Это можно было бы обеспечить применением функции initget.

Сначала с помощью метода AddTable строится пустая таблица с колонками одинаковой ширины. Затем с помощью метода SetColumnWidth задаются нужные ширины.

Заполнение ячеек данными выполняется в три шага:

·         с помощью метода SetTextHeight задается высота букв текста;

·         с помощью метода SetText задается сам текст;

·         с помощью метода SetCellAlignment задается выравнивание в ячейке.

Для заголовков таблицы и колонок дополнительное выравнивание не выполняется. Используемое по умолчанию выравнивание acmiddleCenter является приемлемым. В методе SetTextHeight в качестве аргумента должен задаваться тип ячеек. Он может принимать значения:

·         acTitleRowдля заголовка таблицы;

·         acHeaderRowдля заголовков колонок;

·         acDataRow — для ячеек с данными.

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

 

 

Источник:

Н.Н. Полещук, "AutoCAD: разработка приложений, настройка и адаптация", издательство "БХВ-Петербург", 2006

Hosted by uCoz