На этом шаге мы рассмотрим пример использования изученного материала.
Изменим процедуру формирования платежного поручения, рассмотренную на 99 шаге. В данном примере мы дополнительно отключим все стандартные панели Word, блокируем доступ пользователя к изменению содержания документа и создадим пользовательскую панель, на которой разместим кнопки сохранения документа, выполнения печати и изменения масштаба отображения документа в окне Word.
procedure TForm1.Button3Click(Sender: TObject); //Создать платежное поручение const wdAllowOnlyFormFields=2; msoBarTop=1; //Панель с кнопками, //расположенная вдоль верхней стороны главного окна msoControlButton=1; //Кнопка msoBarNoMove=4; var i: integer; CB: variant; BTN: variant; begin // Отключаем панели for i:=1 to W.CommandBars.Count do W.CommandBars.Item[i].Enabled:=false; // Создаем новый документ по шаблону W.Documents.Add(ExtractFileDir(Application.ExeName)+ '\Шаблон платежного поручения.dot'); // Подставляем текст. FindAndInsert ('###№ П.П.&','1'); FindAndInsert('###Дата&',datetostr(date)); FindAndInsert('###Вид платежа&','почтой'); FindAndInsert('###Сумма прописью&','Двести пятьдесят рублей сорок копеек'); FindAndInsert ('###Сумма&', '250,40'); FindAndInsert('###ИНН плательщика&', '0000000000'); FindAndInsert('###КПП плательщика&','000000000011'); FindAndInsert('###Плательщик&','ЗАО Селена'); FindAndInsert('###Р/С плательщика&','00000000000000000000'); FindAndInsert('###БИК плательщика&','000000'); FindAndInsert('###К/С плательщика&','00000000000000000000'); FindAndInsert('###ИНН получателя&','1111111111'); FindAndInsert ('###КПП получателя&', '111111111100'); FindAndInsert('###БИК получателя&','111111'); FindAndInsert ('###К/С получателя&', '11111111111111111111'); FindAndInsert ('###Р/С получателя&', '11111111111111111111'); FindAndInsert('###Получатель&','ЗАО Комета'); FindAndInsert ('###В.О.&', ' ') ; FindAndInsert('###H.П.&',' '); FindAndInsert('###Код&',' '); FindAndInsert('###C.П.&',' '); FindAndInsert('###0.П.&',' '); FindAndInsert('###Р.П.&',' '); FindAndInsert('#H1&', ' '); FindAndInsert('#H2&', ' '); FindAndInsert('#H3&', ' '); FindAndInsert('#H4&', ' '); FindAndInsert('#H5&', ' '); FindAndInsert('#H6&',' '); FindAndInsert('#H7&', ' '); FindAndInsert('###Назначение платежа&', 'Оплата за поставку товара'); // Блокируем возможность изменения документа пользователем W.ActiveDocument.Protect(Password:='',NoReset:=False, Type:=wdAllowOnlyFormFields); // Создаем временную неперемещаемую панель CB:=W.CommandBars.Add ('Печать документа' , msoBarTop, False, True); CB.Enabled:=true; CB.Visible:=true; CB.Protection:=msoBarNoMove; // Создаем кнопки на панели for i:=3 to 7 do begin try BTN:=CB.Controls.Add(Type:=msoControlButton, ID:=IntToStr(i)); BTN.Caption := 'ID='+IntToStr(i); except end; end; end;
Результат выполнения процедуры представлен на рисунке 1.
Рис.1. Результат работы приложения
После печати и закрытия документа необходимо восстановить прежний вид панелей. Это нетрудно сделать, используя методы программирования панелей и макросов.
Приведем полный текст приложения. Обратите внимание, что текст функции FindAndInsert() изменился по сравнению с аналогичной функцией из 99 шага.
unit Unit1; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, ComObj, ExtDlgs; type TForm1 = class(TForm) Button1: TButton; Button2: TButton; Button3: TButton; procedure Button1Click(Sender: TObject); procedure Button2Click(Sender: TObject); procedure Button3Click(Sender: TObject); private { Private declarations } public { Public declarations } end; var Form1: TForm1; implementation var W: Variant; {$R *.dfm} procedure TForm1.Button1Click(Sender: TObject); //Создание объекта Word.Application begin W:=CreateOleObject('Word.Application'); end; procedure TForm1.Button2Click(Sender: TObject); //Показать окно Word begin W.Visible:=True; end; function FindAndInsert(FindText,ReplacementText:string):boolean; // Данная функция позволяет находить строку FindText // и подставлять на ее место строку ReplacementText. const wdReplaceAll=2; begin W.Selection.Find.Text:=FindText; W.Selection.Find.Replacement.Text:=ReplacementText; FindAndInsert:=W.Selection.Find.Execute(Replace:=wdReplaceAll); end; procedure TForm1.Button3Click(Sender: TObject); //Создать платежное поручение const wdAllowOnlyFormFields=2; msoBarTop=1; //Панель с кнопками, //расположенная вдоль верхней стороны главного окна msoControlButton=1; //Кнопка msoBarNoMove=4; var i: integer; CB: variant; BTN: variant; begin // Отключаем панели for i:=1 to W.CommandBars.Count do W.CommandBars.Item[i].Enabled:=false; // Создаем новый документ по шаблону W.Documents.Add(ExtractFileDir(Application.ExeName)+ '\Шаблон платежного поручения.dot'); // Подставляем текст. FindAndInsert ('###№ П.П.&','1'); FindAndInsert('###Дата&',datetostr(date)); FindAndInsert('###Вид платежа&','почтой'); FindAndInsert('###Сумма прописью&','Двести пятьдесят рублей сорок копеек'); FindAndInsert ('###Сумма&', '250,40'); FindAndInsert('###ИНН плательщика&', '0000000000'); FindAndInsert('###КПП плательщика&','000000000011'); FindAndInsert('###Плательщик&','ЗАО Селена'); FindAndInsert('###Р/С плательщика&','00000000000000000000'); FindAndInsert('###БИК плательщика&','000000'); FindAndInsert('###К/С плательщика&','00000000000000000000'); FindAndInsert('###ИНН получателя&','1111111111'); FindAndInsert ('###КПП получателя&', '111111111100'); FindAndInsert('###БИК получателя&','111111'); FindAndInsert ('###К/С получателя&', '11111111111111111111'); FindAndInsert ('###Р/С получателя&', '11111111111111111111'); FindAndInsert('###Получатель&','ЗАО Комета'); FindAndInsert ('###В.О.&', ' ') ; FindAndInsert('###H.П.&',' '); FindAndInsert('###Код&',' '); FindAndInsert('###C.П.&',' '); FindAndInsert('###0.П.&',' '); FindAndInsert('###Р.П.&',' '); FindAndInsert('#H1&', ' '); FindAndInsert('#H2&', ' '); FindAndInsert('#H3&', ' '); FindAndInsert('#H4&', ' '); FindAndInsert('#H5&', ' '); FindAndInsert('#H6&',' '); FindAndInsert('#H7&', ' '); FindAndInsert('###Назначение платежа&', 'Оплата за поставку товара'); // Блокируем возможность изменения документа пользователем W.ActiveDocument.Protect(Password:='',NoReset:=False, Type:=wdAllowOnlyFormFields); // Создаем временную неперемещаемую панель CB:=W.CommandBars.Add ('Печать документа' , msoBarTop, False, True); CB.Enabled:=true; CB.Visible:=true; CB.Protection:=msoBarNoMove; // Создаем кнопки на панели for i:=3 to 7 do begin try BTN:=CB.Controls.Add(Type:=msoControlButton, ID:=IntToStr(i)); BTN.Caption := 'ID='+IntToStr(i); except end; end; end; end.
Возможные значения параметра Type метода Protect перечислены в таблице 1.
Константа | Значение |
---|---|
wdAllowOnlyComments | 1 |
wdAllowOnlyFormFields | 2 |
wdAllowOnlyRevisions | 0 |
wdNoProtection | -1 |
В заключение приведем возможные значения параметра Protection.
Константа | Значение |
---|---|
msoBarNoChangeDock | 16 |
msoBarNoChangeVisible | 8 |
msoBarNoCustomize | 1 |
msoBarNoHorizontalDock | 64 |
msoBarNoMove | 4 |
msoBarNoProtection | 0 |
msoBarNoResize | 2 |
msoBarNoVerticalDock | 32 |
Мы рассмотрели возможности объекта Word.Application, обеспечивающие формирование документов Word. Конечно, это далеко не все его возможности, но даже они позволяют создавать документ Word посредством приложений, разработанных в среде Delphi.
Со следующего шага мы начнем рассматривать аналогичные возможности использования объекта Excel.Application в приложениях Delphi.