На этом шаге мы рассмотрим создание и изменение параметров линии серий.
Для плоских гистограмм с накоплением есть возможность отобразить линии серий (рядов). Они представляют собой прямые, соединяющие границы областей значений соседних рядов. Если изменить тип диаграммы, приведя ее к объемному виду, то линии серий, отображавшиеся на плоской диаграмме, исчезнут. Для включения режима отображения линий серий используем свойство HasSeriesLines объекта ChartGroup, установив его в значение True. Цвет и другие свойства линий серий определяются свойством Border объекта SeriesLines. Объект SeriesLlnes в свою очередь принадлежит объекту ChartGroup. Рассмотрим следующую процедуру.
procedure TForm1.CheckBox5Click(Sender: TObject); //Отображение линий серий на диаграмме. //Прежде установите тип диаграммы в xlColumnStacked! var ChartGroup:variant; begin ChartGroup:=Chart.ChartGroups.Item(1); ChartGroup.HasSeriesLines:=CheckBox5.Checked; if CheckBox5.Checked then begin //Установить ноые параметры ChartGroup.SeriesLines.Border.ColorIndex:=32; ChartGroup.SeriesLines.Border.Weight:=4; end; end;
Первый возвращает ссылку на элемент коллекции ChartGroups. Далее устанавливаем режим отображения линий серий и настраиваем их параметры. Результат показан на рисунке 1.
Chart.ChartType:=52; //xlColumnStacked
Рис.1. Линии серий на диаграмме
Вот полный текст приложения.
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; TabSheet8: TTabSheet; Button19: TButton; Button20: TButton; TabSheet9: TTabSheet; Label41: TLabel; Label42: TLabel; Label43: TLabel; CheckBox3: TCheckBox; CheckBox4: TCheckBox; Label44: TLabel; SpinEdit16: TSpinEdit; SpinEdit17: TSpinEdit; SpinEdit18: TSpinEdit; SpinEdit19: TSpinEdit; TabSheet10: TTabSheet; Label45: TLabel; Label46: TLabel; CheckBox5: TCheckBox; 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); procedure Button19Click(Sender: TObject); procedure Button20Click(Sender: TObject); procedure SpinEdit16Change(Sender: TObject); procedure SpinEdit17Change(Sender: TObject); procedure SpinEdit18Change(Sender: TObject); procedure CheckBox3Click(Sender: TObject); procedure CheckBox4Click(Sender: TObject); procedure SpinEdit19Change(Sender: TObject); procedure CheckBox5Click(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; //==================== Формулы ============================ procedure TForm1.Button19Click(Sender: TObject); //Получение формулы var S: String; begin Series:=Chart.SeriesCollection(1); S:=Series.Formula; MessageBox(handle,pchar(S),'',0); end; procedure TForm1.Button20Click(Sender: TObject); //Изменение формулы begin Series:=Chart.SeriesCollection(2); Series.FormulaLocal:='=РЯД(;;Лист1!A2:D2;3)'; end; //=================Объемные диаграммы==================== procedure TForm1.SpinEdit16Change(Sender: TObject); //Поворот в горизонтальной плоскости begin Chart.Rotation:=SpinEdit16.Value; end; procedure TForm1.SpinEdit17Change(Sender: TObject); //Поворот в вертикальной плоскости begin Chart.Elevation:=SpinEdit17.Value; end; procedure TForm1.SpinEdit18Change(Sender: TObject); //Перспектива begin Chart.Perspective:=SpinEdit18.Value; end; procedure TForm1.CheckBox3Click(Sender: TObject); //Изомерия begin Chart.RightAngleAxes:=CheckBox3.Checked; end; procedure TForm1.CheckBox4Click(Sender: TObject); //Автомасштаб begin Chart.AutoScaling:=CheckBox4.Checked; end; procedure TForm1.SpinEdit19Change(Sender: TObject); //Высота в процентах от нормальной высоты begin Chart.HeightPercent:=SpinEdit19.Value; end; procedure TForm1.CheckBox5Click(Sender: TObject); //Отображение линий серий на диаграмме. //Прежде установите тип диаграммы в xlColumnStacked! var ChartGroup:variant; begin ChartGroup:=Chart.ChartGroups.Item(1); ChartGroup.HasSeriesLines:=CheckBox5.Checked; if CheckBox5.Checked then begin //Установить ноые параметры ChartGroup.SeriesLines.Border.ColorIndex:=32; ChartGroup.SeriesLines.Border.Weight:=4; end; end; end.
На следующем шаге мы рассмотрим линии проекции.