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

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

    Рассмотрим методы элементов коллекции на примере коллекции объектов TextBox, которую мы до создали на предыдущем шаге. Для доступа к элементам коллекции используем свойство Item(i), которое возвращает объект, где i - индекс или имя объекта. Например:

    WordTextBox:=W.ActiveDocument.Shapes.Item(1);

    Данный оператор запишет в переменную WordTextBox: variant ссылку на первый объект коллекции.

    Общими свойствами и методами для объектов коллекции Shapes являются размеры, координаты размещения объектов и некоторые методы, например Delete и Select. Следующие операторы соответственно выполняют выделение объекта, выбранного с помощью предыдущего оператора, изменение его координаты и удаление:

    WordTextBox.Select; 
    WordTextBox.Left:=10; 
    WordTextBox.Delete;

    Поскольку коллекция Shapes может содержать разнородные объекты, эти объекты могут обладать и особыми свойствами. Объекты TextBox, созданные методом AddTextBox и рассмотренные в примере предыдущего шага, предназначены для отображения текста, поэтому для них специфичны свойства и методы для работы с текстом. Рассмотрим их.

    Основным объектом, принадлежащим объекту TextBox и содержащим текст и его характеристики, является объект TextFrame. Он определяет границы области текста внутри рамки надписи, направление текста и некоторые другие характеристики. В свою очередь объект TextFrame включает в себя объект Range, который содержит текст и характеристики шрифта. Рассмотрим следующую форму и исходный текст Delphi для манипуляций с текстом объекта TextBox.

unit Unit1;

interface

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

type
  TForm1 = class(TForm)
    Button1: TButton;
    Button2: TButton;
    Button6: TButton;
    ListBox1: TListBox;
    Label1: TLabel;
    Button3: TButton;
    Label2: TLabel;
    SpinButton1: TSpinButton;
    SpinButton2: TSpinButton;
    SpinButton3: TSpinButton;
    SpinButton4: TSpinButton;
    Label3: TLabel;
    Label4: TLabel;
    Label5: TLabel;
    Label6: TLabel;
    Edit1: TEdit;
    Label7: TLabel;
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
    procedure Button6Click(Sender: TObject);
    procedure Button3Click(Sender: TObject);
    procedure ListBox1Click(Sender: TObject);
    procedure Edit1Change(Sender: TObject);
    procedure SpinButton1DownClick(Sender: TObject);
    procedure SpinButton1UpClick(Sender: TObject);
    procedure SpinButton2DownClick(Sender: TObject);
    procedure SpinButton2UpClick(Sender: TObject);
    procedure SpinButton3DownClick(Sender: TObject);
    procedure SpinButton3UpClick(Sender: TObject);
    procedure SpinButton4DownClick(Sender: TObject);
    procedure SpinButton4UpClick(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation
var
  W:Variant;
  WordTextBox: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);
// Загружаем в ListBox1 имена объектов коллекции 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);
// При активизации строки объекта ListBoxl, используя имя объекта,
// выделяем его из коллекции Shapes и записываем ссылку на этот объект
//в переменную WordTextBox. Затем в компонент Edit1 записываем текстовое
// содержимое этого объекта.
begin
  W.ActiveDocument.Shapes.Item(
    ListBox1.Items.Strings[ListBox1.ItemIndex]).Select;
  WordTextBox:=W.ActiveDocument.Shapes.Item(
    ListBox1.Items.Strings[ListBox1.ItemIndex]);
  Edit1.Text:=WordTextBox.TextFrame.TextRange.Text;
end;

procedure TForm1.Edit1Change(Sender: TObject);
// При активизации компонента Edit1 типа TEdit записываем введенный
//в него текст непосредственно в объект TextBox документа Word.
begin
  WordTextBox.TextFrame.TextRange.Text:=Edit1.Text;
end;

// Следующие две процедуры регулируют величину отступа левой границы
// текста от левой границы надписи.
procedure TForm1.SpinButton1DownClick(Sender: TObject);
begin
  WordTextBox.TextFrame.MarginLeft:=WordTextBox.TextFrame.MarginLeft-0.25;
end;

procedure TForm1.SpinButton1UpClick(Sender: TObject);
begin
  WordTextBox.TextFrame.MarginLeft:=WordTextBox.TextFrame.MarginLeft+0.25;
end;

// Следующие две процедуры регулируют величину отступа правой границы
// текста от правой границы надписи.
procedure TForm1.SpinButton2DownClick(Sender: TObject);
begin
  WordTextBox.TextFrame.MarginRight:=WordTextBox.TextFrame.MarginRight-0.25;
end;

procedure TForm1.SpinButton2UpClick(Sender: TObject);
begin
  WordTextBox.TextFrame.MarginRight:=WordTextBox.TextFrame.MarginRight+0.25;
end;

// Следующие две процедуры регулируют величину отступа верхней границы
// текста от верхней границы надписи.
procedure TForm1.SpinButton3DownClick(Sender: TObject);
begin
  WordTextBox.TextFrame.MarginTop:=WordTextBox.TextFrame.MarginTop-0.25;
end;

procedure TForm1.SpinButton3UpClick(Sender: TObject);
begin
  WordTextBox.TextFrame.MarginTop:=WordTextBox.TextFrame.MarginTop+0.25;
end;

// Следующие две процедуры регулируют величину отступа нижней границы
// текста от нижней границы надписи.
procedure TForm1.SpinButton4DownClick(Sender: TObject);
begin
  WordTextBox.TextFrame.MarginBottom:=WordTextBox.TextFrame.MarginBottom-0.25;
end;

procedure TForm1.SpinButton4UpClick(Sender: TObject);
begin
  WordTextBox.TextFrame.MarginBottom:=WordTextBox.TextFrame.MarginBottom+0.25;
end;

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

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


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

    Надпись, наряду с текстом и его свойствами, имеет параметры, определяющие другие ее визуальные элементы - заливку (фоновый цвет) и линию границы. Заливка определяется цветом, текстурой, рисунком или узором. Линия границы определяется толщиной, цветом, узором и стилем.

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




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