![]() |
![]() ![]() ![]() ![]() |
|
Автоматизация документов WORDDelphi , Технологии , OLE Automation MSOffice
Оформил: DeeCo Автор: Клименко Константин 1. Для чего и для когоВ настоящий момент везде, или почти везде, для работы с текстовыми документами используется Word от Microsoft. Причем, когда читаешь в объявлениях о приеме на работу программиста в фирму не занимающейся разработкой ПО, то с уверенностью можно сказать, что необходим человек, умеющий работать с офисным пакетом (Word, Excel, Access) от вышеупомянутой фирмы. Поэтому данным материалом хотелось бы показать, как можно в некоторых случаях упростить работу с текстовым редактором Word. Для этого не обязательны знания Delphi на профессиональном уровне, достаточно уметь создавать динамически подключаемые библиотеки (DLL) и знать основы VBA для Word. К тому же макроязыки используются не только в пакете от Microsoft, слышал, что аналог VBA есть и в StarOffice.2. Как подключить DLL в VBA Любая программа может вызвать функцию из DLL, которая написана на Delphi, независимо от того, написана она на Си, Visual Basic или VBA. Первый вопрос, который может волновать - как это сделать в VBA для Word?Для вызова DLL в VBA для Word существует специальная функция: [Public | Private]Declarefunction name Lib "libname"[Alias "aliasname"][([arglist])][as type]Описание функции:
Желательно в VBA создать функцию для вызова DLL. В нашем примере это функция WordTest , которая вызывается MACROBUTTON-ом ({ MACROBUTTON WordTest Кликни здесь }(Вставка => Поле => Автоматизация документа)). 3. Как в Delphi создать DLL Ответ на этот вопрос можно найти во многих справочниках и учебниках по Delphi. Я лишь приведу исходный текст библиотеки.На форме находятся следующие компоненты: Edit1 и Button1, причем Button1.ModalResult = mrOk. Листинг библиотеки (PrjWTest.dpr):
library PrjWTest;
uses
Windows,
Messages,
SysUtils,
Classes,
Graphics,
Controls,
Forms,
Dialogs,
UnitWTest in 'UnitWTest.pas' {FormWTest};
var
//Это наша форма
MyForm: TFormWTest;
{*********************Test************************************}
function Test: PChar; export; stdcall;
var
TmpStr: string;
begin
TmpStr := '';
//Вызываем форму
if MyForm.ShowModal = mrOk then
begin
//Считываем текст с Edit
TmpStr := MyForm.Edit1.Text;
end;
//Желательно указать конец строки
TmpStr := TmpStr + #0;
//Возвращаем текст
Test := PChar(TmpStr);
end;
{*********************MyTest************************************
Данную функцию вызываем из Word}
function MyTest(N: Byte): PChar; export; stdcall;
begin
//Посылаем в Edit число, полученное из Word
MyForm.Edit1.Text := IntToStr(N);
//Вызываем вспомогательную функцию
MyTest := Test;
end;
{*********************MyTest************************************
Создаем форму}
procedure CreateForm; export; stdcall;
begin
MyForm := TFormWTest.Create(Application);
end;
{*********************MyTest************************************
Освобождаем форму}
procedure FreeForm; export; stdcall;
begin
MyForm.Free;
end;
exports
CreateForm Index 1,
MyTest Index 2,
FreeForm Index 3;
//{$R *.RES}
begin
{ Application.Initialize;
Application.CreateForm(TFormGsk, FormGsk);
Application.CreateForm(TDataModule2, DataModule2);
Application.CreateForm(TFormListBoxs, FormListBoxs);
Application.CreateForm(TFormCreateSk, FormCreateSk);
Application.CreateForm(TFormAddKontr, FormAddKontr);
Application.Run;}
end.
При вызове функции MyTest вызывается наша форма, в Edit помещается
переданное число, функция возвращает текст из Edit. Полученную DLL желательно
поместить в папку Windows.
4. Проблемы, возникающие при передаче данных. В данной части хотелось бы обратить внимание на некоторые особенности передачи данных из Delphi в VBA.Во-первых, если передаете текст, то тип передаваемой функции должен быть Pchar, т.к. VBA не понимает типа String. Во-вторых, VBA все равно при выводе текста в документ выдаст ерунду. Поэтому ниже привожу листинг функции, преобразующей полученный текст в "нормальный".
//Приводим полученный текст в "нормальный" текстовый вид
function StrToStr(St as string) as string
Dim EndStr as Long
//Определяем количество символов до конца строки
EndStr = InStr(1, St, Chr$(0))
if EndStr <>
0 then
//Вырезаем и возвращаем нужную информацию
StrToStr = Left(St, EndStr - 1)
else
StrToStr = ""
end if
endfunction
В-третьих, лучше создавать и освобождать формы отдельными функциями,
особенно это видно при работе с базами.
//Подключаемые функции в DLL Declare Sub CreateForm Lib "PrjWTest"() Declarefunction MyTest Lib "PrjWTest"(ByVal Ns as Byte) as string Declare Sub FreeForm Lib "PrjWTest"()5. Как вставлять текст в Word.Это тоже можно найти в справочниках и учебниках по VBA. Но все же приведу несколько советов по этому вопросу. Если строку необходимо вставить в определенное место в тексте, то делаем закладку: Вставка=>Закладка в меню Word. Но лучше использовать две закладки: начало текста и конец. Это может понадобиться в случае замены старого текста на новый (обновление данных). Далее листинг этих функций:
//Переходим к метке Label
Sub GotoBookMark(label as string)
Selection.goto What := wdGoToBookmark, Name := label
with ActiveDocument.Bookmarks
.DefaultSorting = wdSortByName
.ShowHidden = False
end with
end Sub
//Вставляет текст NK между закладками BeginBookM и EndBookM
Sub NewTxt(BeginBookM as string, EndBookM as string, NK as string)
//Переходим к первой закладке
GotoBookMark(BeginBookM)
//Выделяем старый текст между закладками
Selection.Extend
//Переходим к второй закладке
GotoBookMark(EndBookM)
//Отступаем чтобы не захватить закладку
Selection.MoveLeft unit := wdCharacter, Count := 1
//Заменяем старый текст на новый
Selection.TypeText Text := NK
end Sub
И напоследок, листинг основной функции VBA - WordTest, которая вызывает
DLL и вставляет текст между закладками:
Sub WordTest() Dim S1, S2 as string //Загружаем DLL и форму CreateForm //Считываем данные с Edit S1 = MyTest(1) S2 = S1 //Преобразуем в нормальный текст S2 = StrToStr(S2) //Вставляем текст между закладками NewTxt "BeginTest", "EndTest", S2 //Удаляем формы и выгружаем DLL FreeForm Exit Sub end SubИсходники программы и документа прилагаются — AutoWrd.zip (127 K). Автоматизация документов WORD: создание динамически подключаемых библиотек (DLL) для упрощения работы с текстовым редактором Word. Комментарии и вопросыПолучайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш :: Главная :: OLE Automation MSOffice ::
|
||||
©KANSoftWare (разработка программного обеспечения, создание программ, создание интерактивных сайтов), 2007 | ||||