Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
СРС_проект_ИС_доп.doc
Скачиваний:
6
Добавлен:
11.08.2019
Размер:
638.98 Кб
Скачать

Дополнения к учебному пособию о. Б. Малков «Работа с базами данных в среде Delphi»

1. Использование текстового процессора Microsoft Word для формирования выходных документов

Приложение, разрабатываемое в среде визуального программирования Delphi, может использовать для формирования выходных документов, экспорта и импорта информации и т.д. приложения Microsoft Office (например, текстовый процессор MS Word или процессор электронных таблиц MS Excel).

Текстовый процессор MS Word и процессор электронных таблиц MS Excel являются COM-объектами (Component Object Model, компонентная модель объектов). Это означает, что любая программа, написанная для современных версий Windows, может управлять этими объектами, если она поддерживает интерфейс COM. В данном случае Word или Excel является сервером автоматизации, а управляющая внешняя программа, разрабатываемая программистом, является контроллером автоматизации.

Применение контроллеров автоматизации в приложениях, созданных в среде Delphi, позволяет создавать документы со всеми возможными элементами так же просто, как при обычной работе с Word или Excel.

Программа-контроллер должна выполнять следующие функции:

  1. проверить, запущено приложение (Word, Excel) или нет;

  2. если приложение не запущено, то запустить его;

  3. выполнить необходимые действия с приложением и документом;

  4. закрыть документ и приложение;

  5. очистить память.

Приложения из состава Microsoft Office представляют собой взаимосвязанные объекты и коллекции объектов. На вершине объектной модели находятся объекты Word.Application для MS Word и Excel.Application для MS Excel.

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

Универсальным инструментом для создания отчетов в формате Word и Excel является библиотека ComObj Delphi. Достаточно одной функции из этой библиотеки – CreateOleObject, используемой для позднего связывания – когда в момент написания и компиляции исходного текста программы неизвестно, будет работать приложение или нет. При позднем связывании ошибки синтаксиса проявляются только в момент выполнения программы.

Дополним наше приложение Sale функцией формирования выходного документа «Товаротранспортная накладная» с помощью текстового процессора MS Word. Свяжем вызов этой функции с соответствующим пунктом контекстного меню рабочей формы «Обработка накладных». Откроем модуль формы fmObrNakUnit и подключим библиотеку ComObj:

unit fmObrNakUnit;

interface

uses

ComObj;

Щелкнем правой кнопкой мыши на компоненте PopupMenu1, расположенном на этой форме. Выберем пункт Menu Designer. Для третьего элемента меню (объект N3) в свойстве Caption укажем – «Печать ТТН». Напишем процедуру обработки события OnClick для этого элемента меню:

procedure TFObrNak.N3Click(Sender: TObject);

var W, table_: variant;

a_,Row_,Column_, k_: integer;

sum_: currency;

// Функция FindAndInsert находит текстовую константу и подставляет

// на ее место текст

function FindAndInsert(FindText,ReplacementText:string):boolean;

const wdReplaceAll=2;

begin

W.Selection.Find.Text:=FindText;

W.Selection.Find.Replacement.Text:=ReplacementText;

FindAndInsert:=W.Selection.Find.Execute(Replace:=wdReplaceAll);

еnd;

// Функция FindRowColumnInTable находит текстовую константу и

// возвращает таблицу, а также номер строки и столбца где находится

// эта константа

function FindRowColumnInTable(FindText: string; var tab: variant;

var Row,Column:integer):boolean;

begin

FindRowColumnInTable:=false;

try

W.Selection.Find.Text:=FindText;

if W.Selection.Find.Execute then begin

Column:=W.Selection.Cells.Item(1).ColumnIndex;

Row:=W.Selection.Cells.Item(1).RowIndex;

tab:=W.Selection.Tables.Item(1);

FindRowColumnInTable:=true;

end;

except

FindRowColumnInTable:=false;

end;

end;

begin

// Создаем объект Word.Application и поместим ссылку на него

// в переменную W: variant

W:=CreateOleObject('Word.Application');

// Сделаем окно приложения Word видимым

W.Visible:=true;

// Отобразим все необходимые панели управления приложения Word

for a_:=1 to W.CommandBars.Count do

W.CommandBars.Item[a_].Enabled:=true;

// Создаем новый документ по шаблону

W.documents.Add(ExtractFileDir(Application.ExeName)+'\Шаблон ТТН.dot');

