Шаг 114.
Автоматизация Microsoft Word. Программирование свойств MS Word. Пример программирования панели

    На этом шаге мы рассмотрим пример использования изученного материала.

    Изменим процедуру формирования платежного поручения, рассмотренную на 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.
Текст этого приложения вместе с шаблоном можно взять здесь (12,6 Кб).

    Возможные значения параметра Type метода Protect перечислены в таблице 1.

Таблица 1. Возможные значения параметра Type
Константа Значение
wdAllowOnlyComments 1
wdAllowOnlyFormFields 2
wdAllowOnlyRevisions 0
wdNoProtection -1

    В заключение приведем возможные значения параметра Protection.

Таблица 2. Возможные значения параметра 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.




Предыдущий шаг Содержание Следующий шаг