На этом шаге мы рассмотрим работу с выносками.
Выноска (объект Callout) является разновидностью надписи. Ее отличие заключается в том, что к прямоугольной области, где размешается текст, добавлена линия-указатель. Общими с надписью для выноски являются свойства заливки и линии для области текста, а также свойства текста. Отличие в том, что у выноски свойства линии применяются и к ломаной линии-указателю. Есть и дополнительный объект Adjustments для описания линии указателя, содержащий описание параметров линии Adjustments.Item(i), где изменяется от 1 до Adjustments.Count (общее количество точек перелом линии). Создается объект-выноска с помощью метода AddCallout(Type, Left Top, Width, Height, Anchor), где
Создадим выноску с линией-указателем, описываемой тремя точками (msoCalloutThree=3). Для этого используем следующую процедуру, записанную в Delphi. Затем изменим горизонтальную координату внешней точки линии-указателя.
procedure TForm1.Button4Click(Sender: TObject); //Создание выноски const msoCalloutThree = 3; begin W.ActiveDocument.Shapes.AddCallout(msoCalloutThree, 100,10.15,200.25,100); Callout:=W.ActiveDocument.Shapes.Item(W.ActiveDocument.Shapes.Count); Callout.Line.Visible:=-1; Callout.Line.ForeColor.RGB:=126; //Цвет линии Callout.Fill.ForeColor.RGB:=126; //Цвет заливки выноски end; //Изменение горизонтальной координаты procedure TForm1.SpinButton1DownClick(Sender: TObject); begin Callout.Adjustments.item(1):=Callout.Adjustments.item[1]-0.01; end; procedure TForm1.SpinButton1UpClick(Sender: TObject); begin Callout.Adjustments.item(1):=Callout.Adjustments.item[1]+0.01; end;
Обратите внимание, что мы добавили в процедуру создания выноски задание цвета линии и цвета заливки выноски.
Приведем полный текст приложения.
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; Button4: TButton; Label2: TLabel; SpinButton1: TSpinButton; procedure Button1Click(Sender: TObject); procedure Button2Click(Sender: TObject); procedure Button6Click(Sender: TObject); procedure Button3Click(Sender: TObject); procedure ListBox1Click(Sender: TObject); procedure Button4Click(Sender: TObject); procedure SpinButton1DownClick(Sender: TObject); procedure SpinButton1UpClick(Sender: TObject); private { Private declarations } public { Public declarations } end; var Form1: TForm1; implementation var W:Variant; WordTextBox:Variant; Callout: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.Button4Click(Sender: TObject); //Создание выноски const msoCalloutThree = 3; begin W.ActiveDocument.Shapes.AddCallout(msoCalloutThree, 100,10.15,200.25,100); Callout:=W.ActiveDocument.Shapes.Item(W.ActiveDocument.Shapes.Count); Callout.Line.Visible:=-1; Callout.Line.ForeColor.RGB:=126; //Цвет линии Callout.Fill.ForeColor.RGB:=126; //Цвет заливки выноски end; //Изменение горизонтальной координаты procedure TForm1.SpinButton1DownClick(Sender: TObject); begin Callout.Adjustments.item(1):=Callout.Adjustments.item[1]-0.01; end; procedure TForm1.SpinButton1UpClick(Sender: TObject); begin Callout.Adjustments.item(1):=Callout.Adjustments.item[1]+0.01; end; end.
Результат работы приложения изображен на рисунке 1.
Рис.1. Результат работы приложения
В заключение приведем значения параметра Type, определяющего тип выноски.
Константа | Значение |
---|---|
msoCalloutOne | 1 |
msoCalloutOne | 2 |
msoCalloutThree | 3 |
msoCalloutFour | 4 |
На следующем шаге мы рассмотрим использование линий.