Шаг 74.
Автоматизация Microsoft Word. Работа с объектами в документе Word. Заливка надписи (продолжение)

    На этом шаге мы продолжим рассматривать способы заливки надписи.

    Для градиентной заливки более сложной формы можно выбрать предопределенный стиль градиентной заливки из предоставленного набора. Вид такой залшзки определяется константой, задаваемой в качестве третьего аргумента метода Fill.PresetGradient (первый и второй аргументы - стиль и направление градиента). Это можно сделать с помощью последней процедуры, приведенной в данном тексте приложения:

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;
    ColorDialog1: TColorDialog;
    Button4: TButton;
    Button5: TButton;
    CheckBox1: TCheckBox;
    ComboBox1: TComboBox;
    ComboBox2: TComboBox;
    Label8: TLabel;
    Label9: TLabel;
    ComboBox3: TComboBox;
    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);
    procedure Button4Click(Sender: TObject);
    procedure Button5Click(Sender: TObject);
    procedure CheckBox1Click(Sender: TObject);
    procedure ComboBox3Change(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);
// Загружаем в 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);
// При активизации строки объекта 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;

procedure TForm1.Button4Click(Sender: TObject);
//Задание цвета области надписи
begin
  if not ColorDialog1.Execute then exit;
  WordTextBox.Fill.ForeColor.RGB:=ColorDialog1.Color;
end;

procedure TForm1.Button5Click(Sender: TObject);
//Задание второго цвета
begin
  if not ColorDialog1.Execute then exit;
  WordTextBox.Fill.BackColor.RGB:=ColorDialog1.Color;
end;

procedure TForm1.CheckBox1Click(Sender: TObject);
//Задание градиента
begin
  if CheckBox1.Checked then
    WordTextBox.Fill.TwoColorGradient(ComboBox1.ItemIndex+1,
           ComboBox2.ItemIndex+1)
  else WordTextBox.Fill.Solid;
end;

procedure TForm1.ComboBox3Change(Sender: TObject);
//Использование предопределенного градиента
begin
    WordTextBox.Fill.PresetGradient(ComboBox1.ItemIndex+1,
           ComboBox2.ItemIndex+1,ComboBox3.ItemIndex+1)
end;

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

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


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

    Приведем перечень предопределенных градиентов, которые мы использовали при создании приложения.

Таблица 1. Предопределенные градиенты
Мнемоническое обозначение Константа
msoGradientEarlySunset 1
msoGradientLateSunset 2
msoGradientNightfall 3
msoGradientDaybreak 4
msoGradientHorizon 5
msoGradientDesert 6
msoGradientOcean 7
msoGradientCalmWater 8
msoGradientFire 9
msoGradientFog 10
msoGradientMoss 11
msoGradientPeacock 12
msoGradientWheat 13
msoGradientParchment 14
msoGradientMahogany 15
msoGradientRainbow 16
msoGradientRainbowII 17
msoGradientGold 18
msoGradientGoldII 19
msoGradientBrass 20
msoGradientChrome 21
msoGradientChromeII 22
msoGradientSilver 23
msoGradientSapphire 24

    Еще один способ заливки надписи - задание текстуры. Текстура представляет собой многократно повторяемый рисунок, заполняющий прямоугольную область надписи. Рисунок текстуры определяется выбором в списке определенных числовых целочисленных констант и задается вызовом метода:

    Fill.PresetTextured (textured: integer);

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

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;
    ColorDialog1: TColorDialog;
    Button4: TButton;
    Button5: TButton;
    CheckBox1: TCheckBox;
    ComboBox1: TComboBox;
    ComboBox2: TComboBox;
    Label8: TLabel;
    Label9: TLabel;
    ComboBox3: TComboBox;
    Label10: TLabel;
    ComboBox4: TComboBox;
    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);
    procedure Button4Click(Sender: TObject);
    procedure Button5Click(Sender: TObject);
    procedure CheckBox1Click(Sender: TObject);
    procedure ComboBox3Change(Sender: TObject);
    procedure ComboBox4Change(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);
// Загружаем в 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);
// При активизации строки объекта 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;

procedure TForm1.Button4Click(Sender: TObject);
//Задание цвета области надписи
begin
  if not ColorDialog1.Execute then exit;
  WordTextBox.Fill.ForeColor.RGB:=ColorDialog1.Color;
end;

procedure TForm1.Button5Click(Sender: TObject);
//Задание второго цвета
begin
  if not ColorDialog1.Execute then exit;
  WordTextBox.Fill.BackColor.RGB:=ColorDialog1.Color;
end;

procedure TForm1.CheckBox1Click(Sender: TObject);
//Задание градиента
begin
  if CheckBox1.Checked then
    WordTextBox.Fill.TwoColorGradient(ComboBox1.ItemIndex+1,
           ComboBox2.ItemIndex+1)
  else WordTextBox.Fill.Solid;
end;

procedure TForm1.ComboBox3Change(Sender: TObject);
//Использование предопределенного градиента
begin
    WordTextBox.Fill.PresetGradient(ComboBox1.ItemIndex+1,
           ComboBox2.ItemIndex+1,ComboBox3.ItemIndex+1)
end;

procedure TForm1.ComboBox4Change(Sender: TObject);
//Использование предопределенной текстуры для заливки надписи
begin
  WordTextBox.Fill.PresetTextured(ComboBox4.ItemIndex+1);
end;

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

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


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

    Приведем перечень предопределенных текстур, которые мы использовали при создании приложения.

Таблица 2. Предопределенные текстуры
Мнемоническое обозначение Константа
msoTexturePapyrus 1
msoTextureCanvas 2
msoTextureDenim 3
msoTextureWovenMat 4
msoTextureWaterDroplets 5
msoTexturePaperBag 6
msoTextureFishFossil 7
msoTextureSand 8
msoTextureGreenMarble 9
msoTextureWhiteMarble 10
msoTextureBrownMarble 11
msoTextureGranite 12
msoTextureNewsprint 13
msoTextureRecycledPaper 14
msoTextureParchment 15
msoTextureStationery 16
msoTextureBlueTissuePaper 17
msoTexturePinkTissuePaper 18
msoTexturePurpleMesh 19
msoTextureBouquet 20
msoTextureCork 21
msoTextureWalnut 22
msoTextureOak 23
msoTextureMediumWood 24

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




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