messagebox(handle,

'Шаблон создан! Переходим к заполнению.','Внимание!',0);

// Подставляем текст в заголовок документа

FindAndInsert('###НОМЕР&',DM.Naklad.Fields[0].AsString);

FindAndInsert('###Дата&',DateToStr(DM.Naklad.Fields[1].AsDateTime));

FindAndInsert('###ПРОДАВЕЦ&','ОАО Балтика');

FindAndInsert('###АДРЕС_ПРОДАВЦА&',

'г. Санкт-Петербург, ул. Кузнечная, 5');

FindAndInsert('###ИНН_ПРОДАВЦА&','1234567890');

FindAndInsert('###ГРУЗООТПРАВИТЕЛЬ&','ОАО Балтика');

FindAndInsert('###ГРУЗОПОЛУЧАТЕЛЬ&',DM.Zakazcik.Fields[1].AsString+

' г. Санкт-Петербург, '+DM.Zakazcik.Fields[2].AsString);

FindAndInsert('###ДОКУМЕНТ&',' ');

FindAndInsert('###ДАТА_ДОКУМЕНТА&',' '{datetostr(date)});

FindAndInsert('###ПОКУПАТЕЛЬ&',DM.Zakazcik.Fields[1].AsString);

FindAndInsert('###АДРЕС_ПОКУПАТЕЛЯ&',' г. Санкт-Петербург, '

+DM.Zakazcik.Fields[2].AsString);

FindAndInsert('###ИНН_ПОКУПАТЕЛЯ&','0987654321');

// Если нашли текстовую константу, то переходим к формированию

// табличной части

if FindRowColumnInTable('###ТАБЛИЦА&',table_,Row_,Column_)then begin

// Перед началом формирования курсор находится в таблице table_

// в ячейке Cell(Row_,Column_)

k_:=0;

if not DM.Snakl.IsEmpty then

with DM.Snakl do

begin

First;

repeat k_:=k_+1;

until not FindNext;

end;

sum_:=0;

// Добавляем в таблицу необходимое количество пустых строк

if k_>1 then W.Selection.InsertRows(k_-1);

// Формируем табличную часть документа

if not DM.Snakl.IsEmpty then

with DM.Snakl do

begin

First;

repeat

table_.Cell(Row_,Column_+0).Range.Text:=DM.Izdelie.Fields[1].AsString;

table_.Cell(Row_,Column_+1).Range.Text:=DM.Izdelie.Fields[2].AsString;

table_.Cell(Row_,Column_+2).Range.Text:=

IntToStr(DM.Snakl.Fields[2].AsInteger);

table_.Cell(Row_,Column_+3).Range.Text:=

CurrToStr(DM.Izdelie.Fields[3].AsCurrency);

table_.Cell(Row_,Column_+4).Range.Text:=

CurrToStr(DM.Snakl.Fields[5].AsCurrency);

table_.Cell(Row_,Column_+6).Range.Text:=' ';

table_.Cell(Row_,Column_+7).Range.Text:=' ';

table_.Cell(Row_,Column_+8).Range.Text:=' ';

sum_:=sum_+DM.Snakl.Fields[5].AsCurrency;

Inc(Row_);

until not FindNext;

end;

// Формируем подпись табличной части документа

if FindRowColumnInTable('###ИТОГ&',table_,Row_,Column_)then begin

table_.Cell(Row_,Column_+0).Range.Text:=CurrToStr(sum_);

table_.Cell(Row_,Column_+1).Range.Text:=' ';

table_.Cell(Row_,Column_+2).Range.Text:=' ';

end;

end;

// Заполняем текст в окончании документа

FindAndInsert('###ВСЕГО_К_ОПЛАТЕ&',

CurrToStr(DM.Naklad.Fields[2].AsCurrency)+' руб.');

// Изменяем масштаб отображения документа

W.ActiveWindow.ActivePane.View.Zoom.Percentage:=100;

// Сохраняем документ на диске

W.ActiveDocument.SaveAs('ТТН');

if W.ActiveDocument.Saved

then messagebox(handle,'Документ сохранен!','Внимание!',0)

else messagebox(handle,'Документ не сохранен!','Внимание!',0);

// Закрываем документ и приложение Word, освобождаем память

W.ActiveDocument.Close;

W.Quit;

W:=UnAssigned;

end;