Шаг 79.
Автоматизация Microsoft Word. Работа с объектами в документе Word. Выноски

    На этом шаге мы рассмотрим работу с выносками.

    Выноска (объект Callout) является разновидностью надписи. Ее отличие заключается в том, что к прямоугольной области, где размешается текст, добавлена линия-указатель. Общими с надписью для выноски являются свойства заливки и линии для области текста, а также свойства текста. Отличие в том, что у выноски свойства линии применяются и к ломаной линии-указателю. Есть и дополнительный объект Adjustments для описания линии указателя, содержащий описание параметров линии Adjustments.Item(i), где изменяется от 1 до Adjustments.Count (общее количество точек перелом линии). Создается объект-выноска с помощью метода AddCallout(Type, Left Top, Width, Height, Anchor), где

    Создадим выноску с линией-указателем, описываемой тремя точками (msoCalloutThree=3). Для этого используем следующую процедуру, записанную в Delphi. Затем изменим горизонтальную координату внешней точки линии-указателя.

procedure TForm1.Button4Click(Sender: TObject);
//Создание выноски
const
  msoCalloutThree = 3;
begin
  W.ActiveDocument.Shapes.AddCallout(msoCalloutThree,
                 100,10.15,200.25,100);
  Callout:=W.ActiveDocument.Shapes.Item(W.ActiveDocument.Shapes.Count);
  Callout.Line.Visible:=-1;
  Callout.Line.ForeColor.RGB:=126;  //Цвет линии
  Callout.Fill.ForeColor.RGB:=126;  //Цвет заливки выноски
end;

//Изменение горизонтальной координаты
procedure TForm1.SpinButton1DownClick(Sender: TObject);
begin
  Callout.Adjustments.item(1):=Callout.Adjustments.item[1]-0.01;
end;

procedure TForm1.SpinButton1UpClick(Sender: TObject);
begin
  Callout.Adjustments.item(1):=Callout.Adjustments.item[1]+0.01;
end;

    Обратите внимание, что мы добавили в процедуру создания выноски задание цвета линии и цвета заливки выноски.

    Приведем полный текст приложения.

unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, ComObj, Spin, ExtDlgs, ComCtrls;

type
  TForm1 = class(TForm)
    Button1: TButton;
    Button2: TButton;
    Button6: TButton;
    ListBox1: TListBox;
    Label1: TLabel;
    Button3: TButton;
    Button4: TButton;
    Label2: TLabel;
    SpinButton1: TSpinButton;
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
    procedure Button6Click(Sender: TObject);
    procedure Button3Click(Sender: TObject);
    procedure ListBox1Click(Sender: TObject);
    procedure Button4Click(Sender: TObject);
    procedure SpinButton1DownClick(Sender: TObject);
    procedure SpinButton1UpClick(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation
var
  W:Variant;
  WordTextBox:Variant;
  Callout:variant;
{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
//Создание надписи
const msoTextOrientationHorizontal=1;
var
  left,top:Extended;
begin
  left:=10;
  top:=11;
  if W.ActiveDocument.Shapes.Count>0 then begin
   if W.ActiveDocument.Shapes.Item(W.ActiveDocument.Shapes.Count).Left+
     2*(W.ActiveDocument.Shapes.Item(W.ActiveDocument.Shapes.Count).Width+10)<
       W.ActiveDocument.PageSetup.PageWidth
      then begin
      left:=W.ActiveDocument.Shapes.Item(W.ActiveDocument.Shapes.Count).Left+
       W.ActiveDocument.Shapes.Item(W.ActiveDocument.Shapes.Count).Width+10;
      top :=W.ActiveDocument.Shapes.Item(W.ActiveDocument.Shapes.Count).Top;
           end
      else begin
      left:=10;
      top:=W.ActiveDocument.Shapes.Item(W.ActiveDocument.Shapes.Count).Top+
        W.ActiveDocument.Shapes.Item(W.ActiveDocument.Shapes.Count).Height+10.15;
           end;
   end;
   W.ActiveDocument.Shapes.AddTextbox(msoTextOrientationHorizontal,
     left, top, 200, 100, W.ActiveDocument.Range);
end;

procedure TForm1.Button2Click(Sender: TObject);
//Создание нового документа
begin
  W:=CreateOleObject('Word.Application');
  W.Visible:=True;
  W.Documents.Add;
end;

procedure TForm1.Button6Click(Sender: TObject);
//Выход
begin
   W.Quit;
   Close;
end;

procedure TForm1.Button3Click(Sender: TObject);
// Загружаем в ListBoxl имена объектов коллекции Shapes
//из документа Word.
  var
    a: Integer;
begin
  ListBox1.Items.Clear;
  for a:=1 to W.ActiveDocument.Shapes.Count do
    ListBox1.Items.Add(W.ActiveDocument.Shapes.Item(a).Name);
end;

procedure TForm1.ListBox1Click(Sender: TObject);
// При активизации строки объекта ListBox1, используя имя объекта,
// выделяем его из коллекции Shapes и записываем ссылку на этот объект
//в переменную WordTextBox.
begin
  W.ActiveDocument.Shapes.Item(
    ListBox1.Items.Strings[ListBox1.ItemIndex]).Select;
  WordTextBox:=W.ActiveDocument.Shapes.Item(
    ListBox1.Items.Strings[ListBox1.ItemIndex]);
end;


procedure TForm1.Button4Click(Sender: TObject);
//Создание выноски
const
  msoCalloutThree = 3;
begin
  W.ActiveDocument.Shapes.AddCallout(msoCalloutThree,
                 100,10.15,200.25,100);
  Callout:=W.ActiveDocument.Shapes.Item(W.ActiveDocument.Shapes.Count);
  Callout.Line.Visible:=-1;
  Callout.Line.ForeColor.RGB:=126;  //Цвет линии
  Callout.Fill.ForeColor.RGB:=126;  //Цвет заливки выноски
end;

//Изменение горизонтальной координаты
procedure TForm1.SpinButton1DownClick(Sender: TObject);
begin
  Callout.Adjustments.item(1):=Callout.Adjustments.item[1]-0.01;
end;

procedure TForm1.SpinButton1UpClick(Sender: TObject);
begin
  Callout.Adjustments.item(1):=Callout.Adjustments.item[1]+0.01;
end;

end.
Текст этого приложения можно взять здесь (8,9 Кб).

    Результат работы приложения изображен на рисунке 1.


Рис.1. Результат работы приложения

    В заключение приведем значения параметра Type, определяющего тип выноски.

Таблица 1. Тип выноски
Константа Значение
msoCalloutOne 1
msoCalloutOne 2
msoCalloutThree 3
msoCalloutFour 4

    На следующем шаге мы рассмотрим использование линий.




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