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

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

    Заливка надписи полностью определяется объектом Fill и его свойствами. Этот объект принадлежит родительскому объекту TextBox, а доступ к нему осуществляется следующим образом: WordTextBox.Fill, где WordTextBox - ссылка на объект TextBox. В самом простом случае в качестве заливки можно использовать цветовой фон, который задается комбинацией из трех констант, соответствующих цветам модели RGB (Red - красный, Green - зеленый, Blue - синий), например:

    ForeColor.RGB:=RGB(100,150,220);

    С помощью следующей процедуры можно в диалоговом режиме изменять заливку области нашей надписи.

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

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

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;
    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);
  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;

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

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

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


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

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

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;
    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);
  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;

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

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


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

    Предпоследняя процедура задает второй цвет, а последняя - стиль и направление градиента.

    В заключение приведем перечень стилей, которые мы использовали при создании приложения.

Таблица 1. Перечень стилей
Мнемоническое обозначение Константа
msoGradientHorizontal 1
msoGradientVertical 2
msoGradientDiagonalUp 3
msoGradientDiagonalDown 4
msoGradientFromCorner 5
msoGradientFromTitle 6
msoGradientFromCenter 7

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




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