Шаг 165.
Автоматизация Microsoft Excel. Работа с объектами в книге Excel.
Произвольные фигуры

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

    Метод AddShape коллекции Shapes предназначен для создания произвольных объектов Shape, в том числе геометрических фигур. Прямые, ломаные и кривые линии создаются посредством специально предназначенных для этого методов, часть которых мы рассмотрели ранее. Синтаксис вызова метода AddShape:

    AddShape:=AddShape(Type, Left, Top, Width, Height);

    Первый аргумент представляет собой целое число и определяет тип создаваемого объекта, например Type:=msoShapeOvalCallout; соответствует овальной выноске. Число всех возможных типов геометрических фигур составляет несколько десятков. Величины этих констант можно найти в редакторе Visual Basic. Значения аргументов Left, Top, Width, Height определяют положение и размеры создаваемого объекта и имеют тип Extended.

    Приведем пример приложения, позволяющего создать произвольную фигуру и настроить в ней положение текста.

unit Unit1;

interface

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

type
  TForm1 = class(TForm)
    Button1: TButton;
    Button2: TButton;
    Button3: TButton;
    ListBox1: TListBox;
    Label3: TLabel;
    Button4: TButton;
    Label2: TLabel;
    Edit1: TEdit;
    UpDown1: TUpDown;
    Label1: TLabel;
    Memo1: TMemo;
    Button5: TButton;
    Label4: TLabel;
    ComboBox1: TComboBox;
    Label5: TLabel;
    ComboBox2: TComboBox;
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
    procedure Button3Click(Sender: TObject);
    procedure Button4Click(Sender: TObject);
    procedure ListBox1Click(Sender: TObject);
    procedure Button5Click(Sender: TObject);
    procedure ComboBox1Change(Sender: TObject);
    procedure ComboBox2Change(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation
var
  E:variant;
  Shape: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);
//Создание фигуры
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.AddShape(
     StrToInt(Edit1.Text),left, top, 300, 200);
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 и записываем ссылку на этот объект
//в переменную Shape.
begin
  Shape:=E.ActiveWorkBook.ActiveSheet.Shapes.Item(
    ListBox1.Items.Strings[ListBox1.ItemIndex]);
end;


procedure TForm1.Button5Click(Sender: TObject);
//Добавление текста
begin
  Shape.TextFrame.Characters.Text:=Memo1.Text;
end;

procedure TForm1.ComboBox1Change(Sender: TObject);
//Задание горизонтального выравнивания
begin
 case ComboBox1.ItemIndex of
  0: Shape.TextFrame.HorizontalAlignment:=-4108; //xlHAlignCenter
  1: Shape.TextFrame.HorizontalAlignment:=7;     //xlHAlignCenterAcrossSelection
  2: Shape.TextFrame.HorizontalAlignment:=-4117; //xlHAlignDistributed
  3: Shape.TextFrame.HorizontalAlignment:=5;     //xlHAlignFill
  4: Shape.TextFrame.HorizontalAlignment:=1;     //xlHAlignGeneral
  5: Shape.TextFrame.HorizontalAlignment:=-4130; //xlHAlignJustify
  6: Shape.TextFrame.HorizontalAlignment:=-4131; //xlHAlignLeft
  7: Shape.TextFrame.HorizontalAlignment:=-4152; //xlHAlignRight
 end;
end;

procedure TForm1.ComboBox2Change(Sender: TObject);
//Задание вертикального выравнивания
begin
 case ComboBox2.ItemIndex of
  0: Shape.TextFrame.VerticalAlignment:=-4107; //xlHAlignRight
  1: Shape.TextFrame.VerticalAlignment:=-4108; //xlVAlignCenter
  2: Shape.TextFrame.VerticalAlignment:=-4117; //xlVAlignDistributed
  3: Shape.TextFrame.VerticalAlignment:=-4130; //xlVAlignJustify
  4: Shape.TextFrame.VerticalAlignment:=-4160; //xlVAlignTop
 end;
end;

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

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


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

    Текст в созданный объект добавляем с помощью тех же методов, что и при работе с объектом Callout, т.к. методы и свойства области текста (TextFrame) для двух этих объектов полностью идентичны.

    На следующем шаге мы рассмотрим объекты WordArt.




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