Шаг 181.
Автоматизация Microsoft Excel. Диаграммы в рабочей книге Excel.
Подписи данных для точек

    На этом шаге мы рассмотрим способы доступа к подписям точек.

    Подписи данных для точек ряда диаграммы также представляют собой геометрические фигуры, содержащие текст. Доступ к ним обеспечивается посредством объекта DataLabels, который принадлежит объекту Series из коллекции SeriesCollection. Их внешний вид определяется свойствами линии и заливки, а также свойствами текста. Свойства текста определяются его типом, шрифтом, способом выравнивания в рамках прямоугольной области объекта DataLabels, форматом отображения значений и углом поворота (направлением).

    Приведем полный текст приложения, иллюстрирующего использование некоторых из указанных объектов и их свойств.

unit Unit1;

interface

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

type
  TForm1 = class(TForm)
    Button1: TButton;
    Button2: TButton;
    Button3: TButton;
    Button4: TButton;
    Button5: TButton;
    ComboBox1: TComboBox;
    Label1: TLabel;
    PageControl1: TPageControl;
    TabSheet1: TTabSheet;
    Label4: TLabel;
    Label5: TLabel;
    Label6: TLabel;
    Label7: TLabel;
    Label8: TLabel;
    Button6: TButton;
    SpinEdit1: TSpinEdit;
    ScrollBar1: TScrollBar;
    ComboBox2: TComboBox;
    Button7: TButton;
    ComboBox3: TComboBox;
    Label2: TLabel;
    TabSheet2: TTabSheet;
    CheckBox1: TCheckBox;
    Label3: TLabel;
    Edit1: TEdit;
    CheckBox2: TCheckBox;
    Button8: TButton;
    Button9: TButton;
    FontDialog1: TFontDialog;
    ColorDialog1: TColorDialog;
    TabSheet3: TTabSheet;
    Label9: TLabel;
    SpinEdit2: TSpinEdit;
    Label10: TLabel;
    ComboBox4: TComboBox;
    Panel1: TPanel;
    Label11: TLabel;
    Label12: TLabel;
    SpinEdit3: TSpinEdit;
    Label13: TLabel;
    Label14: TLabel;
    SpinEdit4: TSpinEdit;
    SpinEdit5: TSpinEdit;
    SpinEdit6: TSpinEdit;
    Label15: TLabel;
    Label16: TLabel;
    Panel2: TPanel;
    Label17: TLabel;
    Label18: TLabel;
    Label19: TLabel;
    Label20: TLabel;
    Label21: TLabel;
    Label22: TLabel;
    SpinEdit7: TSpinEdit;
    SpinEdit8: TSpinEdit;
    SpinEdit9: TSpinEdit;
    SpinEdit10: TSpinEdit;
    TabSheet4: TTabSheet;
    Label23: TLabel;
    Label24: TLabel;
    ComboBox5: TComboBox;
    Label25: TLabel;
    Label26: TLabel;
    SpinEdit11: TSpinEdit;
    SpinEdit12: TSpinEdit;
    SpinEdit13: TSpinEdit;
    ListBox1: TListBox;
    Label27: TLabel;
    Button10: TButton;
    Button11: TButton;
    TabSheet5: TTabSheet;
    Button12: TButton;
    Button13: TButton;
    Label28: TLabel;
    Button14: TButton;
    Button15: TButton;
    Button16: TButton;
    TabSheet6: TTabSheet;
    ListBox2: TListBox;
    Label29: TLabel;
    Button17: TButton;
    Label30: TLabel;
    ComboBox6: TComboBox;
    Label31: TLabel;
    ComboBox7: TComboBox;
    Edit2: TEdit;
    Label32: TLabel;
    Label33: TLabel;
    ComboBox8: TComboBox;
    Label34: TLabel;
    SpinEdit14: TSpinEdit;
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
    procedure Button3Click(Sender: TObject);
    procedure Button4Click(Sender: TObject);
    procedure Button5Click(Sender: TObject);
    procedure ComboBox1Change(Sender: TObject);
    procedure Button6Click(Sender: TObject);
    procedure Button7Click(Sender: TObject);
    procedure CheckBox1Click(Sender: TObject);
    procedure CheckBox2Click(Sender: TObject);
    procedure Button8Click(Sender: TObject);
    procedure Button9Click(Sender: TObject);
    procedure SpinEdit2Change(Sender: TObject);
    procedure ComboBox4Change(Sender: TObject);
    procedure SpinEdit3Change(Sender: TObject);
    procedure SpinEdit4Change(Sender: TObject);
    procedure SpinEdit7Change(Sender: TObject);
    procedure SpinEdit8Change(Sender: TObject);
    procedure SpinEdit11Change(Sender: TObject);
    procedure ComboBox5Change(Sender: TObject);
    procedure SpinEdit12Change(Sender: TObject);
    procedure SpinEdit13Change(Sender: TObject);
    procedure Button10Click(Sender: TObject);
    procedure Button11Click(Sender: TObject);
    procedure Button12Click(Sender: TObject);
    procedure Button14Click(Sender: TObject);
    procedure Button13Click(Sender: TObject);
    procedure Button15Click(Sender: TObject);
    procedure Button16Click(Sender: TObject);
    procedure ComboBox7Change(Sender: TObject);
    procedure ComboBox8Change(Sender: TObject);
    procedure SpinEdit14Change(Sender: TObject);
    procedure Button17Click(Sender: TObject);
    procedure ListBox2Click(Sender: TObject);
    procedure ComboBox6Change(Sender: TObject);
    procedure Edit2Change(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation
var
  E:variant;
  Chart:Variant;
  Legend:Variant;
  Axis:Variant;
  Series:Variant;
  DataLabels:Variant;
const
  xlLocationAsNewSheet=1; //Размещение диаграммы на новом листе
  xlLocationAsObject=2; //Размещение диаграммы на листе с данными

{$R *.dfm}
//Функция задания шрифта заголовка диаграммы
Function  SetFontRange(c:variant;font:Tfont):boolean;
begin
  SetFontRange:=true;
  try
  c.Font.Name:=font.Name;
  if fsBold in font.Style  then c.Font.Bold:=True // Жирный
  else c.Font.Bold:=False; // Тонкий
  if fsItalic in font.Style then c.Font.Italic:=True // Наклонный
  else c.Font.Italic:=False;  // Наклонный
  c.Font.Size:=font.Size;  // Размер
  if fsStrikeOut in font.Style then c.Font.Strikethrough:=True // Перечеркнутый
  else c.Font.Strikethrough:=False;  // Перечеркнутый
  //xlUnderlineStyleSingle - Подчеркивание
  if fsUnderline in font.Style then c.Font.Underline:=2
  else c.Font.Underline:=-4142; //xlUnderlineStyleNone - Подчеркивание
  c.Font.Color:=font.Color; // Цвет
  except
  SetFontRange:=false;
  end;
end;

procedure TForm1.Button1Click(Sender: TObject);
//Создание объекта Excel и отображение окна
begin
  E:=CreateOleObject('Excel.Application');
  E.Visible:=True;
end;

procedure TForm1.Button2Click(Sender: TObject);
//Создание рабочей книги
begin
  E.WorkBooks.Add;
end;

procedure TForm1.Button3Click(Sender: TObject);
//Добавление диаграммы и получение ссылки на нее
var
  i:Integer;
const xl3DColumn=-4100;
      xlColumns=2;
begin
  Randomize;
  for i:=1 to 5 do
  begin
    E.ActiveSheet.Cells(1,i):=i*(1+Random(50));
    E.ActiveSheet.Cells(2,i):=i*(1+Random(50));
    E.ActiveSheet.Cells(3,i):=i*(1+Random(50));
    E.ActiveSheet.Cells(4,i):=i*(1+Random(50));
    E.ActiveSheet.Cells(5,i):=i*(1+Random(50));
  end;
  Chart:=E.Charts.Add;
  Legend:=Chart.Legend; //Ссылка на легенду
  Chart.ChartType:=xl3DColumn;
  Chart.SetSourceData(Source:=E.ActiveWorkbook.Sheets.Item['Лист1'].Range['A1:F5'],
     PlotBy:=xlColumns);
end;

procedure TForm1.Button4Click(Sender: TObject);
//Перемещение диаграммы на лист с данными
begin
  Chart.Location(Where:=xlLocationAsObject, Name:='Лист1');
  Chart:=E.ActiveChart;
  Legend:=Chart.Legend; //Ссылка на легенду
end;

procedure TForm1.Button5Click(Sender: TObject);
//Перемещение диаграммы на новый лист
begin
  Chart.Location(Where:=xlLocationAsNewSheet);
  Chart:=E.ActiveChart;
  Legend:=Chart.Legend; //Ссылка на легенду
end;

procedure TForm1.ComboBox1Change(Sender: TObject);
//Изменение типа диаграммы
begin
  Chart.ChartType:=ComboBox1.ItemIndex+51;
end;

procedure TForm1.Button6Click(Sender: TObject);
//Задание цвета заливки
begin
   Chart.ChartArea.Fill.ForeColor.SchemeColor:=
      SpinEdit1.Value;
end;

procedure TForm1.Button7Click(Sender: TObject);
//Одноцветная градиентная заливка
begin
 Chart.ChartArea.Fill.OneColorGradient(ComboBox2.ItemIndex+1,
     ComboBox3.ItemIndex+1, ScrollBar1.Position*0.01);
end;

procedure TForm1.CheckBox1Click(Sender: TObject);
//Показ/скрытие заголовка
begin
  if CheckBox1.State=cbUnChecked then
       Chart.HasTitle:=False
  else
    begin
       Chart.HasTitle:=True;
       Chart.ChartTitle.Text:=Edit1.Text;
    end;
end;

procedure TForm1.CheckBox2Click(Sender: TObject);
//Включение выключение тени
begin
  Chart.ChartTitle.Shadow:=CheckBox2.Checked;
end;

procedure TForm1.Button8Click(Sender: TObject);
//Задание шрифта
begin
   if FontDialog1.Execute then
     SetFontRange(Chart.ChartTitle,FontDialog1.Font);
end;

procedure TForm1.Button9Click(Sender: TObject);
//Задание цвета области Interior
begin
  if ColorDialog1.Execute then
     Chart.ChartTitle.Interior.Color:=ColorDialog1.Color
end;

procedure TForm1.SpinEdit2Change(Sender: TObject);
//Толщина линии области построения диаграммы
begin
  Chart.PlotArea.Border.Weight:=SpinEdit2.Value;
end;

procedure TForm1.ComboBox4Change(Sender: TObject);
//Устанавливаем тип линии границы ячейки
begin
 Case ComboBox4.ItemIndex Of
  0:Chart.PlotArea.Border.LineStyle:=1;    //xlContinuous
  1:Chart.PlotArea.Border.LineStyle:=-4115;//xlDash
  2:Chart.PlotArea.Border.LineStyle:=4;    //xlDashDot
  3:Chart.PlotArea.Border.LineStyle:=5;    //xlDashDotDot
  4:Chart.PlotArea.Border.LineStyle:=-4118;//xlDot
  5:Chart.PlotArea.Border.LineStyle:=-4119;//xlDouble
  6:Chart.PlotArea.Border.LineStyle:=-4142;//xlLineStyleNone
  7:Chart.PlotArea.Border.LineStyle:=13;   //xlSlantDashDot
 End;
end;

procedure TForm1.SpinEdit3Change(Sender: TObject);
//Толщина линии основания
begin
  Chart.Floor.Border.Weight:=SpinEdit3.Value;
end;

procedure TForm1.SpinEdit4Change(Sender: TObject);
//Задание цвета основания
begin
  Chart.Floor.Border.Color:=RGB(SpinEdit4.Value,
           SpinEdit5.Value,SpinEdit6.Value);
end;

procedure TForm1.SpinEdit7Change(Sender: TObject);
//Толщина линии стен
begin
  Chart.Walls.Border.Weight:=SpinEdit7.Value;
end;

procedure TForm1.SpinEdit8Change(Sender: TObject);
//Задание цвета стен
begin
  Chart.Walls.Interior.Color:=RGB(SpinEdit8.Value,
           SpinEdit9.Value,SpinEdit10.Value);
end;

procedure TForm1.SpinEdit11Change(Sender: TObject);
//Толщина линии легенды
begin
  Legend.Border.Weight:=SpinEdit11.Value;
end;

procedure TForm1.ComboBox5Change(Sender: TObject);
//Выбор вида штриховки
begin
  Legend.Fill.Patterned(ComboBox5.ItemIndex+1);
end;

procedure TForm1.SpinEdit12Change(Sender: TObject);
//Выбор цвета изображения
begin
  Legend.Fill.ForeColor.SchemeColor:=SpinEdit12.Value;
end;

procedure TForm1.SpinEdit13Change(Sender: TObject);
//Выбор цвета фона
begin
  Legend.Fill.BackColor.SchemeColor:=SpinEdit13.Value;
end;

procedure TForm1.Button10Click(Sender: TObject);
//Заполнение списка элементов легенды
var
  i: Integer;
begin
  ListBox1.Items.Clear;
  for i:=1 to Legend.LegendEntries.Count do
    ListBox1.Items.Add(IntToStr(i));
end;

procedure TForm1.Button11Click(Sender: TObject);
//Изменяем выбранный элемент
Var
  LegendEntry,LegendKey: Variant;
begin
  // Получаем ссылку на элемент легенды
  LegendEntry:=Legend.LegendEntries.item[ListBox1.ItemIndex+1];
  // Получаем ссьшку на ключ легенды
  LegendKey:= LegendEntry.LegendKey;
  // Изменяем толщину пинии.
  LegendKey.Border.Weight:=4;
  // Изменяем цвет заливки
  LegendKey.Interior.Color:=RGB(200,50,0);
  // Получаем доступ к шрифту надписи и изменяем его.
  LegendEntry.Font.Size:=16;
end;

procedure TForm1.Button12Click(Sender: TObject);
//Настройка оси значений
const
  xlValue=2;
var
  Border:variant;
begin
  Axis:=Chart.Axes.Item(xlValue); // Получаем доступ к оси значений
  Border:=Axis.Border;       // Получаем доступ к линии оси значений
  Border.Color:=RGB(200,0,0); // и настраиваем ее свойства
  Border.Weight:=4;
end;

procedure TForm1.Button13Click(Sender: TObject);
// Показываем заголовок оси значений, получаем доступ
// к нему и настраиваем его свойства
var
  AxisTitle:variant;
begin
  Axis.HasTitle:=True;
  AxisTitle:=Axis.AxisTitle;
  AxisTitle.Border.Color:=RGB(0,200,200);
  AxisTitle.Interior.Color:=RGB(200,200,0);
  AxisTitle.Caption:='Значения';
  AxisTitle.Font.Size:=24;
end;

procedure TForm1.Button14Click(Sender: TObject);
// Получаем доступ к меткам делений оси и настраиваем их свойства
// (шрифт, формат числовых меток и направление текста (угол))
var
  TickLabels:variant;
begin
  TickLabels:=Axis.TickLabels;
  TickLabels.Font.Size:=20;
  TickLabels.NumberFormat:='$0000';
  TickLabels.Orientation:=0;
end;


procedure TForm1.Button15Click(Sender: TObject);
// Получаем доступ к меткам делений оси и настраиваем их свойства
// (толщину и цвет основных линий меток)
var
  MajorGridlines:variant;
begin
  Axis.HasMajorGridlines:=True;
  Axis.HasMinorGridlines:=False;
  MajorGridlines:=Axis.MajorGridlines;
  MajorGridlines.Border.Weight:=2;
  MajorGridlines.Border.Color:=RGB(0,0,0);
end;

procedure TForm1.Button16Click(Sender: TObject);
// Показываем линии основных и промежуточных меток.
const
  xlTickMarkCross=4;
  xlTickMarkInside=2;
begin
  Axis.MajorTickMark:=xlTickMarkCross;
  Axis.MinorTickMark:=xlTickMarkInside;
end;

//================Настройка свойств подписей данных для точек ряда диаграммы

procedure TForm1.ComboBox7Change(Sender: TObject);
//Задание горизонтального выравнивания
begin
 case ComboBox1.ItemIndex of
  0: DataLabels.HorizontalAlignment:=-4108; //xlHAlignCenter
  1: DataLabels.HorizontalAlignment:=-4131; //xlHAlignLeft
  2: DataLabels.HorizontalAlignment:=-4152; //xlHAlignRight
 end;
end;

procedure TForm1.ComboBox8Change(Sender: TObject);
//Задание вертикального выравнивания
begin
 case ComboBox2.ItemIndex of
  0: DataLabels.VerticalAlignment:=-4107; //xlVAlignBottom
  1: DataLabels.VerticalAlignment:=-4108; //xlVAlignCenter
  2: DataLabels.VerticalAlignment:=-4160; //xlVAlignTop
 end;
end;

procedure TForm1.SpinEdit14Change(Sender: TObject);
// Угол (направление) текста
begin
  DataLabels.Orientation:=SpinEdit14.Value;
end;

procedure TForm1.Button17Click(Sender: TObject);
//Заполнение рядов диаграмм
var
  a: Integer;
begin
  ListBox2.Items.Clear;
  for a:=1 to Chart.SeriesCollection.Count do
    ListBox2.Items.Add(Chart.SeriesCollection.Item(a).Name{IntToStr(a)});
end;

procedure TForm1.ListBox2Click(Sender: TObject);
//Выбор ряда
begin
  Series:=Chart.SeriesCollection(ListBox2.ItemIndex+1);
  DataLabels:=Series.DataLabels;
end;

procedure TForm1.ComboBox6Change(Sender: TObject);
//Выбор типа подписи
var
  XlDataLabelsType: Integer;
begin
 case ComboBox6.ItemIndex of
  0: XlDataLabelsType:=6;    //xlDataLabelsShowBubbleSizes
  1: XlDataLabelsType:=4;    //xlDataLabelsShowLabel
  2: XlDataLabelsType:=5;    //xlDataLabelsShowLabelAndPercent
  3: XlDataLabelsType:=-4142;//xlDataLabelsShowNone
  4: XlDataLabelsType:=3;    //xlDataLabelsShowPercent
  5: XlDataLabelsType:=2;    //xlDataLabelsShowValue
 end;
  Series.ApplyDataLabels(Type:=XlDataLabelsType);
  //Выбор числового формата
  DataLabels.NumberFormat:=Edit2.Text;
end;

procedure TForm1.Edit2Change(Sender: TObject);
//Выбор числового формата для отображения значений
begin
  DataLabels.NumberFormat:=Edit2.Text;
end;

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

    Настраивая эти свойства (последние сем процедур), можно существенно изменить внешний вид диаграммы, а возможность сочетать варианты выбора позволяет представить информацию пользователю наиболее наглядно.


Рис.1. Настройка подписей

    Интересные возможности предоставляет применение формата, задаваемого строкой символов и позволяющего задать необходимый вид для числового значения. Для задания формата чисел можно использовать символы 0, #, ?, $ и т. д. (их список ограничивается только фантазией и требованиями пользователей). Формат чисел, показанных на рисунке 1, задан следующим оператором:

    DataLabels.NuinberFormat: = '$000,000000';

    В рамках выбранного типа диаграммы объект Series дает возможность изменять фигуру для точек ряда. Это осуществляется записью определенной константы в свойство BarShape объекта Series. Следующая таблица содержит полный перечень констант, которые можно использовать для задания свойства BarShape.

Таблица 1. Константы, используемые для задания значения свойства BarShape
Константа Значение
xlBox 0
xlConeToMax 5
xlConeToPoint 4
xlCylinder 3
xlPyramidToMax 2
xlPyramidToPoint 1

    На следующем шаге мы рассмотрим работу с коллекцией Points.




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