Пример программы. Работа с OLE-сервером Word.
1. Постановка задачи.
Генеральный директор некоторой фирмы "Рога и копыта" г. Бендер
потребовал от своего зама подавать ему три раза в неделю в писменном
виде обобщенные данные о работе отделов фирмы. Причем данные
от различных отделов по дням недели. И хотя отделов и немного,
(а если бы было 100?) но даже заставив всех подать данные в виде
файлов Word, все же необходимо самому их компоновать, писать заголовок.
Заместитель Балаганов пошел по простому пути - заказал на остатки
Корейковских денег программку, которая бы объединяла
документы, подаваемые подчиненными в один.
Программист установил для каждого из отделов имя .doc документа и
добился, чтобы они заполняли этот документ и помещали в некотурую директорию.
Програмке осталось собрать документы в один и напечатать шапочку как
например показано на рисунке. Естественно, что текст каждого документа может
быть и гораздо больше и, вообще, сколь угодно длинным.
В начало
2. Описание программы.
Для реализации программы на форму помещены компоненты:
12 компонентов TButton. Кнопки не переименовывались (номера
кнопок отмечены красным).
Компонент TListBox. Свойство Sorted true.
Компонент TMaskEdit. Маска !99.99.0000;1;_.
При старте программы доступны для нажатия три кнопочки (1-3) -
с их помощью осуществляется выбор из директории где хранятся документы
списка файлов этих документов. Все остальные действия выполняются
также нажатием кнопочек. Выполняемые действия соответствуют Caption
кнопки. Дата для имени итогового файла и заглавия документа берется
из MaskEdit. Имена сохраняемых файлов:
Программа при работе отображает один итоговый документ Word в
котором можно наблюдать процесс его формирования.
Принцип работы программы:
1. При нажатии кнопочек 1-3 просматривается директория
с документами и выбраются имена файлов в ListBox,
причем файлы выбираются по признаку дня недели.
2. Кнопочками 6-7 если нужно убираются отдельные файлы или
производится сортировка.
3. Кнопочками 4-5 осуществляется вставка текста из
исходных файлов в документ. Передача производится через буфер обмена
Windows.
4. При нажатии кнопочки 4 или первом нажатии формируется
заголовок документа. Названия раздела извлекаются из имени файла.
5. Кнопочки 8-12 служат для сохранения файлов.
В начало
3. Текст программы.
Файл account.cpp:
#include
#include
#include
#include
#pragma hdrstop
#include "account.h"
//--------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
//Переменные для OLE серверов Word
Variant vVarApp,vVarDocs,vVarDoc,
vVarParagraphs,vVarParagraph;
Variant vVarApp1,vVarDocs1,vVarDoc1;
//Рабочая директория где файлы для сбора в документ
AnsiString vasWorkDir="C:\\Bulletins";
//--------------------------------------------------
// Конструктор
//--------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
: TForm(Owner)
{
}
//--------------------------------------------------
// При создании формы
//--------------------------------------------------
void __fastcall
TForm1::FormCreate(TObject *Sender)
{
//Флаги серверов OLE
fStart=false;
fStart1=false;
//Флаг переноса по одному документу
fSingle=false;
//Заносим дату для отображения в документе
AnsiString Format = "dd.mm.yyyy";
tdate = tdate.CurrentDate();
MaskEdit1->Text = tdate.FormatString(Format);
//Тип отчета, Вторник=0, Четверг=1, Суббота=1
viTip=0;
}
//--------------------------------------------------
// Чтение имен файлов с документами
//--------------------------------------------------
void __fastcall
TForm1::Button1Click(TObject *Sender)
{
AnsiString vasFilename, //имя файла
vasFileMask; //маска файла
//TSearchRec информация о файле
TSearchRec tFileInfo;
//Задаем маску
vasFileMask="*.doc";
//ОБудем определять имена файлов в ListBox1
ListBox1->Items->Clear();
vasFilename=vasWorkDir+"\\"+vasFileMask;
//Находим первый файл с расширением .doc
if(FindFirst(vasFilename,faAnyFile,tFileInfo) == 0)
{
while(1)
{
//Выделяем имя файла
AnsiString s=Trim(tFileInfo.Name);
switch(viTip)
{
//Выбираем файлы относящиеся к выбранному дню недели:
case 0:
//0.На первом месте В, на втором Т
if(s.IsDelimiter("В",1) && s.IsDelimiter("Т",2))
ListBox1->Items->Add(s);
break;
case 1:
//1.На первом месте Ч, на втором Е
if(s.IsDelimiter("Ч",1) && s.IsDelimiter("Е",2))
ListBox1->Items->Add(s);
break;
case 2:
//2.На первом месте С, на втором У
if(s.IsDelimiter("С",1) && s.IsDelimiter("У",2))
ListBox1->Items->Add(s);
break;
}//switch(viTip)
//Выходим если нет более файлов DOC в директории
if(FindNext(tFileInfo) != 0) break;
}//while(1)
}//if(FindFirst(vasFilename,faAnyFile,tFileInfo) == 0)
//Разрешаем работу с кнопками
Button4->Enabled=true;
Button5->Enabled=true;
Button6->Enabled=true;
Button7->Enabled=true;
Button2->Enabled=false;
Button3->Enabled=false;
Button1->Enabled=false;
}
//--------------------------------------------------
// Включение в отчет всех документов
//--------------------------------------------------
void __fastcall
TForm1::Button4Click(TObject *Sender)
{
fSingle=false;
vWork();
}
//--------------------------------------------------
// Включение в отчет очередного документа(по одному)
//--------------------------------------------------
void __fastcall
TForm1::Button5Click(TObject *Sender)
{
fSingle=true;
vWork();
ListBox1->Items->Delete(0);
}
//--------------------------------------------------
// Пропуск документа
//--------------------------------------------------
void __fastcall
TForm1::Button6Click(TObject *Sender)
{
ListBox1->Items->Delete(0);
if(ListBox1->Items->Count == 0)
{
Button4->Enabled=false;
Button5->Enabled=false;
Button6->Enabled=false;
Button7->Enabled=false;
Caption="Отчет о работе фирмы сформирован";
}
}
//--------------------------------------------------
// Основная функция для добавления документа
//--------------------------------------------------
void __fastcall
TForm1::vWork()
{
Button8->Enabled=true;
Button9->Enabled=true;
Button10->Enabled=true;
Button11->Enabled=true;
//Если не создан сервер для основного документа
if(!fStart)
{
try
{
//Создаем сервер Word
vVarApp=CreateOleObject("Word.Application");
//Будем смотреть как формируется документ
vVarApp.OlePropertySet("Visible",true);
vVarDocs=vVarApp.OlePropertyGet("Documents");
//Добавляем один документ в отчет
vVarDocs.OleProcedure("Add");
//И работать будем с этим документом
vVarDoc=vVarDocs.OleFunction("Item",1);
//Добавляем параграф и выводим в него текст ЗАГЛАВИЯ
vVarParagraphs=vVarDoc.OlePropertyGet("Paragraphs");
vVarDoc.OleProcedure("Activate");
vVarParagraphs.OleProcedure("Add");
AnsiString str="Отчет о работе фирмы \"РОГА и КОПЫТА\" за";
vVarParagraph=vVarParagraphs.OleFunction("Item",1);
vVarParagraph.OlePropertyGet("Range").
OlePropertySet("Text",str.c_str());
// Устанавливаем атрибуты текста
vVarParagraph.OlePropertySet("Alignment",1);
Variant v=vVarParagraph.OlePropertyGet("Range").
OlePropertyGet("Font");
v.OlePropertySet("Color",clRed);
v.OlePropertySet("Size",16);
v.OlePropertySet("Name","Times New Roman");
v.OlePropertySet("Bold",true);
v.OlePropertySet("Italic",true);
v.OlePropertySet("Underline",1);
//Добавляем еще один параграф и выводим в него дату
v=vVarApp.OlePropertyGet("Selection");
v.OleFunction("EndKey");
v.OleFunction("TypeParagraph");
vVarParagraphs.OleProcedure("Add");
vVarParagraph=vVarParagraphs.OleFunction("Item",2);
AnsiString vasd0=MaskEdit1->Text;
AnsiString vasd1=(AnsiString)vasd0[1]+ (AnsiString)vasd0[2];
viDay=vasd1.ToInt();
vasd1=(AnsiString)vasd0[4]+(AnsiString)vasd0[5];
viMon=vasd1.ToInt();
vasd1=(AnsiString)vasd0[7]+(AnsiString)vasd0[8] +
(AnsiString)vasd0[9]+(AnsiString)vasd0[10];
viYear=vasd1.ToInt();
//Выводим текст
char szBuf[40];
wsprintf(szBuf,"%d.%d.%04d г.",viDay,viMon,viYear);
vVarParagraph.OlePropertyGet("Range").
OlePropertySet("Text",szBuf);
v=vVarApp.OlePropertyGet("Selection");
//Делаем отступ от заглавия еще два параграфа
v.OleFunction("EndKey");
v.OleFunction("TypeParagraph");
vVarParagraphs.OleProcedure("Add");
//Убираем подчеркивание, чтобы не отображалось в HTML
vVarParagraph.OlePropertyGet("Range").OlePropertyGet("Font").
OlePropertySet("Underline",0);
v.OleFunction("EndKey");
v.OleFunction("TypeParagraph");
vVarParagraphs.OleProcedure("Add");
v.OleFunction("EndKey");
v.OleFunction("TypeParagraph");
//Текущий парагоаф - четвертый
vVarParagraph=vVarParagraphs.OleFunction("Item",4);
if(!fSingle)
{
Button5->Enabled=false;
Button6->Enabled=false;
Button7->Enabled=false;
}
//Сервер Word запущен
fStart=true;
}
catch(...)
{
MessageBox(0, "Ошибка при открытии сервера Word",
"Ошибка", MB_OK);
return;
}
}
//Начинаем добавлять документы или все или по одному
int number=1;
if(!fSingle) number=ListBox1->Items->Count;
for(int i=0; i < number; i++)
{
try
{
vVarApp1=CreateOleObject("Word.Application");
//Чтобы не мешался уберем
//vVarApp1.OlePropertySet("Visible",true);
fStart1=true;
}
catch(...)
{
MessageBox(0, "Ошибка при открытии сервера Word\n"
"для переносимого документа",
"Ошибка", MB_OK);
return;
}
AnsiString s=Trim(ListBox1->Items->Strings[i]);
vVarDocs1=vVarApp1.OlePropertyGet("Documents");
//Печатаем заголовок раздела из имени файла
vCaptionChapter(s);
//Где файл
s=vasWorkDir+"\\"+s;
//Добавляем его
vAddWord(s);
}
//Если добавляли не по одному - чистим (все добавлено)
if(!fSingle) ListBox1->Items->Clear();
if(ListBox1->Items->Count == 0)
{
Button4->Enabled=false;
Button5->Enabled=false;
Button7->Enabled=false;
Button11->Enabled=false;
Caption="Отчет сформирован, можно внести исправления";
}
}
//--------------------------------------------------
// Печать заголовка раздела из имени файла
//--------------------------------------------------
void __fastcall
TForm1::vCaptionChapter(AnsiString s)
{
//Убираем расширение после точки в имени файла
s.SetLength(s.LastDelimiter("."));
s=s.SubString(s.Pos("_")+1,s.Length()-s.Pos("_")+1);
if(s[1] == '0') s[1]=' ';
//Работаем с основным документом и с первой страницей
try
{
vVarDoc=vVarDocs.OleFunction("Item",1);
vVarParagraphs=vVarDoc.OlePropertyGet("Paragraphs");
vVarDoc.OleProcedure("Activate");
//Добавляем параграф
vVarParagraphs.OleProcedure("Add");
////vVarParagraph=vVarParagraphs.OleFunction("Item",nom);
//Выводим текст в данный параграф
vVarParagraph.OlePropertyGet("Range").
OlePropertySet("Text",s.c_str());
// Устанавливаем атрибуты текста
vVarParagraph.OlePropertySet("Alignment",1);
//Шрифт текста
Variant v=vVarParagraph.OlePropertyGet("Range").
OlePropertyGet("Font");
v.OlePropertySet("Color",clBlue);
v.OlePropertySet("Size",14);
v.OlePropertySet("Name","Times New Roman");
v.OlePropertySet("Bold",true);
v.OlePropertySet("Italic",true);
v.OlePropertySet("Underline",1);
//Уходим в конец
v=vVarApp.OlePropertyGet("Selection");
v.OleFunction("EndKey");
//Добавляем параграф для вставки
v.OleFunction("TypeParagraph");
vVarParagraphs.OleProcedure("Add");
vVarParagraph.OlePropertyGet("Range").OlePropertyGet("Font").
OlePropertySet("Underline",0);
}
catch(...)
{
MessageBox(0,
"Ошибка при печати заголовка очередного документа",
"Ошибка", MB_OK);
return;
}
}
//--------------------------------------------------
// Сохранить .doc
//--------------------------------------------------
void __fastcall
TForm1::Button8Click(TObject *Sender)
{
Button4->Enabled=false;
Button5->Enabled=false;
Button6->Enabled=false;
Button7->Enabled=false;
if(fStart)
{
char szBuf[MAX_PATH];
wsprintf(szBuf,"%s\\Report%d.%d.%04d.doc",
vasWorkDir,viDay,viMon,viYear);
try
{
vVarDoc=vVarDocs.OleFunction("Item",1);
vVarApp.OlePropertySet("DisplayAlerts",false);
vVarDoc.OleProcedure("SaveAs",szBuf,0,false,"",true,"",
false,false,false,false,false);
}
catch(...)
{
MessageBox(0,
"Ошибка при сохранении документа в формате .doc",
"Ошибка", MB_OK);
return;
}
if(Button9->Enabled == false)
{
vVarApp.OleProcedure("Quit");
fStart=false;
Button11->Enabled=false;
Button12->Caption="Выйти";
}
Button8->Enabled=false;
Button10->Enabled=false;
}//if(fStart)
}
//--------------------------------------------------
// Сохранить .html
//--------------------------------------------------
void __fastcall
TForm1::Button9Click(TObject *Sender)
{
Button4->Enabled=false;
Button5->Enabled=false;
Button6->Enabled=false;
Button7->Enabled=false;
if(fStart)
{
char szBuf[MAX_PATH];
wsprintf(szBuf,"%s\\Report%d.%d.%04d.htm",
vasWorkDir,viDay,viMon,viYear);
try
{
vVarDoc=vVarDocs.OleFunction("Item",1);
vVarApp.OlePropertySet("DisplayAlerts",false);
vVarDoc.OleProcedure("SaveAs",szBuf,8,false,"",true,"",
false,false,false,false,false);
}
catch(...)
{
MessageBox(0,
"Ошибка при сохранении документа в формате .html",
"Ошибка", MB_OK);
return;
}
if(Button8->Enabled == false)
{
vVarApp.OleProcedure("Quit");
fStart=false;
Button11->Enabled=false;
Button12->Caption="Выйти";
}
Button9->Enabled=false;
Button10->Enabled=false;
}//if(fStart)
}
//--------------------------------------------------
// Сохранить сразу .doc и .html
//--------------------------------------------------
void __fastcall
TForm1::Button10Click(TObject *Sender)
{
Button8Click(NULL);
Button9Click(NULL);
}
//--------------------------------------------------
// Сохранить сразу .doc и .html и выйти
//--------------------------------------------------
void __fastcall
TForm1::Button11Click(TObject *Sender)
{
Button9Click(NULL);
Button8Click(NULL);
if(fStart)
vVarApp.OleProcedure("Quit");
if(fStart1)
vVarApp1.OleProcedure("Quit");
Close();
}
//--------------------------------------------------
// Выйти без сохранения
//--------------------------------------------------
void __fastcall
TForm1::Button12Click(TObject *Sender)
{
if(fStart)
{
char szBuf[MAX_PATH];
wsprintf(szBuf,"C:\\a.doc");
vVarDoc=vVarDocs.OleFunction("Item",1);
vVarApp.OlePropertySet("DisplayAlerts",false);
vVarDoc.OleProcedure("SaveAs",szBuf,1,false,"",true,"",
false,false,false,false,false);
vVarApp.OleProcedure("Quit");
}
if(fStart1)
{
vVarApp1.OlePropertySet("DisplayAlerts",false);
vVarApp1.OleProcedure("Quit");
}
Close();
}
//--------------------------------------------------
// Первый в конец списка
//--------------------------------------------------
void __fastcall
TForm1::Button7Click(TObject *Sender)
{
ListBox1->Sorted=false;
AnsiString s=Trim(ListBox1->Items->Strings[0]);
ListBox1->Items->Delete(0);
ListBox1->Items->Add(s);
}
//--------------------------------------------------
void __fastcall
TForm1::Button2Click(TObject *Sender)
{
viTip=1;
Button1Click(NULL);
}
//--------------------------------------------------
void __fastcall
TForm1::Button3Click(TObject *Sender)
{
viTip=2;
Button1Click(NULL);
}
//--------------------------------------------------
void __fastcall
TForm1::vAddWord(AnsiString s)
{
try
{
//Читаем очередной документ
vVarDocs1.OleProcedure("Open",s.c_str());
//Выделяем его
Variant v1=vVarApp1.OlePropertyGet("Selection");
v1.OleFunction("WholeStory");
//Копируем в буфер
v1.OleFunction("Copy");
//Из буфера обмена добавляем в основной документ
Variant v=vVarApp.OlePropertyGet("Selection");
v.OleFunction("Paste");
//Добавляем пустой параграф
v.OleFunction("EndKey");
v.OleFunction("TypeParagraph");
//Выходим из добавленного
vVarApp1.OleProcedure("Quit");
fStart1=false;
s=Trim(ListBox1->Items->Strings[1]);
}
catch(...)
{
MessageBox(0, "Ошибка при добавлении документа",
"Ошибка", MB_OK);
return;
}
}
//--------------------------------------------------
Файл account.h
#ifndef accountH
#define accountH
#include
#include
#include
#include
#include
#include
//--------------------------------------------------
class
TForm1 : public TForm
{
__published:
TListBox *ListBox1;
TButton *Button1;
TButton *Button4;
TButton *Button5;
TButton *Button6;
TButton *Button8;
TButton *Button9;
TButton *Button10;
TButton *Button11;
TButton *Button12;
TButton *Button7;
TMaskEdit *MaskEdit1;
TButton *Button2;
TButton *Button3;
TMemo *Memo1;
void __fastcall FormCreate(TObject *Sender);
void __fastcall Button1Click(TObject *Sender);
void __fastcall Button4Click(TObject *Sender);
void __fastcall Button5Click(TObject *Sender);
void __fastcall Button6Click(TObject *Sender);
void __fastcall Button9Click(TObject *Sender);
void __fastcall Button10Click(TObject *Sender);
void __fastcall Button11Click(TObject *Sender);
void __fastcall Button12Click(TObject *Sender);
void __fastcall Button7Click(TObject *Sender);
void __fastcall Button2Click(TObject *Sender);
void __fastcall Button3Click(TObject *Sender);
void __fastcall Button8Click(TObject *Sender);
private:
bool fStart,fStart1,fStart2;
bool fSingle;
int viDay,viMon,viYear;
int viTip;
void __fastcall vWork();
void __fastcall vCaptionChapter(AnsiString s);
void __fastcall vAddWord(AnsiString s);
TDateTime tdate;
public:
__fastcall TForm1(TComponent* Owner);
};
//--------------------------------------------------
extern PACKAGE TForm1 *Form1;
//--------------------------------------------------
#endif
В начало
Введение
Работа с OLE-сервером Excel
Работа с OLE-сервером Word
Домой