- •Дополнения к учебному пособию о. Б. Малков «Работа с базами данных в среде Delphi»
- •1. Использование текстового процессора Microsoft Word для формирования выходных документов
- •2. Привязка проекта отчета к приложению
- •3. Программа создания справочной системы html Help Workshop
- •3.1. Подготовка справочной информации
- •3.2. Создание файла справки
- •3.3. Компиляция
- •3.4. Вывод справочной информации
- •Библиографический список
Дополнения к учебному пособию о. Б. Малков «Работа с базами данных в среде 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.
Программа-контроллер должна выполнять следующие функции:
проверить, запущено приложение (Word, Excel) или нет;
если приложение не запущено, то запустить его;
выполнить необходимые действия с приложением и документом;
закрыть документ и приложение;
очистить память.
Приложения из состава 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;