Подписи данных для точек

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

   
Подписи данных для точек ряда диаграммы также представляют собой геометрические фигуры, содержащие текст.
Доступ к ним обеспечивается посредством объекта 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

КонстантаЗначение
xlBox0
xlConeToMax5
xlConeToPoint4
xlCylinder3
xlPyramidToMax2
xlPyramidToPoint1

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



Вы можете оставить комментарий, или Трекбэк с вашего сайта.

Оставить комментарий