Шаг 182.
Автоматизация Microsoft Excel. Диаграммы в рабочей книге Excel.
Коллекция Points

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

    Точки ряда диаграммы объединены в коллекцию Points, свойства и методы которой обеспечивают доступ к любой точке ряда. Свойство Count этой коллекции содержит количество элементов коллекции, а метод Item(i:integer) возвращает ссылку на элемент коллекции. Чтобы не повторяться, достаточно отметить, что свойства объекта Point в большей степени идентичны свойствам объекта Series.

    Приведем пример приложения, используещего методы коллекции Points.

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;
    TabSheet7: TTabSheet;
    Label35: TLabel;
    Button18: TButton;
    ListBox3: TListBox;
    ListBox4: TListBox;
    Label36: TLabel;
    Label37: TLabel;
    ComboBox9: TComboBox;
    SpinEdit15: TSpinEdit;
    Label38: TLabel;
    Label39: TLabel;
    ComboBox10: TComboBox;
    Label40: TLabel;
    ComboBox11: TComboBox;
    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);
    procedure PageControl1Change(Sender: TObject);
    procedure Button18Click(Sender: TObject);
    procedure ListBox3Click(Sender: TObject);
    procedure ListBox4Click(Sender: TObject);
    procedure ComboBox9Change(Sender: TObject);
    procedure SpinEdit15Change(Sender: TObject);
    procedure ComboBox10Change(Sender: TObject);
    procedure ComboBox11Change(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;
  PNTS,PNT: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;

procedure TForm1.PageControl1Change(Sender: TObject);
begin

end;
//--------------- Работа с отдельными точками
procedure TForm1.Button18Click(Sender: TObject);
//Заполнение рядов диаграмм
var
  a: Integer;
begin
  ListBox3.Items.Clear;
  for a:=1 to Chart.SeriesCollection.Count do
    ListBox3.Items.Add(Chart.SeriesCollection.Item(a).Name);
end;

procedure TForm1.ListBox3Click(Sender: TObject);
//Выбор ряда и заполнение списка точек
var
  a: Integer;
begin
  Series:=Chart.SeriesCollection(ListBox3.ItemIndex+1);
  PNTS:=Series.Points;
  ListBox4.Items.Clear;
  for a:=1 to PNTS.Count do
    ListBox4.Items.Add(IntToStr(a){PNTS.Item(a).Name});
end;

procedure TForm1.ListBox4Click(Sender: TObject);
//Выбор точки
begin
  PNT:=PNTS.Item(ListBox4.ItemIndex+1);
end;

procedure TForm1.ComboBox9Change(Sender: TObject);
//Выбор типа подписи точки
var
  XlDataLabelsType: Integer;
begin
 case ComboBox9.ItemIndex of
  0: XlDataLabelsType:=6;    //xlDataLabelsShowBubbleSizes
  1: XlDataLabelsType:=4;    //xlDataLabelsShowLabel
  2: XlDataLabelsType:=-4142;//xlDataLabelsShowNone
  3: XlDataLabelsType:=2;    //xlDataLabelsShowValue
 end;
  PNT.ApplyDataLabels(Type:=XlDataLabelsType);
end;


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

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

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

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

    Последние 7 процедур демонстрируют работу с отдельными точками.

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


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

    На следующем шаге мы рассмотрим свойство Formula.




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