Шаг 163.
Автоматизация Microsoft Excel. Работа с объектами в книге Excel.
Выноски

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

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

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

unit Unit1;

interface

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

type
  TForm1 = class(TForm)
    Button1: TButton;
    Button2: TButton;
    Button3: TButton;
    Memo1: TMemo;
    Label1: TLabel;
    ListBox1: TListBox;
    Label3: TLabel;
    Button4: TButton;
    SpinButton1: TSpinButton;
    SpinButton2: TSpinButton;
    Label2: TLabel;
    Label4: TLabel;
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
    procedure Button3Click(Sender: TObject);
    procedure Button4Click(Sender: TObject);
    procedure ListBox1Click(Sender: TObject);
    procedure Memo1Change(Sender: TObject);
    procedure SpinButton1DownClick(Sender: TObject);
    procedure SpinButton1UpClick(Sender: TObject);
    procedure SpinButton2DownClick(Sender: TObject);
    procedure SpinButton2UpClick(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

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


procedure TForm1.Button1Click(Sender: TObject);
//Создание объекта Excel и отображение окна
begin
  E:=CreateOleObject('Excel.Application');
  E.Visible:=True;
end;

procedure TForm1.Button2Click(Sender: TObject);
//Создание рабочей книги
begin
  E.WorkBooks.Add;
end;


procedure TForm1.Button3Click(Sender: TObject);
//Создание выноски
const msoCalloutThree=3;
var
  left,top:Extended;
begin
  left:=10;
  top:=11;
  if E.ActiveWorkBook.ActiveSheet.Shapes.Count>0 then
  begin
   left:=E.ActiveWorkBook.ActiveSheet.Shapes.
      item(E.ActiveWorkBook.ActiveSheet.Shapes.count).Left+20;
   top:=E.ActiveWorkBook.ActiveSheet.Shapes.
      item(E.ActiveWorkBook.ActiveSheet.Shapes.count).Top+20;
  end;
  E.ActiveWorkBook.ActiveSheet.Shapes.AddCallout(msoCalloutThree,
     left, top, 150, 100);
end;

procedure TForm1.Button4Click(Sender: TObject);
//Заполнить список выносок
var
  a: Integer;
begin
  ListBox1.Items.Clear;
  for a:=1 to E.ActiveWorkBook.ActiveSheet.Shapes.Count do
    ListBox1.Items.Add(E.ActiveWorkBook.ActiveSheet.Shapes.Item(a).Name);
end;

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

procedure TForm1.Memo1Change(Sender: TObject);
//Помещение текста в выноску
begin
  Callout.TextFrame.Characters.Text:=Memo1.Text;
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;

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

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

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

    На рисунке 1 показано, как стала выглядеть выноска, после того как она была создана, а затем были изменены ее координаты конца линии-указателя, при этом использовались общие для объектов Shapes методы и свойства, описанные ранее.


Рис.1. Создание выноски

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

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

    На следующем шаге мы рассмотрим линии.




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