Шаг 76.
Автоматизация Microsoft Word. Работа с объектами в документе Word. Линия границы надписи

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

    Линии границы объекта коллекции Shapes в общем и надписи (объекта TextBox) в частности могут выглядеть по-разному и определяются свойствами объекта Line, принадлежащего элементу коллекции Shapes. Граница объекта может быть невидимой, если значение свойства Visible равно 0 (WordTextBox.Line.Visible:=0). Если свойству Visible присвоить значение -1, то линия станет видимой. Наиболее часто используются свойства объекта Line, определяющие толщину и цвет линий. Если линия границы имеет толщину больше одного пикселя, то можно задать прозрачность цвета (свойство Transparency). В этом случае линия будет выглядеть как точки, между которыми есть просвет. Рассмотрим следующий исходный текст.

unit Unit1;

interface

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

type
  TForm1 = class(TForm)
    Button1: TButton;
    Button2: TButton;
    Button6: TButton;
    ListBox1: TListBox;
    Label1: TLabel;
    Button3: TButton;
    PageControl1: TPageControl;
    TabSheet1: TTabSheet;
    CheckBox1: TCheckBox;
    Button4: TButton;
    Label2: TLabel;
    Label3: TLabel;
    ColorDialog1: TColorDialog;
    SpinButton1: TSpinButton;
    SpinButton2: TSpinButton;
    Edit1: TEdit;
    Edit2: TEdit;
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
    procedure Button6Click(Sender: TObject);
    procedure Button3Click(Sender: TObject);
    procedure CheckBox1Click(Sender: TObject);
    procedure ListBox1Click(Sender: TObject);
    procedure Button4Click(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
  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);
// При активизации строки объекта ListBox1, используя имя объекта,
// выделяем его из коллекции Shapes и записываем ссылку на этот объект
//в переменную WordTextBox.
begin
  W.ActiveDocument.Shapes.Item(
    ListBox1.Items.Strings[ListBox1.ItemIndex]).Select;
  WordTextBox:=W.ActiveDocument.Shapes.Item(
    ListBox1.Items.Strings[ListBox1.ItemIndex]);
end;

procedure TForm1.CheckBox1Click(Sender: TObject);
//Включение/выключение линии
begin
  if CheckBox1.Checked then WordTextBox.Line.Visible:=-1
  else WordTextBox.Line.Visible:=0;
end;

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

procedure TForm1.SpinButton1DownClick(Sender: TObject);
//Уменньшение толщины линии
begin
  WordTextBox.Line.Weight:=WordTextBox.Line.Weight-0.25;
  Edit1.Text:=FloatToStr(WordTextBox.Line.Weight);
end;

procedure TForm1.SpinButton1UpClick(Sender: TObject);
//Увеличение толщины линии
begin
  WordTextBox.Line.Weight:=WordTextBox.Line.Weight+0.25;
  Edit1.Text:=FloatToStr(WordTextBox.Line.Weight);
end;

procedure TForm1.SpinButton2DownClick(Sender: TObject);
//Уменьшение плотности цвета
begin
  if WordTextBox.Line.Transparency<1  then
  begin
     WordTextBox.Line.Transparency:=WordTextBox.Line.Transparency+0.01;
     Edit2.Text:=FloatToStr(WordTextBox.Line.Transparency);
  end;
end;

procedure TForm1.SpinButton2UpClick(Sender: TObject);
//Увеличение плотности цвета
begin
  if WordTextBox.Line.Transparency>0  then
  begin
     WordTextBox.Line.Transparency:=WordTextBox.Line.Transparency-0.01;
     Edit2.Text:=FloatToStr(WordTextBox.Line.Transparency);
  end;
end;

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

    Процедура CheckBox1Click() задает видимость границы объекта, процедура Button4Click() определяет ее цвет, присваивая значение цвета в формате RGB свойству ForeColor.RGB. Следующие две процедуры определяют толщину линии границы, присваивая ее значение свойству WordTextBox.Line.Weight, которое имеет тип Extended. Последняе две процедуры определяют прозрачность линии и задают для свойства Line.Transparency значение от 0 до 1, имеющее тип Extended. Применяя эти процедуры, мы можем получить результат, который может быть, например, таким, как показано на рисунке 1.


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

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




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